{"id":227145,"date":"2021-10-24T18:09:23","date_gmt":"2021-10-24T17:09:23","guid":{"rendered":"https:\/\/blog.jetbrains.com\/kotlin\/2021\/10\/important-ua-parser-js-exploit-and-kotlin-js\/"},"modified":"2022-02-09T23:09:53","modified_gmt":"2022-02-09T22:09:53","slug":"important-ua-parser-js-exploit-and-kotlin-js","status":"publish","type":"kotlin","link":"https:\/\/blog.jetbrains.com\/pt-br\/kotlin\/2021\/10\/important-ua-parser-js-exploit-and-kotlin-js\/","title":{"rendered":"Importante: ua-parser-js exploit e Kotlin\/JS"},"content":{"rendered":"<p>No dia 22 de outubro, \u00e0s 17h06 (CEST), uma mensagem foi postada no canal <a class=\"ek-link\" href=\"https:\/\/kotlinlang.slack.com\/archives\/C0B8L3U69\/p1634915211042200\" target=\"_blank\" rel=\"noopener\">#javascript do Kotlin Slack<\/a> sobre um poss\u00edvel problema de seguran\u00e7a, momento no qual iniciamos nossas investiga\u00e7\u00f5es. No dia 23 de outubro, foi <a href=\"https:\/\/therecord.media\/malware-found-in-npm-package-with-millions-of-weekly-downloads\/\" target=\"_blank\" rel=\"noopener\">relatado que um malware foi encontrado<\/a> em um <a href=\"https:\/\/www.npmjs.com\/package\/ua-parser-js\" target=\"_blank\" rel=\"noopener\">pacote npm<\/a> muito popular chamado <strong>ua-parser-js<\/strong>. O pacote havia sido comprometido, ocasionando na instala\u00e7\u00e3o de um ladr\u00e3o de senhas e minerador de criptomoedas em m\u00e1quinas-alvo.\u00a0<\/p>\n<p>Kotlin Multiplatforma (com o target JS) e Kotlin\/JS utilizam um framework de testes muito popular chamado <a href=\"https:\/\/www.npmjs.com\/package\/karma\" target=\"_blank\" rel=\"noopener\">Karma<\/a>. Este framework, por sua vez, tem uma depend\u00eancia do pacote afetado (<strong>ua-parser-js<\/strong>). Al\u00e9m disso, muitos desenvolvedores que utilizarm o target JavaScript, tamb\u00e9m utilizam o Karma (assim como fazemos na equipe Kotlin) como sua estrutura de testes.\u00a0<\/p>\n<p>Dessa forma, achamos importante que voc\u00ea esteja ciente da situa\u00e7\u00e3o e do que voc\u00ea pode fazer para verificar se voc\u00ea foi afetado e como resolver o problema.\u00a0<\/p>\n<p><strong>Como sei se fui afetado?<\/strong><\/p>\n<p>Se voc\u00ea est\u00e1 usando direta ou indiretamente as <strong>vers\u00f5es ua-parser-js<\/strong> <strong>0.7.29, 0.8.0 e 1.0.0<\/strong>, voc\u00ea pode considerar o seu sistema comprometido. Indenpendentemente se voc\u00ea est\u00e1 ou n\u00e3o fazendo testes. Uma vez instalada a depend\u00eancia, os scripts de inicializa\u00e7\u00e3o s\u00e3o executados automaticamente (a menos que voc\u00ea execute npm com a op\u00e7\u00e3o <code>--ignore-scripts<\/code> ou globalmente tenha a op\u00e7\u00e3o <code>set ignore-scripts true<\/code>).\u00a0<\/p>\n<p><strong>Como sei se tenho este pacote no meu sistema?<\/strong><\/p>\n<p>Existem v\u00e1rias maneiras de saber se um pacote espec\u00edfico est\u00e1 instalado (local ou globalmente) em seu sistema, incluindo:<\/p>\n<ul>\n<li>Usando o comando npm list e filtrando a sa\u00edda para ua-parser-js\u00a0<\/li>\n<li>Usando o pacote <a href=\"https:\/\/www.npmjs.com\/package\/npm-check\" target=\"_blank\" rel=\"noopener\">npm-check<\/a> para verificar depend\u00eancias<\/li>\n<\/ul>\n<p>Uma maneira mais segura \u00e9 verificar o &#8216;ua-parser-js&#8217; espec\u00edfico em seu sistema executando o seguinte comando<\/p>\n<p><em>No macOS\/Linux\u00a0<\/em><\/p>\n<p><code>grep -r --include=\\package.json '\"_id\": \"ua-parser-js' {x}<\/code><\/p>\n<p><em>No Windows (usando Powershell)<\/em><\/p>\n<p><code>Get-ChildItem -Path '{x}' -Recurse -include \"package.json\" -ErrorAction SilentlyContinue | Select-String -pattern '\"_id\": \"ua-parser-js'<\/code><\/p>\n<p>Onde <code>{x}<\/code> \u00e9 a pasta raiz em que voc\u00ea deseja iniciar a pesquisa. Isso ir\u00e1 exibir todos os diret\u00f3rios contendo o arquivo package.json que utiliza o pacote. \u00c9 claro que voc\u00ea pode procurar as vers\u00f5es afetadas espec\u00edficas em vez de todas as vers\u00f5es, se quiser.\u00a0<\/p>\n<p>\u00c9 importante verificar n\u00e3o apenas o seu ambiente de desenvolvimento, mas tamb\u00e9m o seu ambiente de build ou qualquer outro lugar que voc\u00ea acha que este pacote pode ter sido instalado (direta ou indiretamente).\u00a0<\/p>\n<p>Verifique tamb\u00e9m as seguintes entradas durante a instala\u00e7\u00e3o de seus pacotes npm (o que pode ser, por exemplo, ao usar karma):<\/p>\n<p><em>ua-parser-js@0.7.29: this package has been hijacked<\/em><br \/><em>ua-parser-js@0.8.0: this package has been hijacked<\/em><br \/><em>ua-parser-js@1.0.0: this package has been hijacked<\/em><\/p>\n<p><strong>Como eu resolvo o problema?<\/strong><\/p>\n<p>Atualize para uma vers\u00e3o que n\u00e3o seja afetada pelo problema. As seguintes atualiza\u00e7\u00f5es foram lan\u00e7adas: <strong>0.7.30, 0.8.1<\/strong> e <strong>1.0.1<\/strong>. Certifique-se de remover quaisquer pacotes afetados e rotacione quaisquer credenciais que possam ter sido comprometidas.\u00a0<\/p>\n<p><strong>Isso \u00e9 suficiente para remover\/atualizar o pacote?<\/strong><\/p>\n<p>Dado que o pacote foi comprometido n\u00e3o apenas para executar minera\u00e7\u00e3o de cripto, mas tamb\u00e9m roubar credenciais, seria recomend\u00e1vel alterar quaisquer credenciais potenciais que possam ter sido comprometidas.\u00a0<\/p>\n<p>Tamb\u00e9m \u00e9 recomendado verificar se voc\u00ea tem algum bin\u00e1rio chamado <code>jsextension<\/code> ou <code>jsextention.exe<\/code> em execu\u00e7\u00e3o, como <a class=\"ek-link\" href=\"https:\/\/github.com\/faisalman\/ua-parser-js\/issues\/536#issuecomment-950103918\" target=\"_blank\" rel=\"noopener\">listados nos coment\u00e1rios da issue original<\/a> em execu\u00e7\u00e3o em seu sistema.<\/p>\n<p><strong>Estou infectado mesmo que n\u00e3o tenha feito nada que use este pacote?<\/strong><\/p>\n<p>\u00c9 seguro assumir que, se o pacote for instalado, o sistema est\u00e1 comprometido, algo que o <a href=\"https:\/\/github.com\/advisories\/GHSA-pjwm-rvh2-c87w\" target=\"_blank\" rel=\"noopener\">GitHub Advisory<\/a> tamb\u00e9m salienta.<\/p>\n<p><strong>Havia alguma janela de tempo para este ataque?<\/strong><\/p>\n<p>Ao que tudo indica, o ataque poderia ter ocorrido (ou seja, a partir do momento em que o pacote comprometido foi atualizado at\u00e9 o momento em que foi detectado) entre <strong>22 de outubro de 2021 \u00e0s 14:15 CEST e 22 de outubro de 2021 18:23 CEST<\/strong>. Em outras palavras, se nenhum de seus pacotes atualizou suas depend\u00eancias neste curto per\u00edodo de tempo, ent\u00e3o provavelmente voc\u00ea n\u00e3o tem a vers\u00e3o afetada e, consequentemente, provavelmente n\u00e3o foi impactado.\u00a0<\/p>\n<p><strong>Kotlin foi afetado?<\/strong><\/p>\n<p>Como mencionado acima, o Kotlin Multiplatform (utilizando o target JS) e a vers\u00e3o 1.5.0 e mais recentes do Kotlin\/JS usam uma depend\u00eancia transitiva do pacote afetado. Se voc\u00ea executou testes do karma pela primeira vez entre <strong>22 de outubro de 2021 \u00e0s 14:15 CEST e 22 de outubro de 2021 18:23 CEST<\/strong>, ent\u00e3o voc\u00ea provavelmente foi afetado.\u00a0<\/p>\n<p><strong>Como posso evitar que isso aconte\u00e7a no futuro?<\/strong><\/p>\n<p>Uma recomenda\u00e7\u00e3o \u00e9 usar arquivos lock para suas depend\u00eancias (package-lock.json, yarn.lock, etc) que bloqueiam vers\u00f5es de depend\u00eancias usadas, dando-lhe controle sobre quaisquer atualiza\u00e7\u00f5es e monitorar vulnerabilidades de pacotes que voc\u00ea usa para poder atualiz\u00e1-los oportunamente uma vez que um deles foi comprometido. Se n\u00e3o utilizar arquivos de lock, voc\u00ea pode, por exemplo, iniciar seu aplicativo com uma vers\u00e3o, mas, em seguida, durante qualquer fase, seja desenvolvimento, compila\u00e7\u00e3o ou implanta\u00e7\u00e3o, seu gerenciador de pacotes pode atualizar depend\u00eancias sem que voc\u00ea perceba.<\/p>\n<p><strong><a class=\"ek-link\" href=\"https:\/\/blog.jetbrains.com\/kotlin\/2021\/10\/control-over-npm-dependencies-in-kotlin-js\/\">Para obter instru\u00e7\u00f5es sobre como usar o Yarn.lock com projetos Kotlin\/JS, leia nossa postagem de blog.<\/a><\/strong><\/p>\n<p>Por fim, observe que a hist\u00f3ria em torno dessa vulnerabilidade ainda est\u00e1 se desenvolvendo. Publicaremos quaisquer atualiza\u00e7\u00f5es conforme necess\u00e1rio.<\/p>\n<p><em>Artigo original em ingl\u00eas por:<\/em><\/p>\n<p>\u00a0<\/p>\n\n    <div class=\"about-author \">\n        <div class=\"about-author__box\">\n            <div class=\"row\">\n                <div class=\"about-author__box-img\">\n                    <img decoding=\"async\" src=\"https:\/\/secure.gravatar.com\/avatar\/?s=200&#038;r=g\" width=\"200\" height=\"200\" alt=\"\" loading=\"lazy\"  class=\"avatar avatar-200 wp-user-avatar wp-user-avatar-200 photo avatar-default\">\n                <\/div>\n                <div class=\"about-author__box-text\">\n                                                        <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n","protected":false},"author":1086,"featured_media":193935,"comment_status":"open","ping_status":"closed","template":"","categories":[6366],"tags":[],"cross-post-tag":[],"acf":[],"_links":{"self":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/227145"}],"collection":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin"}],"about":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/types\/kotlin"}],"author":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/users\/1086"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/comments?post=227145"}],"version-history":[{"count":2,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/227145\/revisions"}],"predecessor-version":[{"id":227148,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/kotlin\/227145\/revisions\/227148"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media\/193935"}],"wp:attachment":[{"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/media?parent=227145"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/categories?post=227145"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/tags?post=227145"},{"taxonomy":"cross-post-tag","embeddable":true,"href":"https:\/\/blog.jetbrains.com\/pt-br\/wp-json\/wp\/v2\/cross-post-tag?post=227145"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}