Skip to main content

Ataque à cadeia de suprimentos do Polyfill injeta malware em arquivos JavaScript de CDN

Escrito por

26 de junho de 2024

0 minutos de leitura

Uncovering the Polyfill.io Supply Chain Attack

Em 25 de junho de 2024, a equipe de pesquisa de segurança e malware da Sansec anunciou que um popular projeto de polyfill para JavaScript havia sido tomado por uma empresa estrangeira identificada como de origem chinesa, que passou a inserir código malicioso em arquivos JavaScript obtidos da CDN em: cdn.polyfill.io. Segundo a Sansec, mais de 100 mil sites foram afetados por esse ataque ao polyfill, incluindo empresas de capital aberto como a Intuit, entre outras.

Perguntas frequentes

A Snyk foi afetada pelo ataque à cadeia de suprimentos do Polyfill?

Não. A plataforma Snyk, incluindo nossas ferramentas, não foi afetada pelo ataque atual à cadeia de suprimentos do Polyfill.

O Snyk consegue detectar o problema de segurança do Polyfill?

O Snyk Code, nosso mecanismo SAST em tempo real baseado em machine learning, consegue detectar vários usos de URLs em código funcional, incluindo JavaScript, PHP e muitas outras linguagens.

Veja um exemplo de regra personalizada do Snyk Code que você pode adicionar:

custom_rules:
  - id: Polyfill supply chain compromise
    description: >-
      The polyfill.js is a popular open source library to support older
      browsers. This domain was caught injecting malware on mobile devices via
      any site that embeds cdn.polyfill.io.
    severity: high
    cwe:
      - CWE-506
    fix_analysis: Use alternatives provided at https://cdnjs.cloudflare.com/polyfill
    rule_code: >-
      StringLiteral<~".*http(s)?://((cdn\.)?polyfill\.io).*">
    languages:
      - html
      - javascript
      - php
      - java

Essa regra detecta o uso de qualquer URL de cdn.polyfill.io em código JavaScript ou PHP. Por exemplo, neste trecho de código, a inclusão manual do script será detectada:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Load Polyfill</title>
</head>
<body>
    <script>
        // Load the polyfill for Array.prototype.includes from cdn.polyfill.io
        (function() {
            var script = document.createElement('script');
            script.src = "https://cdn.polyfill.io/v3/polyfill.min.js?features=Array.prototype.includes";
            script.onload = function() {
                // Polyfill is loaded, you can use Array.prototype.includes safely now
                console.log([1, 2, 3].includes(2)); // Should log 'true'
            };
            document.head.appendChild(script);
        })();
    </script>
</body>
</html>

Observação: a regra personalizada corresponde apenas a código JavaScript ou PHP, não a tags <script src=“…”></script> simples em HTML.

Devo adicionar uma regra de lista de bloqueio apenas para o site cdn.polyfill.io?

Vários relatos registraram que o agente malicioso adicionou novos domínios, incluindo: polyfill[.]site, polyfill[.]com, bootcdn[.]net, bootcss[.]com, staticfile[.]net, staticfile[.]org, unionadjs[.]com, xhsbpza[.]com, union.macoms[.]la e newcrbpc[.]com. Recomendamos acompanhar esses relatos de perto e atualizar sua regra personalizada do Snyk Code de acordo.

O que aconteceu com a biblioteca polyfill maliciosa?

Em fevereiro de 2024, uma empresa chinesa anunciou que adquiriria o site polyfill.io de Jake Champion, criador da biblioteca Node.js polyfill-library, e do proprietário do site. A empresa chinesa Funnull, que oferecia serviços de CDN e hospedagem, assumiu o controle e, desde então, é proprietária do domínio, da organização no GitHub e do repositório.

Página do site da Funnell com o título “Anúncio de aquisição do Polyfill” e um texto sobre a aquisição do Polyfill pela Funnell.

Pouco depois do anúncio da aquisição, o domínio polyfill.io passou a apontar para um novo CNAME: polyfill.io.bsclink.cn.

Desenvolvedores já davam sinais de que uma catástrofe estava prestes a acontecer, como no comentário a seguir no GitHub, de Renaud Chaput:

O Polyfill.io pertencia à equipe web do Financial Times, depois passou a ser gerenciado pela comunidade, e o último mantenedor vendeu o projeto para uma empresa chinesa de CDN meio suspeita. Eles tiraram o serviço da Fastly (plataforma de CDN e computação de borda que hospedava o código aberto do serviço) e começaram a adulterar os arquivos enviados.

Renaud Chaput

Em abril e junho, membros da comunidade também deram outros sinais de irregularidades e alertaram sobre a transferência da propriedade para uma empresa terceirizada. As suspeitas aumentaram ainda mais quando os comentários foram apagados de uma issue no GitHub:

Sinais de irregularidades na transferência de propriedade do polyfill.io para uma empresa chinesa terceirizada, posteriormente acusada de distribuir código malicioso para uma biblioteca de polyfill JavaScript

