Revista Digital GRIS Edição Abril de 2008 - Sobre o GRIS - UFRJ
Revista Digital GRIS Edição Abril de 2008 - Sobre o GRIS - UFRJ
Revista Digital GRIS Edição Abril de 2008 - Sobre o GRIS - UFRJ
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
GCC 4.3.0 expõe problema no kernel do Linux<br />
Alterações no Compilador tornam sistema vulnerável<br />
Uma alteração no código da ultima versão do GCC, 4.3.0, junto com um problema no kernel<br />
criou uma estranha situação, que po<strong>de</strong> trazer problemas <strong>de</strong> segurança. O GCC alterou algumas<br />
<strong>de</strong>finições em relação as flags dos processadores da arquitetura Intel x86, para entrar em<br />
conformida<strong>de</strong> com os padrões ABI.<br />
Entre estas mudanças, uma <strong>de</strong>las em relação a flag <strong>de</strong> direção, que <strong>de</strong>termina em qual<br />
direção as operações <strong>de</strong> memória são realizadas. Segundo os padrões da ABI, esta flag <strong>de</strong>veria<br />
sempre estar "resetada" no ponto <strong>de</strong> entrada <strong>de</strong> todas as funções. Ao contrario do manipulador <strong>de</strong><br />
sinais do Linux que são chamados, incorretamente, com a flag em qualquer estado (setada ou não)<br />
que estava no momento em que o sinal ocorreu.<br />
Antes da versão 4.3, o GCC iria emitir um sinal cld (clear direction) ao processador sempre<br />
antes <strong>de</strong> executar alguma operação <strong>de</strong> memoria. Na versão 4.3, para seguir os padrões ABI, o GCC<br />
presume que o kernel <strong>de</strong>finirá a flag <strong>de</strong> direção <strong>de</strong> acordo com suas necessida<strong>de</strong>s, ao chamar o<br />
manipulador <strong>de</strong> sinais. Porém como isso não ocorre, a memória po<strong>de</strong> ser escrita na direção reversa<br />
ao que se esperava.<br />
Uma possível seqüência <strong>de</strong> eventos que po<strong>de</strong> disparar a falha:<br />
• Um programa em userspace realiza uma operação em memória (memmove(), por exemplo ),<br />
ativa a flag <strong>de</strong> direção.<br />
• Um sinal é disparado a partir <strong>de</strong> outro processo.<br />
• O kernel chama o manipulador <strong>de</strong> sinais.<br />
• O manipulador <strong>de</strong> sinais realiza um memmove() pensando estar escrevendo em uma direção.<br />
• A memória quando copiada, é escrita na direção reversa.<br />
É difícil <strong>de</strong>terminar o quanto uma brecha <strong>de</strong> segurança po<strong>de</strong> ser obtida a partir <strong>de</strong>sta falha,<br />
mas seria um erro assumir que não é possível. Outros bugs no kernel, como o recente do vmsplice(),<br />
que levou a uma grave falha <strong>de</strong> segurança, pareciam apenas <strong>de</strong> corrupção <strong>de</strong> memória, mas foi<br />
observado <strong>de</strong>pois que era possível muito mais do que isso.<br />
A versão 2.6.24.4, lançada no dia 24 <strong>de</strong> Março, contem a correção para este problema.<br />
Fonte: http://lwn.net/Articles/272048/