Hoje na lista freebsd-current [1] um cara chamado Oliver Pinter enviou um patch [2] que adiciona ao FreeBSD uma funcionalidade do ASLR (Address Space Layout Randomization). Este patch permite que o sistema possa deixar os endereços da pilha dos programas aleatório. A vantagem é que em um ataque que explora estouros de buffer, embora o atacante até consiga injetar código arbitrário na pilha, é improvável que o salto para o código seja acertado.
Apliquei o patch em um FreeBSD 9.0-PRERELEASE 64 bits (atualizado hoje 15/11/11), funcionou (quase) perfeitamente. Através da MIB sysctl kern.stackgap_random é possível definir quanto do endereço será “randomizado”, o padrão é 16 bits (65536), eu deixei 24 bits nos testes (16777216). Segue os resultados (com um pequeno código em C):
#include <stdio.h>
int main()
{
int a;
char nome[100];
printf("%p\n", &a);
printf("%p\n", nome);
return(0);
}
estacao# ./a.out
0x7fffffb70f4c
0x7fffffb70ee0
estacao# ./a.out
0x7fffff78cbac
0x7fffff78cb40
estacao# ./a.out
0x7fffffeaf15c
0x7fffffeaf0f0
estacao# ./a.out
0x7fffff46576c
0x7fffff465700
E para não dizerem que não falei dos problemas, em certos momentos recebi a seguinte mensagem, talvez por ter aumentado a quantidade de bits aleatorizados, ao tentar abrir o VIM:
estacao# vim test.c
Fatal error 'Cannot allocate red zone for initial thread' at line 388 in file /usr/src/lib/libthr/thread/thr_init.c (errno = 12)
Abort (core dumped)
Embora não seja perfeito, este patch (que existe desde 2005 também) deveria servir de incentivo para o desenvolvedores dedicarem algum tempo nestes recursos de segurança (ASLR e W^X) que já existem no Linux, NetBSD e Windows. O W^X, também conhecido como exec-shield no Linux e responsável por não permitir a execução de código na pilha, existe no OpenBSD.
[1] – http://lists.freebsd.org/pipermail/freebsd-current/2011-November/029279.html
[2] – http://dl.dropbox.com/u/23276705/randomize-stack-and-mmap.txt