/  13
 
R&D - Conviso Application Security
ASLR - Address Space Layout Randomization
Marcos´Alvares
1
3 de janeiro de 2011
Resumo
Certamente o ASLR foi um dos mecanismos de seguran¸ca mais efica-zes na conten¸ao da explos˜ao no n´umero de explora¸oes com sucesso no inicio do eculo 21. Inicialmente foi apresentado como solu¸ao geericapara problemas de
buffer overflow 
. Explora¸oes que assumiam que o apli-cativo vulner´avel seria carregado em mem´oria usando blocos de endere¸cos fixos foram invalidadas. Muito embora, pouco tempo depois ecnicas paraburlar a prote¸ao tenham surgido, o custo para constru¸ao de um
exploit 
funcional para essa categoria de vulnerabilidade aumentou significativa-mente. As tentativas de explora¸ao ficaram mais “ruidosas”, evidenciandopadr˜oes de ataques e fornecendo subs´ıdios para constru¸ao de dispositivos de detec¸ao autom´atica. Atualmente, o ASLR ´e implementado nativa- mente nos sistemas operacionais mais populares. Esse artigo tem por ob- jetivo apresentar um breve (
) hist´orico, (
ii 
) descrever o funcionamento,(
iii 
) apresentar uma an´alise qualitativa e (
iv 
) apresentar as principaisecnicas utilizadas parar contornar a prote¸ao provida.
1 Deni¸ao e Hist´orico
O ASLR ´e um mecanismo de seguran¸ca que introduz aleatoriedade no processode aloca¸ao dos segmentos de um processo em mem´oria. Esse processo ´e re- alizado toda vez que um aplicativo ´e executado e carregado em mem´oria pelosistema operacional. O ASLR foi concebido em 2000 como parte do projeto
Page EXec
(PaX)[1,2,3]. O PaX nada mais ´e que um
patch 
para o
kernel 
do
Linux 
que agrega diversas caracter´ısticas de seguran¸ca ao sistema operacional.Algumas solu¸oes com objetivos similares ao ASLR j´a existiam antes de 2000 como o
StackGuard 
,
StackShield 
e a
LibSafe
. Apenas o ASLR foi implementadoe habilitado por padr˜ao nos sistemas operacionais mais populares encontradosno mercado. Em 2005 foi adicionado oficialmente ao n´ucleo do sistema opera-cional
Linux 
em sua vers˜ao 2
.
6
.
12. A
Microsoft 
apresentou sua vers˜ao um anoap´os atrav´es do
Windows Vista 
.Devido a aleatoriedade inserida no processo de gera¸ao dos segmentos emmem´oria, para localizar endere¸cos o atacante necessita realizar uma erie detentativas (for¸ca bruta) para uma explora¸ao de uma vulnerabilidade do tipo
buffer overflow 
com sucesso. Essas tentativas s˜ao ruidosas e suscept´ıveis a seremclassificadas como tentativas de ataque. Quando implementado em conjuntocom sistemas de monitora¸ao e rea¸ao, o ASLR pode ser um mecanismo bastante eficaz para detec¸ao de tentativas de intrus˜ao. Para leitura desse artigo ´e recomend´avel conhecimentos asicos de pro-grama¸ao em
,
Assembly Intel x86 
, explora¸ao em pilha[4,5]e depura¸ao asica usando o GDB[6,7]. Apesar de todos os exemplos exibidos nesse artigo
1
malvares@conviso.com.br
1
 
serem constru´ıdos usando o sistema operacional
GNU Linux 
, a teoria elabo-rada ´e aplic´avel a qualquer implementa¸ao de ASLR encontrada nos sistemas operacionais modernos.
2 Contextualiza¸c˜ao Te´orica
Nos sistemas operacionais modernos cada processo possui um espa¸co de en-dere¸camento privado, isolado e dividido em segmentos com fins espec´ıficos. Doponto de vista do processo ´e como se esse tivesse todos os recursos f´ısicos dis-pon´ıveis para uso exclusivo. A mem´oria b´asica ou vol´atil (RAM) ´e um desses recursos. Quando o usu´ario solicita a execu¸ao de um determinado aplicativo, um espa¸co de endere¸camento virtual ´e reservado e o seu bin´ario ´e carregado nesse espa¸co. O espco de endere¸camento ´e segmentado de acordo com o tipo dos dados armazenados em cada segmento. Os principais segmentos de umprocesso em mem´oria s˜ao:
Dados
: segmento onde est˜ao contidas as vari´aveis est´aticas e globais;
odigo
: possui o c´odigo de m´aquina do processo executado;
Pilha
: armazena vari´aveis locais e referˆencias para controle de fluxo;
Heap 
: regi˜ao que armazena as vari´aveis alocadas dinˆamicamente;
Bibliotecas compartilhadas
: mapas de biliotecas ligadas dinˆamicamente.O odigo1mostra o espa¸co de endere¸camento e os principais segmentos do processo “
cat 
”. Nota-se que o “cat” ´e um bin´ario ligado dinˆamicamente a outrasbilbliotecas atrav´es do
ld-2.11.1.so
” (linha 6). Atrav´es do
ld
bibliotecas podemser acopladas ao processo em tempo de execu¸ao como a biblioteca mostradana linha 9. O segmento de c´odigo, onde o execut´avel ´e carregado, ´e encontradona linha 7. Note que esse segmento tem permiss˜ao de leitura e execu¸ao mas ao de escrita. Esse mecˆanismo impede que ap´os o carregamento do bin´ario em mem´oria seja poss´ıvel a inje¸ao de conte´udo nesse segmento (l´ıcito ou n˜ao). Por fim, observa-se a os segmentos de pilha e
heap
nas linhas 12 e 8 respectivamente.
1
mabj@Jarvis:~$ cat /proc/self/maps
2
00652000-00653000 r-xp 00000000 00:00 0 [vdso]
3
00695000-007e8000 r-xp 00000000 08:05 1077606 /lib/tls/i686/cmov/libc-2.11.1.so
4
007e8000-007e9000 ---p 00153000 08:05 1077606 /lib/tls/i686/cmov/libc-2.11.1.so
5
007ec000-007ef000 rw-p 00000000 00:00 0
6
00de3000-00dfe000 r-xp 00000000 08:05 918023 /lib/ld-2.11.1.so
7
08048000-08054000 r-xp 00000000 08:05 557808 /bin/cat
8
09f55000-09f76000 rw-p 00000000 00:00 0 [heap]
9
b75ff000-b763e000 r--p 00000000 08:05 269665 /usr/lib/locale/en_US.utf8/LC_CTYPE
10
...
11
b7772000-b7774000 rw-p 00000000 00:00 0
12
bfb54000-bfb69000 rw-p 00000000 00:00 0 [stack]
odigo 1:
Espa¸co de endera¸camento correspodente ao processo “cat”.
O componente do sistema operacional respons´avel por carregar o execut´avelem mem´oria ´e o
loader 
. O
loader 
recebe o arquivo bin´ario
COFF 
(
Commom Object File Format 
), cria os segmentos mostrados e configura suas respectivaspermiss˜oes. O tamanho e as permiss˜oes de um determinado segmento podemser alterados em tempo de execu¸ao. Um exemplo de cria¸ao de um segmento em mem´oria usando o
mmap
pode ser observado no C´odigo2.2
 
