PaX: Solução eficiente para segurança em Linux

O PaX é um patch para kernel que vem para acrescentar dezenas de melhorias ao sistema operacional no que diz respeito segurança. Veremos quais as principais caracteristicas deste fantástico sistema, como ele atua, suas principais features e mostraremos alguns testes realizados mostrando sua eficácia em proteger o buffer do nosso box Linux. Enjoy!

[ Hits: 67.013 ]

Por: Anderson L Tamborim em 05/06/2004 | Blog: http://y2h4ck.wordpress.com


Principais características do PaX



O mais interessante do projeto PaX é a pesquisa de vários mecanismos para proteger o sistema de explorações que dêem ao atacante privilégios para ler/escrever em determinados segmentos da memória do address space.

Essas classes de falhas são as mais exploradas por atacantes que visam elevar seu nível de atuação frente ao sistema, obtendo privilégios de root (uid=0), portanto o PaX vai ajudar e muito na prevenção de tais explorações, impedindo assim execuções arbitrárias de códigos para alocação de memória não permitida no sistema.

Estamos frisando aqui que o que iremos fazer não é analisar e corrigir bugs no sistema, mas sim torná-los o menos acessíveis possível. O PaX para isso utiliza três níveis distintos para determinadas técnicas de exploração:
  1. Introdução e execução de códigos arbitrários.
  2. Execução de códigos fora da ordem original do programa.
  3. Execução de códigos dentro da ordem original do programa usando dados arbitrários.

Isso já seria suficiente para que um shellcode conhecido (1) fosse impedido de rodar em uma tentativa de ataque de return-into-libc (2), o que já seria uma grande implementação, pois a técnica de retlibc e uma das mais avançadas em questão de overflows.

Uma das principais modificações que o PaX irá causar em nosso sistema como poderíamos ver é a randomização do nosso buffer de saída, o return address.

Poderíamos verificar isso com um simples script que nos retorne o valor do buffer:

/* -------teste-mmap---------- */

#include <stdio.h>
int main(void) {
   char buffer[512];
   fprintf(stdout,"%p\n",&buffer);
   return 1;
}

$ cc teste_mmap.c -o teste_mmap
$ ./teste_mmap

0xbfff61ec
$ ./teste_mmap
0xbff9073c
$ ./teste_mmap
0xbffe7f6c
$ ./teste_mmap
0xbff9b85c

Se você quiser fazer o teste, verá que se rodar teste script em um kernel sem o PaX implementado, ele retornará sempre o mesmo valor para o buffer.

Em que isso me ajudará, bom se você conhece técnicas como Stack ou Heap overflow sabe que para conseguir sobrescrever o return address você deve saber seu endereço na memória que este aloca, portanto com um debug no programa alvo você conseguiria o break point dele. Com o PaX implementado esse endereço se tornará arbitrário e apenas o próprio programa que alocou a memória (com as devidas permissões que podem ser setadas pelo PaX) poderá controlar seu fluxo de execução.

Mais à frente no capítulo "Testes" demonstrarei como o PaX reage a determinadas tentativas de exploração.

Um pouco sobre as principais funções do PaX


Vamos tratar das principais funções que o PaX utiliza para proteger nosso sistema:
  • RandStack
  • Randmmap
  • Randexec


[+] Non-Executable Pages


O NONEXEC tem sua principal vantagem em prevenir a inserção e execução de códigos no address space do sistema, tornando assim qualquer tipo de técnica de exploração que use essa metodologia ineficaz.

Existem dois meios de se introduzir um código arbitrário e um address space: um executável para mapeamento ou modificando um executável com permissão de escrita/execução para mapeamento.
  • O primeiro método não é segurado pelo PaX porque existem muitos métodos de controle para esse tipo de acesso.
  • O segundo método pode ser prevenido se for controlado a criação de executáveis de mapeamento com permissão para escrita/execução que executem alguma outra chamada system() diretamente em nosso sistema.

Com isso estaremos eliminando muitas possibilidades de comprometimento.

