FreeBSD com endereços de pilha aleatórios

November 16, 2011

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

Advertisement

2 Responses to “FreeBSD com endereços de pilha aleatórios”

  1. demoncyber Says:

    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


  2. 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…


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.