12
#define FILEPATH "./example.txt"
3
#define NUMCHARS sizeof("marcos alvares")
4
#define FILESIZE (NUMCHARS * sizeof(int))
56
int main()
{
7
int fd; char *map;
89
fd = open(FILEPATH, O_RDWR);
1011
map = mmap(NULL, FILESIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
1213
map[NUMCHARS - 1] =
\
0’;
14
printf("[%s]
\
n", map);
1516
printf("PID do PROCESSO: [%d]
\
n
\
n", getpid());
17
sleep(20000);
18
...
19
return 0;
20
}
odigo 2:
Cria¸ao de segmento em mem´oria para leitura e escrita com o conte´udo de um arquivo em disco.
Na linha 9 um
filehandler 
para o arquivo “
example.txt 
´e criado e seuconte´udo ´e mapeado em mem´oria usando a fun¸ao
mmap()
na linha 11. Aspermiss˜oes do segmento s˜ao passadas por parˆametro para a fun¸ao
mmap()
:
PROT READ
|
PROT WRITE 
” (leitura e escrita). Isso significa que nenhumconte´udo inserido nesse segmento poder´a ser executado. Caso ocorra uma ten-tativa de execu¸ao de conte´udo o sistema operacional enviar´a um sinal de falha de segmenta¸ao (
SEGFAULT 
) para o processo. A
string 
marcos alvares
” (queest´a contida no arquivo) ´e impressa na sa´ıda padr˜ao. Nas linhas 16 e 17 ´eimpresso o PID na sa´ıda padr˜ao e um
sleep()
´e realizado para que possamosobservar o mapa do processo em mem´oria (C´odigo3).
1
mabj@Jarvis:~/aslr/doc/examples$ ./example &
2
[marcos alvares]
3
PID do PROCESSO: [3132]
45
mabj@Jarvis:~/aslr/doc/examples$ cat /proc/3132/maps
6
0011e000-0011f000 r-xp 00000000 00:00 0 [vdso]
7
0011f000-00272000 r-xp 00000000 08:05 1077606 /lib/tls/i686/cmov/libc-2.11.1.so
8
00276000-00279000 rw-p 00000000 00:00 0
9
00a1f000-00a3a000 r-xp 00000000 08:05 918023 /lib/ld-2.11.1.so
10
08048000-08049000 r-xp 00000000 08:06 397551 /home/mabj/aslr/doc/examples/example
11
b7816000-b7817000 rw-p 00000000 00:00 0
12
b7817000-b7818000 rw-s 00000000 08:06 397845 /home/mabj/aslr/doc/examples/example.txt
13
b7818000-b781a000 rw-p 00000000 00:00 0
14
bf886000-bf89b000 rw-p 00000000 00:00 0 [stack]
15
odigo 3:
Mapa do processo criado pelo aplicativo mostrado no C´odigo2.
Na linha 20 o arquivo “
example.txt 
” foi mapeado no espa¸co de endere¸camentodo processo “
example
”. O mapa criado possui permiss˜ao para leitura e escrita(“
rw-s
”). Na coluna a esqueda do mapa do processo encontramos o endere¸code cada segmento. Por exemplo, o nosso segmento com o arquivo “
example.txt 
est´a mapeado do endere¸co 0x
b
7817000 at´e o 0x
b
7818000 que corresponde aotamanho m´ınimo de um segmento mapeado que ´e 4
KB 
.Para exemplificar o funcionamento do ASLR vamos executar o processo duasvezes com o mecanismo desabilitado e duas vezes com o mecanismo habilitado.Sem o ASLR os segmentos do processo ser˜ao mapeados sempre na mesma faixade endere¸cos. No C´odigo4,podemos observar o mapa gerado atrav´es de duas execu¸oes da aplica¸ao sem o ASLR. Nas linhas marcadas de vermelho podemos observar que nas duas execu¸oes o aplicativo foi mapeado em mem´oria com os mesmos endere¸cos.3

Share & Embed

More from this user

Add a Comment

Characters: ...