Security

Importante: ua-parser-js exploit e Kotlin/JS

Read this post in other languages:

No dia 22 de outubro, às 17h06 (CEST), uma mensagem foi postada no canal #javascript do Kotlin Slack sobre um possível problema de segurança, momento no qual iniciamos nossas investigações. No dia 23 de outubro, foi relatado que um malware foi encontrado em um pacote npm muito popular chamado ua-parser-js. O pacote havia sido comprometido, ocasionando na instalação de um ladrão de senhas e minerador de criptomoedas em máquinas-alvo. 

Kotlin Multiplatforma (com o target JS) e Kotlin/JS utilizam um framework de testes muito popular chamado Karma. Este framework, por sua vez, tem uma dependência do pacote afetado (ua-parser-js). Além disso, muitos desenvolvedores que utilizarm o target JavaScript, também utilizam o Karma (assim como fazemos na equipe Kotlin) como sua estrutura de testes. 

Dessa forma, achamos importante que você esteja ciente da situação e do que você pode fazer para verificar se você foi afetado e como resolver o problema. 

Como sei se fui afetado?

Se você está usando direta ou indiretamente as versões ua-parser-js 0.7.29, 0.8.0 e 1.0.0, você pode considerar o seu sistema comprometido. Indenpendentemente se você está ou não fazendo testes. Uma vez instalada a dependência, os scripts de inicialização são executados automaticamente (a menos que você execute npm com a opção --ignore-scripts ou globalmente tenha a opção set ignore-scripts true). 

Como sei se tenho este pacote no meu sistema?

Existem várias maneiras de saber se um pacote específico está instalado (local ou globalmente) em seu sistema, incluindo:

  • Usando o comando npm list e filtrando a saída para ua-parser-js 
  • Usando o pacote npm-check para verificar dependências

Uma maneira mais segura é verificar o ‘ua-parser-js’ específico em seu sistema executando o seguinte comando

No macOS/Linux 

grep -r --include=\package.json '"_id": "ua-parser-js' {x}

No Windows (usando Powershell)

Get-ChildItem -Path '{x}' -Recurse -include "package.json" -ErrorAction SilentlyContinue | Select-String -pattern '"_id": "ua-parser-js'

Onde {x} é a pasta raiz em que você deseja iniciar a pesquisa. Isso irá exibir todos os diretórios contendo o arquivo package.json que utiliza o pacote. É claro que você pode procurar as versões afetadas específicas em vez de todas as versões, se quiser. 

É importante verificar não apenas o seu ambiente de desenvolvimento, mas também o seu ambiente de build ou qualquer outro lugar que você acha que este pacote pode ter sido instalado (direta ou indiretamente). 

Verifique também as seguintes entradas durante a instalação de seus pacotes npm (o que pode ser, por exemplo, ao usar karma):

ua-parser-js@0.7.29: this package has been hijacked
ua-parser-js@0.8.0: this package has been hijacked
ua-parser-js@1.0.0: this package has been hijacked

Como eu resolvo o problema?

Atualize para uma versão que não seja afetada pelo problema. As seguintes atualizações foram lançadas: 0.7.30, 0.8.1 e 1.0.1. Certifique-se de remover quaisquer pacotes afetados e rotacione quaisquer credenciais que possam ter sido comprometidas. 

Isso é suficiente para remover/atualizar o pacote?

Dado que o pacote foi comprometido não apenas para executar mineração de cripto, mas também roubar credenciais, seria recomendável alterar quaisquer credenciais potenciais que possam ter sido comprometidas. 

Também é recomendado verificar se você tem algum binário chamado jsextension ou jsextention.exe em execução, como listados nos comentários da issue original em execução em seu sistema.

Estou infectado mesmo que não tenha feito nada que use este pacote?

É seguro assumir que, se o pacote for instalado, o sistema está comprometido, algo que o GitHub Advisory também salienta.

Havia alguma janela de tempo para este ataque?

Ao que tudo indica, o ataque poderia ter ocorrido (ou seja, a partir do momento em que o pacote comprometido foi atualizado até o momento em que foi detectado) entre 22 de outubro de 2021 às 14:15 CEST e 22 de outubro de 2021 18:23 CEST. Em outras palavras, se nenhum de seus pacotes atualizou suas dependências neste curto período de tempo, então provavelmente você não tem a versão afetada e, consequentemente, provavelmente não foi impactado. 

Kotlin foi afetado?

Como mencionado acima, o Kotlin Multiplatform (utilizando o target JS) e a versão 1.5.0 e mais recentes do Kotlin/JS usam uma dependência transitiva do pacote afetado. Se você executou testes do karma pela primeira vez entre 22 de outubro de 2021 às 14:15 CEST e 22 de outubro de 2021 18:23 CEST, então você provavelmente foi afetado. 

Como posso evitar que isso aconteça no futuro?

Uma recomendação é usar arquivos lock para suas dependências (package-lock.json, yarn.lock, etc) que bloqueiam versões de dependências usadas, dando-lhe controle sobre quaisquer atualizações e monitorar vulnerabilidades de pacotes que você usa para poder atualizá-los oportunamente uma vez que um deles foi comprometido. Se não utilizar arquivos de lock, você pode, por exemplo, iniciar seu aplicativo com uma versão, mas, em seguida, durante qualquer fase, seja desenvolvimento, compilação ou implantação, seu gerenciador de pacotes pode atualizar dependências sem que você perceba.

Para obter instruções sobre como usar o Yarn.lock com projetos Kotlin/JS, leia nossa postagem de blog.

Por fim, observe que a história em torno dessa vulnerabilidade ainda está se desenvolvendo. Publicaremos quaisquer atualizações conforme necessário.

Artigo original em inglês por:

 

Luiz Di Bella

Hadi Hariri

image description