Race condition - vulnerabilidades em suids
Neste simples artigo vou tentar passar o conceito básico de race condition, a condição de corrida com arquivos temporários e "leaks" da memória de SUIDs. Vamos ver como obter privilégios explorando estes suids e como se proteger deles.
O que são os race conditions
O race condition acontece quando temos vários processos do sistema
acessando e manipulando ao mesmo tempo a mesma informação de maneira
concorrente e o resultado da execução depende da ordem particular em que o
acesso ocorre.
O race condition é muito interessante para invasores que querem elevar seu nível dentro de um sistema comprometido (obter uid=0(root)).
Vamos ver um pequeno pedaço de código em C que ilustra um race condition:
O race condition é muito interessante para invasores que querem elevar seu nível dentro de um sistema comprometido (obter uid=0(root)).
Vamos ver um pequeno pedaço de código em C que ilustra um race condition:
if(access("/tmp/arquivo-info",R_OK)==0) {
fd=open("/tmp/arquivo-info");
process(fd);
close(fd);
}
fd=open("/tmp/arquivo-info");
process(fd);
close(fd);
}
O código acima cria o arquivo temporário "arquivo-info" e depois abre ele. A vulnerabilidade em potencial ocorre entre as chamadas das funções access() e a chamada open().
Se um atacante consegue manipular o conteúdo do "arquivo.info" entre as funções access() e open(), ele pode muito bem manipular qual vai ser a ação que o programa que utiliza esse arquivo vai realizar, isso e o que chamamos de "Race".
O race condition não é um ataque trivial de ser realizado porque necessita de muitas tentativas até que o atacante consiga algum retorno efetivamente útil. Porém, se conseguir que o programa suid que utiliza esse arquivo no /tmp execute (access()) em sua instrução, sua chance de obter uid=0 será grande.
O uso inapropriado de funções como access(), chown(), chgrp(), chmod(), mktemp(), tempnam(), tmpfile(), e tmpnam() são as principais causas de races conditions.
Valeu!!!