Andrew Betts, colega de Jake Champion na Fastly, foi o autor original do serviço web polyfill. Esse projeto permitia a inclusão automática de bibliotecas polyfill de JavaScript em sites, de acordo com o user agent ou outras propriedades. As declarações de Andrew remontam a fevereiro, quando ele alertou que não tinha qualquer envolvimento com o site oficial cdn.polyfill.io.

Não conhecemos nenhuma biblioteca polyfill específica no npm que faça parte dessa campanha de um agente malicioso para injetar código. Ainda assim, bibliotecas de diferentes ecossistemas de software, como sistemas de gerenciamento de conteúdo (CMS), incluindo o projeto Magento, podem conter código que insere scripts JavaScript estáticos provenientes de cdn.polyfill.io. Em particular, detectamos a CVE-2024-38526, um alerta de segurança referente à biblioteca pdoc, no registro PyPI, que fornece documentação de API para projetos Python. Quando a documentação é gerada com o comando pdoc --math, ela pode conter links para arquivos JavaScript de polyfill.io. Esse comportamento da biblioteca pdoc foi corrigido na versão 14.5.1 do pdoc. Recomendamos que os usuários atualizem o quanto antes.

Qual é a situação atual do site polyfill.io?

O site polyfill.io está, na prática, fora do ar. Para proteger os usuários, extensões de navegador que bloqueiam anúncios, como o uBlock, acompanharam os relatos sobre o site e agora impedem ativamente o acesso a ele.

Filtro do uBlock

Em 21 de junho, foi noticiado que o Google começou a exibir uma mensagem de erro de “site comprometido” no site do Google Ads. A situação se agravou após relatos de tentativas de falsificação de sites usando o domínio googie-anaiytics[.]com.

Qual é o impacto do malware do polyfill.io?

Em 2017, Andrew Betts, autor original do site polyfill.io, hospedado na Fastly, relatou que 91 milhões de navegadores por dia faziam solicitações para importar a biblioteca e que eram registradas até 700 milhões de solicitações por mês para atualizar navegadores antigos com padrões web modernos.

91 milhões de navegadores são atualizados automaticamente todos os dias com os recursos mais recentes da web.

Relatos nas redes sociais e em outras fontes apontam que o site da Hulu incorpora a biblioteca JavaScript do site cdn.polyfill.io, identificada como maliciosa (relato de Theo).

O site da Hulu inclui no pacote o código da biblioteca JavaScript maliciosa de cdn.polyfill.io

Em outro relato, Germán Fernández também identificou o site da comunidade Atlassian como importador da biblioteca polyfill de JavaScript do domínio malicioso polyfill.io.

O site da comunidade Atlassian inclui código-fonte JavaScript de polyfill.io, domínio associado a uma injeção de malware.

O Silent Push Labs também identificou sites governamentais que incluíam a origem maliciosa polyfill.io e os reportou à CISA.

O que é um polyfill de JavaScript?

Um polyfill de JavaScript é um trecho de código criado para oferecer recursos modernos em navegadores antigos que não os suportam nativamente. Historicamente, os polyfills foram essenciais para desenvolvedores web que buscavam criar aplicações compatíveis com diferentes versões de navegadores. Eles funcionam como uma ponte, permitindo que navegadores antigos executem recursos mais recentes do JavaScript e proporcionando uma experiência consistente, independentemente da idade ou dos recursos do navegador.

Nos primórdios do desenvolvimento web, os navegadores evoluíam em ritmos diferentes, criando um ambiente fragmentado em que o mesmo código podia não funcionar da mesma forma em todas as plataformas. Em geral, o suporte às APIs dos navegadores não era uniforme. Como os desenvolvedores não tinham controle sobre as versões de navegador usadas pelos usuários, não podiam garantir que uma mesma API estaria disponível durante a execução do código JavaScript. Os polyfills surgiram como solução para esse problema: com bibliotecas polyfill, os desenvolvedores podiam escrever código JavaScript moderno sem se preocupar com questões de compatibilidade. Por exemplo, métodos como Array.prototype.includes e Promise não eram compatíveis com navegadores antigos, como o Internet Explorer. Ainda assim, os desenvolvedores podiam disponibilizar esses recursos carregando uma biblioteca polyfill no navegador.

A função de uma CDN de JavaScript nas bibliotecas polyfill

Uma rede de distribuição de conteúdo (CDN) é um sistema de servidores distribuídos pelo mundo que entrega conteúdo web aos usuários com base em sua localização geográfica. No caso das bibliotecas polyfill de JavaScript, as CDNs têm um papel fundamental: hospedam e disponibilizam essas bibliotecas de forma eficiente em todo o mundo. Com elas, os desenvolvedores garantem que os polyfills cheguem aos usuários com rapidez e confiabilidade, reduzindo a latência e o tempo de carregamento. O uso de uma CDN também ajudava a evitar que os desenvolvedores precisassem incluir bibliotecas JavaScript no pacote da aplicação.

Um caso de uso comum de CDN que você provavelmente já encontrou é o de métricas na nuvem e desempenho de aplicações, como o Google Analytics, que recomenda oficialmente adicionar o seguinte código ao seu site:

