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
November 16, 2011 at 2:36 am
Olá Danilo,
Teria alguma documentação para indicar sobre o W^X do OpenBSD ?
Ainda sobre o tema, por curiosidade este patch não acabaria empactando na performance ? ( Eu olhei o patch mas não sou tão expert para entender bem o código, mas avaliando pelo fato de que a cada nova alocação ele vai randomizar acredito que diminua a performance ??/ ( certo ) ?
Já que estou enteragindo no blog XP mais uma pergunta vou ser chato huahu XP, você está compilando o kernel com o CLANG fazendo algum benchmark contra o GCC? percebeste alguma melhora de performance ou leu algo na internet recentimente sobre este assunto ?
Agora é acompanhar a thread para averiguar sobre o que eles comentam sobre o patch
Abraços
November 17, 2011 at 11:50 am
Opa,
em relação a degradação de performance com o ASLR, com certeza existe. Considerando que normalmente nestes casos aumento de segurança significa diminuição de desempenho…
W^X do OpenBSD -> http://kerneltrap.org/node/573
Eu tenho usado um FreeBSD 9 como desktop, todo o sistema está compilado com o clang. Não notei diferença significativa no sistema como desktop. Também não vi ainda um benchmark FreeBSD GCC x FreeBSD CLANG.
O que sempre vejo é benchmark de compiladores com aplicações específicas -> http://www.phoronix.com/scan.php?page=article&item=llvm3_gcc_open64&num=1
Abraço…