15.04.2013 Views

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

SHOW MORE
SHOW LESS

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/

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!