O último ponto que podemos analisar sobre o NONEXEC é que ele trava o acesso a memória semântica do sistema. Assim ele proíbe qualquer programa não autorizado de alocar memória para rodar em seu sistema. Iremos fazer alguns testes mostrando como ele pode coibir a ação de um exploit para explorar um Stack Overflow.

[+] RandStack


A função do Randstack e introduzir a randomização na kernel para os endereços de returno das Stacks.

O Linux libera em geral duas pages do kernel stack para cada chamada realizada. Esses stacks são utilizados sempre que as chamadas vão para o kernel (system call, device interrupt, CPU exception entre outros).

Todo caso quando a stack volta para o user space ela tem um valor de retorno, o conhecido ESP (Executable Stack Pointer). No caso esse seria o ponto que deve ser sobrescrito para que uma determinada função seja introduzida no fluxo de um determinado programa. A randomização faz com que esse ponto não consiga ser calculado com exatidão deixando o stack de maneira assíncrona.

[+] Randmmap


O principal atrativo do RANDMMAP é a introdução de randomização em regiões de memória utilizadas pelas interfaces mmap() do kernel. Isso inclui também todos os arquivos e mapeamentos anônimos do sistema, tais como os principais executáveis, libraries, que tem seu heap gerenciado por funções como brk() e mmap().

Você pode encontrar muito mais na integra de todas as funções do PaX diretamente no endereço:

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Principais características do PaX
   3. Adicionando o PaX ao nosso sistema
   4. PaX: prova de fogo
   5. Utilizando o paxtest
   6. Considerações finais
Outros artigos deste autor

Libsafe: Protegendo Linux contra Smashing Overflow

Segurança extrema com LIDS: novos recursos

Race condition - vulnerabilidades em suids

Security Hacks: Linux & BSD

Análise Passiva: Analisando seu tráfego de maneira segura

Leitura recomendada

Aspecto de segurança para uma arquitetura web

Wmap web scanner

John The Ripper - Teste de Quebra de Senhas

PuTTY - Estabelecendo Chave Secreta com OpenSSH

Uma introdução ao Linux-PAM

  
Comentários
[1] Comentário enviado por cvs em 05/06/2004 - 09:47h

essas ultimas versoes do grsecurity ja estao com o PaX integradas, se bem que o grsecutiry esta com os dias contados por falta de patrocinio.

[2] Comentário enviado por removido em 05/06/2004 - 19:27h

Meus parabens, vc tem um conhecimento sobre GNU/Linux em materia de seguranca impar, e bom ter um
perito como vc no nosso grupo

[3] Comentário enviado por ryu em 05/06/2004 - 22:37h

y2h4ck continue escrevendo mais artigos pq os seus detonam

[4] Comentário enviado por naoexistemais em 06/06/2004 - 20:24h

Caro Anderson,

Continue assim pq os invejos estão doidos..rsrsrsrs

Parabens..

[5] Comentário enviado por fcc em 07/06/2004 - 09:13h

Meus parabens...otimo artigo...continue sempre assim q vc vai longe...


[ ]'s

[6] Comentário enviado por cvs em 07/06/2004 - 09:15h

cara, esse wrochal tem problemas mentais... só pode... que isso... heheheeh

[7] Comentário enviado por agk em 07/06/2004 - 09:41h

Parabéns, muito bom o artigo.

[8] Comentário enviado por andreguerra em 07/06/2004 - 10:21h

Amigo y2h4ck,

Muito bom seu artigo, realmente é o tipo da informação dificil de encontrar, principalmente no nível e com a objetividade que vc escreve.

Parabéns,

André

[9] Comentário enviado por y2h4ck em 07/06/2004 - 18:36h

Bom o Servidor onde o Pax esta hospedado (grsecurity) parece que esta fora do ar por tempo indeterminado.
Todo caso estou disponibilizando uma copia do Patch e do Chpax
que sao necessarios para completar a instalacao:

http://rootsec.ath.cx/~spawn/pax.tar.gz

=]
Enjoy

[]s a todos


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts