A biblioteca CGI do Ruby (cgi.rb) tem um bug que permite qualquer um na Internet enviar uma única requisição HTTP para qualquer programa Ruby (não somente Mongrel) que utiliza parsing multipart com cgi.rb com um corpo MIME mal formado, causando o processo Ruby a atingir 99% de utilização da CPU em um loop infinito, matando-o.
O que acontece é que o final do limitador MIME às vezes é:
Em vez de:
E isso faz o cgi.rb entrar num loop infinito esperando por input que nunca chega. Isso é causado por qualquer sistema que lê diretamente do input stream que retorna "" em vez de EOF.
Quem é afetado
Atualmente, os seguintes servidores são afetados:
- Mongrel – lê diretamente do socket e receber "" em vez de EOF
- Litespeed – afetado mas tem um timeout interno que corta o processo
- CGI Standalone – impactado porque também lê de um input stream normal
Parece que o FCGInputStream de FCGI, WEBrick e mod_ruby não são vulneráveis porque ou eles lêem de um domain socket ou não usam cgi.rb normal.
A Correção
Qualquer um usando Mongrel pode pegar a correção IMEDIATAMENTE instalando a última versão de pré-lançamento 0.3.14:
—source=https://mongrel.rubyforge.org/releases
O pessoal de Win32 (Windows) e qualquer um que não possa realizar a atualização desse jeito pode tentar deste outro jeito:
gem install cgi_multipart_eof_fix --source=https://mongrel.rubyforge.org/releases
- Editar o environment.rb e acrescentar:
require 'cgi_multipart_eof_fix'
- Reiniciar seus servidores
O e-mail de Zed Shaw tem mais informações e canais de comunicação como o canal #rubyonrails, #rails-security e #ruby-lang no irb.freenode.org.
Zed ainda tem um patch anexado no e-mail original desse anúncio. Estudem sobre esse bug e apliquem as correções.