<script async custom-element="amp-analytics" src="https://cdn.ampproject.org/v0/amp-analytics-0.1.js"></script>
<amp-analytics type="gtag" data-credentials="include">
<script type="application/json">
{
  "vars" : {
    "gtag_id": "<GA_MEASUREMENT_ID>",
    "config" : {
      "<GA_MEASUREMENT_ID>": { "groups": "default" }
    }
  }
}
</script>
</amp-analytics>

No ataque que comprometeu o polyfill, cdn.polyfill.io era uma CDN amplamente usada que disponibilizava polyfills dinamicamente com base nos cabeçalhos HTTP das solicitações recebidas. Assim, o polyfill adequado era entregue de acordo com o navegador e a versão do usuário, garantindo compatibilidade ideal.

Riscos de segurança dos polyfills hospedados em uma CDN

Usar polyfills hospedados em uma CDN traz riscos significativos de segurança, principalmente pela possibilidade de execução de código JavaScript arbitrário no contexto da aplicação. Esse risco costuma ser classificado como uma vulnerabilidade de cross-site scripting (XSS) na aplicação web.

Quando uma aplicação obtém uma biblioteca polyfill de uma CDN, ela depende da integridade e da segurança do servidor externo — ou seja, da própria CDN. Se a CDN ou a biblioteca hospedada for comprometida, como no ataque recente a cdn.polyfill.io, o novo código malicioso poderá ser injetado e executado no navegador do usuário. Esse código pode realizar diversas ações prejudiciais, como redirecionar usuários para sites de phishing, roubar informações confidenciais ou até disseminar outros malwares. Em termos de segurança de navegadores, esse tipo de vulnerabilidade XSS é a consequência mais grave.

Como se proteger contra ataques à cadeia de suprimentos de CDNs

O ataque recente ao projeto polyfill de JavaScript destaca a importância fundamental dos recursos que sustentam o ecossistema web, e as CDNs são uma parte importante dele. As preocupações com a segurança da cadeia de suprimentos costumam se concentrar em registros de pacotes open source, como PyPI e npm, mas o ataque ao polyfill de JavaScript nos lembrou de que as CDNs também são um componente essencial da web.

Veja algumas práticas recomendadas que você pode adotar para se proteger contra ataques desse tipo:

  • Use CDNs confiáveis: use apenas CDNs de provedores de boa reputação. A Cloudflare, por exemplo, é conhecida por suas medidas robustas de segurança e confiabilidade.

  • Substitua o polyfill: a Cloudflare criou uma cópia do polyfill em https://cdnjs.cloudflare.com/polyfill, recomendada como substituta direta.

  • Monitore as dependências: faça auditorias regulares e monitore todos os scripts e dependências de terceiros.

  • Integridade de sub-recursos: ferramentas como Subresource Integrity (SRI) ajudam a garantir que o conteúdo entregue por uma CDN não tenha sido adulterado. Elas também permitem fixar uma versão ou hash esperado, que já tenha sido auditado e considerado livre de comportamentos maliciosos ou indesejados.

  • Política de Segurança de Conteúdo (CSP): implemente uma CSP rigorosa para restringir as origens das quais os scripts podem ser carregados. Isso pode impedir a execução de scripts maliciosos. Como os polyfills costumam fazer parte do caminho crítico de carregamento da aplicação, eles têm as mesmas permissões que qualquer outro JavaScript na página, o que os torna alvos prioritários para invasores que querem explorar essa confiança. Esse risco reforça a importância de usar CDNs seguras e confiáveis, implementar medidas robustas, como uma Política de Segurança de Conteúdo (CSP), e auditar regularmente as dependências de terceiros para se proteger contra essas vulnerabilidades.

  • Mantenha tudo atualizado: mantenha todas as bibliotecas e dependências atualizadas. Muitos ataques exploram vulnerabilidades conhecidas que já foram corrigidas em versões posteriores.

  • Considere alternativas: avalie se os polyfills ainda são necessários no seu projeto. Com a modernização dos navegadores, muitos recursos oferecidos por polyfills já são compatíveis nativamente. Considere fortemente incluir as dependências nos próprios arquivos do projeto, em vez de depender de provedores terceirizados, como as CDNs.

Leia mais

illustration hero ai
Blog

PHP corrige duas vulnerabilidades críticas de RCE sem autenticação (CVE-2026-109618, CVE-2026-109619): atualize agora

Duas falhas críticas no ciclo de requisições do PHP podem permitir execução remota de código sem autenticação. Atualize para uma versão corrigida ou instale um backport do fornecedor para versões mais antigas.

blog feature ai lilac
Blog

Transforme seu backlog de vulnerabilidades em pull requests com remediação agentiva

O Evo Remediation Agent está em Open Preview e traz a resolução automatizada de dependências para o Evo Agentic AppSec. Agora, as equipes de AppSec podem executar campanhas contínuas de remediação

AI Background min crop
Blog

A IA está acionando todos os riscos que você aceitou: sete insights do painel de segurança de IA sem filtros

A IA está tornando os ataques mais baratos e rápidos, expondo riscos que as organizações já carregam. Quatro líderes de segurança explicam por que a defesa na velocidade das máquinas e a correção mais rápida são essenciais.