NPTL, Exec-Shield e outros palavrões que fazem seus programas crasharem

NPTL

NPTL, também conhecido como Native POSIX Thread Library, é o novo sistema de threading do kernel 2.6. O NPTL promete melhor compatibilidade com o padrão POSIX, maior escalabilidade e maior desempenho na criação e destruição de threads, colocando o Linux em pé de igualdade com os Unix comerciais em termos de alto desempenho (e custando muuuuuuuuito menos! 🙂 Para os chegados em tecnicalidades ou estudiosos de sistemas operacionais, vale a leitura do paper descritivo da biblioteca em:

A RedHat vem implementando um backport do NPTL para os seus kernels 2.4 desde o RedHat 9 e o kernel do Fedora Core 1 tem o mesmo patch.

Só que alguns programas podem crashar alegremente, deixando você com um segfault na mão e uma cara de tacho. Exemplos clássicos são o IBM JRE e o Sun JVM (antes do 1.4.1, bem, você deveria estar utilizando o 1.4.2 mesmo…). Neste caso, LD_ASSUME_KERNEL é seu amigo.

LD_ASSUME_KERNEL é uma variável de ambiente que diz ao kernel para utilizar o velho LinuxThreads em vez do NPTL, com isso deixando o programa problemático mais feliz. Pode assumir os valores 2.2.5, 2.4.1 ou 2.4.19 (ou seja, emulação do comportamento de kernels específicos). Uma boa política é utilizar um alias do shell para o programa crashento, por exemplo:

alias programa_crashento=”LD_ASSUME_KERNEL=2.4.1 programa_crashento”
Exec-Shield

Exec-Shield é uma nova feature de segurança, disponível para kernels 2.4 e 2.6; os patches para o kernel 2.4 e 2.6 estão em:

O patch marca largos pedaços do código de um programa, incluindo aí o stack, não executáveis. Com isso, ele cumpre dois papéis:

  1. Protege contra toda a maléfica família Overflow: stack, buffer e function pointer (ponteiro de função). De quebra, acaba com uma das críticas do pessoal de BSD contra o Linux, a facilidade de crashar um kernel com buffer overflows 😀
  2. Torna aleatório o ponto na VM onde o binário é carregado, com isso torna mais difícil a vida dos exploits que tentam acessar código ou dados para fins de ataque.

Mas como nem tudo na vida é perfeito, alguns programas não querem nem saber e saem crashando. E agora? O problema pode ser resolvido de diversas formas:

1) Você pode desabilitar o Exec-Shield apenas para o programa infrator, utilizando o programa ‘setarch’. Utilizando a técnica do alias:

alias programa_crashento=”setarch i386 programa_crashento”
2) Desabilitando o Exec-Shield, temporariamente ou direto.2.1) Desabilitando temporariamente:
O arquivo /proc/sys/kernel/exec-shield controla o comportamento do Exec-Shield. Quando está em 0, o Exec-Shield é desabilitando. Então, como root, digite:# cat 0 > /proc/sys/kernel/exec-shield

para desabilitar a partir do momento da digitação.

2.2) Desabilitando em tempo de boot:
Você pode utilizar o parâmetro de kernel exec-shield (exec-shield=0) ou então colocar kernel.exec-shield=0 em /etc/sysctl.conf. Reboote após as alterações, e o Exec-Shield será desabilitado.

Palavras finais

Além dos sites citados, o RELEASE-NOTES do Fedora Core 1 também é uma excelente ajuda:

Para os interessados nos caminhos do kernel, www.kerneltrap.org é bookmark obrigatório. Tem matérias interessantes sobre NPTL e Exec-Shield por lá.

Você pode precisar, de repente, de utilizar mais de uma técnica contra programas repetidamente infratores.

Divirtam-se!

Rolar para cima