Aikido

As 10 principais vulnerabilidades de segurança JavaScript em aplicações web modernas

Ruben CamerlynckRuben Camerlynck
|
#
#

As 10 principais vulnerabilidades de segurança do JavaScript

O JavaScript alimenta uma grande variedade de aplicações modernas – desde front-ends web dinâmicos a back-ends Node.js escaláveis –, o que significa que também expõe uma ampla superfície de ataque. A flexibilidade que torna o JavaScript tão poderoso pode se transformar numa faca de dois gumes quando a segurança é negligenciada. O código front-end é executado diretamente nos navegadores dos utilizadores (e pode ser inspecionado ou manipulado por invasores), enquanto as aplicações back-end Node.js geralmente integram inúmeros pacotes e lidam com dados confidenciais. A triste verdade é que uma única linha insegura de JavaScript ou uma dependência vulnerável pode abrir as portas para explorações. Na verdade, relatórios recentes do setor mostram que as aplicações web continuam repletas de vulnerabilidades comuns, como cross-site scripting e bibliotecas desatualizadas, apesar de anos de avisos.

Todos os roteiro etiqueta, cada npm install, e cada análise JSON pode esconder um risco potencial. Nas secções abaixo, detalhamos as dez principais vulnerabilidades de segurança do JavaScript (abrangendo problemas tanto do lado do cliente quanto do lado do servidor), com exemplos reais e dicas sobre como corrigi-las ou evitá-las. Desde armadilhas clássicas como XSS até as mais recentes ataques à Supply chain, cada vulnerabilidade inclui etapas de mitigação e uma chamada para como as ferramentas de segurança modernas (como AikidoSAST, secrets, e análise de dependências) pode ajudar a detectar problemas precocemente.

1. cross-site scripting

Cross-Site Scripting (XSS) is one of the most prevalent vulnerabilities in we11b applications year after year. XSS occurs when an application includes unsanitized user input in a webpage, allowing attackers to inject malicious JavaScript that executes in the browsers of other users. This can lead to session hijacking, defacement, and theft of sensitive data. Even widely used libraries have suffered XSS flaws – for example, a five-year-old jQuery bug (CVE-2020-11023) allowed arbitrary code execution by passing malicious HTML to jQuery’s DOM methods. Unsuspecting developers who included a vulnerable jQuery (<3.5.0) version in their frontend exposed their users to potential XSS, a flaw so serious that U.S. CISA added it to its exploited vulnerabilities catalog in 2025.

Exemplo real: Um invasor pode criar um comentário ou nome de perfil contendo <script> tags num fórum que não escape corretamente escape . Quando outros utilizadores visualizam essa página, o script é executado no seu navegador – talvez roubando o seu cookie de sessão ou fazendo-se passar por eles. Relatório de segurança da Claranet para 2024 encontrado 2.570 ocorrências de XSS (refletido e armazenado) em 500 testes de penetração, tornando-o “uma das vulnerabilidades mais comuns encontradas... nos últimos cinco anos”. Isso reforça que o XSS continua sendo uma das principais ameaças em aplicativos com uso intenso de JavaScript.

Mitigação: A defesa contra XSS requer uma combinação de práticas de codificação e defesas do navegador:

  • Escape validar a saída: Nunca insira entradas brutas do utilizador em HTML. Limpe as entradas à chegada e escape no contexto adequado (HTML, atributo, JavaScript, etc.).
  • Utilizar controlos do Framework: Aproveite os modelos ou frameworks front-end (React, Angular, Vue) que escape sanitizam automaticamente o conteúdo. Evite usar sinks perigosos como innerHTML ou document.write com dados dinâmicos – use alternativas mais seguras, como textContent.
  • Política de Segurança de Conteúdo (CSP): Implemente um cabeçalho CSP rigoroso para restringir de onde os scripts podem ser carregados. A CSP pode atuar como uma segunda linha de defesa, bloqueando scripts não autorizados.
  • Cookies HttpOnly e SameSite: Marque os cookies como HttpOnly (não acessíveis via JS) e use SameSite atributos para tornar mais difíceis alguns tipos de ataques (como cross-site scripting, roubo de cookies ou CSRF).

Detectar XSS requer vigilância na revisão e nos testes de código. Testes de segurança de aplicações estáticas SAST) Aikidopodem sinalizar padrões perigosos – por exemplo, o uso de innerHTML com dados fornecidos pelo utilizador ou codificação de saída ausente nos modelos do servidor. análise de dependências ajuda: Aikido alertá-lo-á se estiver a utilizar uma versão antiga da biblioteca conhecida por permitir XSS (como o exemplo jQuery 3.4.1 acima), para que possa atualizar para uma versão corrigida. Ao integrar verificações automatizadas no seu CI/CD, pode detetar vulnerabilidades XSS antecipadamente, antes que os atacantes o façam.

2. Poluição de protótipos

A poluição de protótipos é uma vulnerabilidade específica do JavaScript que aproveita a natureza dinâmica dos protótipos de objetos. No JavaScript, os objetos herdam propriedades do seu protótipo e, se um invasor conseguir injetar propriedades no Object.prototype, essas propriedades tornam-se acessíveis em todos os objetos – muitas vezes levando à negação de serviço ou até mesmo à execução remota de código. Muitas bibliotecas populares sofreram CVEs de poluição de protótipos. Por exemplo, as versões do Lodash anteriores à 4.17.12 tinham uma vulnerabilidade em seu padrõesDeep e outras funções que poderiam ser induzidas a modificar Object.prototype via a crafted payload. Another example is Handlebars.js: versions <4.3.0 allowed template input to alter special properties like __proto__, que “pode permitir que um invasor execute código arbitrário” no servidor (CVE-2019-19919).

Exemplo real: Um invasor envia dados JSON para uma API com uma carga útil como {"__proto__": {"admin": true}}. Se a aplicação fundir objetos sem proteção (por exemplo, usando um lodash.merge ou similar), a cadeia de protótipos fica poluída – subsequentemente, verificações como if(utilizador.admin) pode inesperadamente retornar verdadeiro para todos os utilizadores ou, pior ainda, a lógica da aplicação pode ser subvertida. Em alguns casos, a poluição de protótipos pode ser combinada com outras técnicas para executar código. Por exemplo, a falha de «prototype poison» nos modelos Handlebars mencionada acima poderia ser usada para executar JavaScript do lado do servidor no contexto da aplicação.

Mitigação: Para evitar a poluição protótipo:

  • Atualizar dependências: use versões fixas de bibliotecas que tenham corrigido bugs de poluição de protótipos. Por exemplo, atualize o Lodash para >=4.17.20 (que corrigiu vários CVEs desse tipo).
  • Validação de entrada: Valide e higienize entradas JSON ou de objetos. Rejeite ou filtre chaves de objetos nomeadas __proto__, construtor, ou protótipos em dados.
  • Fusão segura de objetos: ao fundir objetos (por exemplo, clonagem profunda ou extensão), use funções ou bibliotecas seguras que não copiem propriedades de protótipo. Algumas bibliotecas utilitárias oferecem opções para ignorar propriedades herdadas.
  • Executar em modo restrito: Embora não seja uma solução milagrosa, o modo estrito ("use strict") pode impedir certas ações perigosas e facilitar a deteção de erros.

A poluição de protótipos pode ser sutil, mas análise de dependências sua aliada nesse caso. O scanner de dependências Aikidosinaliza versões vulneráveis conhecidas de bibliotecas como Lodash, jQuery ou Handlebars que são suscetíveis à poluição de protótipos, para que você possa atualizá-las proativamente. No lado do código, SAST Aikidopode detetar padrões de fusão de objetos inseguros ou uso de chaves de objetos potencialmente perigosas. Ao usar Aikido auditar continuamente o seu código e os seus pacotes npm, você ganha uma rede de segurança para essa classe de bug – detectando-o durante o desenvolvimento, em vez de após uma violação.

3. Deserialização insegura

Falhas de deserialização insegura ocorrem quando uma aplicação aceita dados serializados não confiáveis e os deserializa em objetos sem a devida validação. Em JavaScript/Node, isso geralmente envolve funções que recebem objetos JSON ou JavaScript fornecidos pelo utilizador e os “revivem” em objetos ativos. Se não for tratada com cuidado, a deserialização pode ser abusada para executar código arbitrário ou manipular o estado da aplicação. Um exemplo notório foi o node-serializar Vulnerabilidade do pacote (CVE-2017-5941): permitia que invasores passassem um objeto serializado malicioso contendo uma Expressão de Função Invocada Imediatamente (IIFE). Após a desserialização, a função seria executada no servidor, efetivamente alcançando a execução remota de código.

Exemplos reais: esta questão não é teórica – mesmo as principais estruturas já cometeram erros. No final de 2025, uma vulnerabilidade crítica do React/Next.js (chamada React2Shell, CVE-2025-55182) foi divulgada, com origem na forma como os React Server Components lidam com dados serializados. “No centro da questão está a desserialização insegura”, observou a pesquisa Akamai, que permitiu que invasores injetassem chaves de objetos maliciosas, levando à poluição de protótipos e, por fim, à execução remota de código no servidor. Isso significa que, ao enviar uma solicitação HTTP especialmente criada, um invasor não autenticado poderia assumir o controle de um servidor Node.js executando código React vulnerável — um cenário de pesadelo para qualquer DevSecOps .

Mitigação: Prevenir a deserialização insegura envolve o manuseamento cuidadoso dos formatos de dados:

  • Prefira formatos seguros: Use JSON para troca de dados e evite analisar código JavaScript ou funções a partir da entrada do cliente. O JSON.parse padrão é mais seguro do que eval() ou deserialização personalizada de objetos JS.
  • Lista branca e validação: Se tiver de aceitar objetos serializados, implemente esquemas rigorosos ou listas de permissões. Permita apenas propriedades e tipos de objetos esperados. Rejeite qualquer entrada que contenha chaves como __proto__ ou construtor que poderia ser vetor de abuso.
  • Evite eval e Function(): Não use eval() em JSON ou aceitar código JS bruto de clientes. Da mesma forma, evite bibliotecas que executam dados de objetos (por exemplo, evite executar automaticamente funções que vêm de entradas analisadas).
  • Atualizações da biblioteca: mantenha-se atualizado sobre os patches da estrutura. A vulnerabilidade do React acima foi corrigida por atualizações do React/Next – aplique esses patches imediatamente e monitore os avisos para bibliotecas Node.js que realizam deserialização.

A plataforma Aikidopode ajudar a detectar deserializações inseguras de várias maneiras. Análise estática de código avisar-lhe-á se o seu código estiver a utilizar funções arriscadas (como unserialize() de uma biblioteca desatualizada ou usando eval na entrada). Se estiver a utilizar pacotes conhecidos por serem vulneráveis (como o buggy node-serializar <=0.0.4, or certain versions of React), Aikido’s dependency scanner would flag those by CVE. Additionally, Aikido’s runtime SAST analysis (if integrated in testing) can observe data flows – for example, user input flowing into a dangerous sink – and alert you. The bottom line: integrating such tools in CI means you’d catch something like React2Shell in your code antes torna-se React2Shell nas notícias.

4. Falsificação de pedidos entre sites (CSRF)

A falsificação de pedidos entre sites (CSRF) é uma vulnerabilidade clássica da web que frequentemente afeta aplicações baseadas em JavaScript (ou qualquer aplicação web com sessões). Ao contrário do XSS, que explora a injeção de código, o CSRF explora a confiança no navegador do utilizador. Ele permite que um invasor induza o navegador da vítima a fazer pedidos não intencionais à sua aplicação, sob o pretexto das credenciais da própria vítima. Em termos mais simples, se um utilizador estiver conectado ao seu site, um invasor pode potencialmente induzir o navegador dele (por meio de um link ou imagem maliciosa) a realizar ações como alterar detalhes da conta ou iniciar transações sem o consentimento do utilizador.

Exemplo real: Um exemplo bem conhecido é o análogia entre publicação em fórum e transferência bancária – imagine um aplicativo bancário em que o formulário de transferência de dinheiro é vulnerável a CSRF. Um invasor poderia enviar a um utilizador conectado um link (ou incorporar um formulário de envio automático em uma página maliciosa) que aciona POST /transferência?montante=1000&para=conta do atacanteSe a aplicação bancária não tiver proteção CSRF, o navegador do utilizador enviará essa solicitação juntamente com os cookies de sessão, e o banco a executará pensando que foi intenção do utilizador. No contexto do JavaScript, as aplicações de página única (SPAs) podem depender de APIs que usam cookies para autenticação; se essas APIs não implementarem defesas CSRF (como exigir um token ou cookies do mesmo site), elas também podem ser exploradas. Mesmo frameworks que incluem tokens CSRF podem ser mal configurados – por exemplo, se o backend de um aplicativo Angular ou React definir uma política CORS excessivamente ampla ou não tiver sinalizadores SameSite, os ataques CSRF podem passar despercebidos.

Mitigação: As principais estratégias para impedir o CSRF incluem:

  • Tokens CSRF: incorpore tokens imprevisíveis em formulários ou chamadas de API e verifique-os no lado do servidor. As estruturas modernas geralmente têm middleware CSRF. Certifique-se de que os tokens estejam vinculados à sessão do utilizador e sejam verificados em todas as solicitações que alteram o estado.
  • Cookies SameSite: Defina cookies de sessão com o SameSite=Lax ou Strict atributo. Isso impede que os navegadores enviem cookies em solicitações entre sites (o principal mecanismo do CSRF). Notavelmente, Strict pode interromper alguns fluxos legítimos, portanto Lax é uma configuração padrão equilibrada para a maioria das aplicações.
  • Cabeçalhos personalizados e verificação de origem: Para APIs (especialmente se estiver a usar fetch/XHR em SPAs), pode exigir um cabeçalho personalizado (por exemplo, X-Requested-With: XMLHttpRequest) e rejeitar pedidos que não o tenham. Além disso, verifique o Origem e Referente cabeçalhos em pedidos sensíveis – certifique-se de que eles vêm do seu domínio.
  • Evite usar GET para alterações de estado: O CSRF pode usar <img> ou <script> tags para iniciar pedidos GET. Certifique-se de que qualquer ação crítica (como modificar dados) utilize POST (ou outros métodos que não sejam GET) e, idealmente, ainda exija um token.

Embora o CSRF seja mais uma questão de design do que de bug de código, o kit de ferramentas de segurança Aikidoainda pode ajudar. Análise estática pode detetar rotas ou controladores sem proteções CSRF se estiver a usar frameworks comuns (por exemplo, um csrf() middleware numa aplicação Express ou nenhum módulo anti-CSRF em uso). Aikido também Aikido verificar os seus cabeçalhos de segurança HTTP e configurações de cookies (por meio de análise dinâmica ou scripts de pipeline) para sinalizar ausências. SameSite ou HttpOnly atributos. Ao integrar essas verificações, Aikido que os hábitos de codificação segura (como implementar tokens CSRF e sinalizadores de cookies adequados) sejam aplicados de forma consistente em todo o seu projeto.

5. Injeção NoSQL

Assim como as bases de dados SQL tradicionais sofrem com injeções SQL, as aplicações JavaScript modernas que utilizam bases de dados NoSQL (como MongoDB, CouchDB, etc.) podem ser vulneráveis a injeções NoSQL. A injeção NoSQL ocorre quando um invasor manipula entradas utilizadas em consultas NoSQL, permitindo-lhe alterar consultas, contornar a autenticação ou recuperar dados não autorizados. Como as consultas NoSQL costumam usar JSON ou objetos de consulta, a sintaxe é diferente da SQL, mas o conceito de injetar parâmetros de maneiras inesperadas ainda se aplica.

Exemplo real: considere uma aplicação Node.js que usa MongoDB para autenticação de utilizadores, com código como:

// insecure pseudo-codeUsers.findOne({ username: inputUser, password: inputPass })

À primeira vista, isso parece correto, mas as consultas do MongoDB aceitam objetos e operadores especiais. Um invasor poderia enviar uma carga JSON para inputPass tais como { "$ne": null }. A consulta torna-se {username: "victim", password: { $ne: null } }, que em Mongo significa «encontrar um utilizador com o nome de utilizador 'vítima' e uma palavra-passe que não seja nula» – essencialmente ignorando a verificação da palavra-passe porque $ne: nulo é sempre verdadeiro para um campo de palavra-passe real. Este tipo de Injeção de operador NoSQL é uma técnica conhecida para contornar formulários de login. A Web Security Academy PortSwiggerdocumenta como a injeção NoSQL pode, em alguns casos, «permitir que um invasor contorne a autenticação, extraia ou altere dados ou até mesmo execute código no servidor».

Além da omissão da autenticação, a injeção NoSQL pode ser usada para extrair dados. Por exemplo, ao injetar $regex ou outros operadores, os invasores podem enumerar registos de utilizadores ou descarregar bases de dados se a aplicação não for cuidadosa.

Mitigação:

  • Sanitização de entradas: Não passe diretamente dados controlados pelo utilizador para consultas à base de dados. Limpe as entradas – por exemplo, se estiver à espera de um nome de utilizador em forma de string, certifique-se de que é uma string e não contém $ ou outros caracteres especiais. Alguns ORMs ou bibliotecas de controladores têm verificações ou modos integrados para impedir a injeção de operadores (por exemplo, o Mongoose pode desativar $ chaves prefixadas por predefinição).
  • Use consultas parametrizadas/ORM: usar um ORM ou um construtor de consultas pode reduzir a exposição direta a consultas brutas. Certifique-se de usar todos os recursos de parametrização disponíveis.
  • Autenticação e lógica de consulta: não confie em apenas uma condição para operações confidenciais. Para o login, prefira um fluxo de trabalho que verifique a palavra-passe de forma independente (após recuperar o utilizador pelo nome de utilizador) em vez de uma grande consulta que possa ser manipulada.
  • Registo e monitorização: as tentativas de injeção NoSQL geralmente deixam vestígios (por exemplo, padrões de consulta estranhos ou erros). Registe tentativas de login falhadas e parâmetros de consulta inesperados; isso pode ajudar a detectar um ataque em andamento.

A análise estática Aikidopode detetar padrões de risco, como o uso de

findOne()

ou consultas semelhantes com entradas de utilizador não verificadas. Por exemplo, Aikido sinalizar se detectar $ ou caracteres regex concatenados numa string de consulta, ou o uso de raw Users.findOne({ ... entrada do utilizador ... }) sem sanitização. Além disso, varredura dinâmica Aikido varredura dinâmica se você a empregar contra uma instância de desenvolvimento em execução) pode incluir testes específicos para injeção NoSQL, semelhante à forma como DAST teste para SQLi. Ao aproveitar esses recursos, os programadores recebem um aviso antecipado: «Ei, essa função de login pode estar vulnerável a uma injeção NoSQL.» Corrigir isso antecipadamente evita que você tenha um desastre potencial de contorno de autenticação na produção.

6. Negação de serviço por expressão regular (ReDoS)

A negação de serviço por expressão regular (ReDoS) é uma vulnerabilidade em que um invasor fornece uma entrada especialmente criada para uma expressão regular (regex) que leva um tempo excepcionalmente longo para ser avaliada, monopolizando a CPU e causando efetivamente uma negação de serviço. O mecanismo de expressão regular do JavaScript (como muitos outros) pode apresentar retrocesso catastrófico em determinados padrões. Isso é particularmente relevante para o Node.js, onde um único segmento lida com muitos clientes – uma expressão regular travada pode bloquear todo o ciclo de eventos. Vulnerabilidades ReDoS foram encontradas em vários pacotes e frameworks npm. Por exemplo, uma falha de baixa gravidade, mas notável, foi descoberta no compilador de modelos do Vue.js 2 (CVE-2024-9506): uma expressão regular escrita incorretamente para analisar HTML poderia ser explorada por um formato malformado. <textarea> ou <script> etiqueta para “causar atrasos significativos na análise do modelo”. Da mesma forma, o popular caminho-para-regexp A biblioteca (usada no encaminhamento Express) tinha um problema ReDoS (CVE-2024-52798), e inúmeras bibliotecas de validação (para URLs, e-mails, etc.) tiveram CVEs ReDoS ao longo dos anos.

Exemplo real: Imagine um servidor Node.js que usa uma expressão regular para validar endereços de e-mail no registo do utilizador. Um padrão de expressão regular ingênuo (por exemplo, algo como /(.+)@(.+)\.(.+)/) pode retroceder catastróficamente numa sequência de determinado comprimento e composição. Os atacantes podem enviar uma sequência de e-mail extremamente longa, como "aaaa... aaaa!" (com determinados padrões) que faz com que a expressão regular demore segundos ou mais, durante os quais o servidor pode não conseguir processar outros pedidos. Num caso, um ReDoS no validator.js Foi encontrada uma falha na validação de URL da biblioteca – uma entrada de URL criada com algumas dezenas de kilobytes fez com que o processo travasse. Se um invasor automatizasse o envio em massa dessas entradas, poderia efetivamente derrubar o serviço. A fundação OWASP observa que a maioria dos motores regex são suscetíveis a esses tipos de casos extremos.

Mitigação:

  • Evite expressões regulares complexas para entradas não confiáveis: simplifique os seus padrões de expressões regulares ou use abordagens sem retrocesso. Se possível, use bibliotecas integradas ou algoritmos testados para tarefas comuns (por exemplo, use o analisador de URL integrado do Node em vez de uma expressão regular complexa para URLs).
  • Usar tempos limite: Para casos críticos, pode usar uma biblioteca regex que suporte tempos limite ou sandboxing. No Node, o Expressão regular As operações são síncronas, mas pode executar o trabalho regex numa thread de trabalho separada, se necessário, para evitar bloquear o loop principal.
  • Limite o comprimento da entrada: muitas vezes, o ReDoS depende de cadeias de caracteres muito grandes. Ao impor limites razoáveis de comprimento às entradas (por exemplo, nenhum endereço de e-mail deve ter mais de 254 caracteres, conforme a RFC), você reduz a viabilidade do ReDoS.
  • Padrões de revisão e teste: existem ferramentas que podem analisar expressões regulares quanto ao potencial de retrocesso catastrófico. Incorpore-as na revisão de código para qualquer padrão complexo. Escreva casos de teste com entradas patológicas para ver como as suas expressões regulares se comportam sob estresse.

análise de dependências aqui – Aikido CVEs conhecidos e pontos fracos nos seus pacotes npm. Se você estiver a importar um pacote com um ReDoS conhecido (por exemplo, uma versão vulnerável de um analisador de datas ou validador de URL), Aikido alertá-lo para atualizar para uma versão corrigida. Para padrões regex personalizados no seu código, SAST Aikido SAST detectar literais regex codificados ou nova RegExp() uso e aplicar verificações heurísticas (por exemplo, sinalizar padrões com quantificadores excessivos ou grupos aninhados). Pode não detectar todas as expressões regulares maliciosas, mas, combinado com a base de conhecimento Aikido, pode alertar: «Esta expressão regular parece suspeita de ser exponencial». Além disso, as ferramentas de teste Aikidopodem simular ataques de fuzzing; se uma carga útil simples causar problemas de desempenho, você ficará sabendo disso durante o teste, em vez de receber uma mensagem no pager às 2 da manhã.

7. Traversal de diretório e exposição de ficheiros

As vulnerabilidades de traversal de diretório (ou traversal de caminho) permitem que invasores acessem ficheiros no servidor que deveriam estar fora dos limites, manipulando os caminhos dos ficheiros. No Node.js, isso geralmente ocorre com bibliotecas ou códigos que servem ficheiros estáticos, lidam com downloads de ficheiros ou processam arquivos zip. Se a entrada do utilizador for concatenada em caminhos de ficheiros sem a sanitização adequada, um invasor pode usar sequências como ../ para sair do diretório pretendido. Por exemplo, uma vulnerabilidade no nó estático pacote (um servidor de ficheiros estáticos simples) foi descoberto onde uma verificação inadequada no servePath função permitia que um invasor solicitasse uma URL com .. e aceder a ficheiros arbitrários (CVE-2023-26111). Uma prova de conceito mostrou que um invasor poderia recuperar ficheiros confidenciais, como /root/.ssh/id_rsa por codificação ../../../../../ na URL.

Exemplo real: Um cenário comum é um aplicativo Express usando express.static() ou uma rota de servidor de ficheiros personalizada. Suponha que tem:

app.get('/download', (req, res) => {  const file = req.query.file;    res.sendFile(__dirname + '/uploads/' + file);});

Se não tiver cuidado, um invasor pode chamar /download?file=../../etc/passwd e recuperar ficheiros do sistema. Houve casos em que as aplicações inadvertidamente expuseram chaves ou ficheiros de configuração dessa forma. Mesmo ao usar bibliotecas, houve bugs: versões mais antigas do middleware estático do Express tinham problemas conhecidos de traversal de diretórios em casos extremos (como URLs com pontos codificados). O tratamento do caminho principal do Node no Windows também apresentava uma peculiaridade de travessia (CVE-2025-27210) envolvendo nomes de dispositivos que podiam ser abusados. Além da leitura de ficheiros, a gravação de ficheiros é outro ângulo (por exemplo, ataques “Zip Slip”, em que a extração de um arquivo zip grava ficheiros fora da pasta pretendida).

Mitigação:

  • Normalizar e validar caminhos: Utilizar path.normalize() e path.join() para resolver qualquer .. sequências e, em seguida, certifique-se de que o caminho resolvido está dentro do diretório permitido. Por exemplo, após a resolução, rejeite a solicitação se o ficheiro estiver fora do seu /uploads pasta.
  • Evite caminhos controlados diretamente pelo utilizador: sempre que possível, não utilize diretamente as entradas do utilizador como nomes de ficheiros. Mapeie as entradas do utilizador para caminhos de ficheiros predefinidos. Por exemplo, se os utilizadores só devem descarregar os seus próprios ficheiros, utilize um identificador e procure o nome do ficheiro no lado do servidor, em vez de confiar num parâmetro de nome de ficheiro.
  • Privilégio mínimo: execute os seus processos Node.js com privilégios mínimos. Se a aplicação não tiver motivos para aceder a determinados diretórios externos, considere restrições ao nível do sistema operativo ou conteinerização para limitar os danos que uma travessia poderia causar.
  • Mantenha as bibliotecas atualizadas: Se utilizar bibliotecas de servidor de ficheiros ou bibliotecas de descompressão, mantenha-se atualizado sobre as suas correções de segurança. O nó estático A vulnerabilidade acima não tinha «correção» no pacote mais antigo, o que pode significar usar uma biblioteca alternativa ou adicionar o seu próprio patch.

A varredura Aikidopode detectar padrões comuns de traversal de diretórios no código. Por exemplo, o uso de enviar ficheiro ou lerFicheiro com req.query ou req.params é um sinal de alerta que SAST nossas SAST podem destacar. Aikido faz referência cruzada a vulnerabilidades conhecidas – se o seu projeto depende de uma versão do enviar ou nó estático com um CVE para traversal de caminho, ele solicitará que você atualize. Para DevSecOps , o ponto forte Aikidoé combinar esses sinais: imagine que ele sinaliza o seu trecho de código de servidor de ficheiros como arriscado e indica que está a utilizar uma biblioteca desatualizada para isso – essa informação pode levar a uma correção rápida (sanitizar a entrada e atualizar a versão da biblioteca). Essencialmente, Aikido como um revisor de segurança extra, vasculhando a lógica de acesso aos seus ficheiros para que os invasores não possam vasculhar o seu sistema de ficheiros.

8. Dependências vulneráveis e desatualizadas

As aplicações JavaScript modernas geralmente incluem dezenas ou centenas de pacotes npm. Cada uma dessas dependências (e suas subdependências) pode conter vulnerabilidades conhecidas. O uso de bibliotecas desatualizadas é tão comum que constitui uma categoria de risco à parte: versões inseguras de frameworks front-end, módulos Node ou bibliotecas utilitárias podem expor a sua aplicação a ataques, mesmo que o seu próprio código esteja correto. O estudo da Claranet de 2024 encontrou 1032 instâncias de bibliotecas JavaScript desatualizadas em 500 aplicações, observando que «o uso de JavaScript desatualizado pode levar a ataques XSS, ataques de negação de serviço e divulgação de informações confidenciais». Em outras palavras, CVEs conhecidas em bibliotecas populares se traduzem diretamente em riscos para a sua aplicação se você não as tiver atualizado.

Exemplos reais:

  • Lodash: Biblioteca de utilitários extremamente popular. Várias CVEs (conforme discutido anteriormente) afetaram o Lodash – falhas de poluição de protótipos (CVE-2018-16487, CVE-2019-10744, CVE-2020-8203) e até mesmo um problema de DoS de expressão regular em _.escapeRegExp. As aplicações que permaneceram nas versões antigas do Lodash herdaram essas vulnerabilidades.
  • jQuery: Once ubiquitous on the frontend. jQuery <3.5.0 had that XSS vulnerability where injecting <option> As tags poderiam executar scripts. Se o seu frontend ainda usa, digamos, jQuery 2.1 ou 3.4, você está carregando falhas XSS conhecidas que os invasores estão explorando ativamente.
  • Express e outros: A própria estrutura Express teve alguns CVEs (redirecionamentos abertos, negação de serviço por meio de solicitações malformadas, etc.). Pacotes menores, como momento (biblioteca de datas) apresentava uma vulnerabilidade de traversal de caminho em determinados usos (CVE-2022-24785), markdown-it teve um problema de XSS, e assim por diante. Até mesmo o núcleo do Node tinha vulnerabilidades que exigiam correções (como os problemas de contrabando de solicitações HTTP e traversal de caminho em 2022-2025).

A utilização de componentes vulneráveis é um dos dez principais riscos da OWASP (em «Utilização de componentes com vulnerabilidades conhecidas»). Trata-se essencialmente de uma preocupação relacionada com a cadeia de abastecimento: se introduzir uma biblioteca, também introduz os seus erros.

Mitigação:

  • análise de dependências atualizações: Executar regularmente auditoria npm ou ferramentas semelhantes para obter uma lista das vulnerabilidades conhecidas nas suas dependências. Atualize os pacotes para versões corrigidas. Use ferramentas que alertam quando novas vulnerabilidades são encontradas nas bibliotecas que você usa.
  • Higiene do ficheiro de bloqueio: Mantenha o seu package-lock.json (ou ficheiro de bloqueio Yarn) com cuidado. Evite problemas de dependências aninhadas não resolvidas utilizando npm audit fix quando apropriado. Se uma subdependência estiver vulnerável e não for atualizada, considere substituições ou entre em contacto com os mantenedores.
  • Dependências mínimas: não inclua pacotes que não precisa. Cada dependência extra é mais uma falha potencial. Por exemplo, se precisa apenas de uma pequena função, pode ser mais seguro implementá-la do que importar uma biblioteca com 30 funções que terá de confiar e monitorizar.
  • Avisos de monitorização: Mantenha-se a par dos avisos de segurança no ecossistema Node/JS. Inscreva-se nas listas de correio de segurança do Node ou Dependabot do GitHub para os seus repositórios.

É aqui que análise de dependências as correções baseadas em IAAikido realmente se destacam. Aikido verifica Aikido a sua árvore de dependências em relação a uma base de dados de vulnerabilidades. Se um novo CVE for lançado para, digamos, Express ou Lodash, receberá uma notificação e até mesmo uma sugestão de correção automática (por exemplo, «atualize do Lodash 4.17.11 para 4.17.21 para corrigir o CVE-2020-8203»). Ferramentas amigáveis para desenvolvedores significam que não se trata apenas de um relatório – Aikido abrir uma solicitação pull com a versão atualizada. Além disso, o recurso SafeChain Aikido(um firewall incorporado no aplicativo o seu gerenciador de pacotes) pode impedir a instalação de pacotes conhecidos como maliciosos. Ao integrar essas ferramentas, a sua equipa pode reduzir drasticamente o tempo de exposição entre o momento em que uma vulnerabilidade da biblioteca é divulgada e o momento em que você a corrige no seu aplicativo.

9. Pacotes NPM maliciosos e ataques à Supply chain

Nem todos os ataques resultam de erros de codificação – alguns resultam do código que você pensamento em que se pode confiar. O ecossistema npm tem sofrido ataques à Supply chain os invasores subvertem o fornecimento de pacotes para inserir código malicioso. Isso pode acontecer através de técnicas como typosquatting (publicar um pacote com um nome semelhante a um popular, na esperança de que alguém digite errado ou instale por engano) ou comprometendo os mantenedores de projetos legítimos. Um incidente infame foi o fluxo de eventos ataque em 2018: um invasor convenceu o mantenedor do fluxo de eventos (um pacote amplamente utilizado) para transferir o controlo e, em seguida, lançou uma nova versão que incluía uma dependência oculta (fluxo de mapa plano) contendo malware. Ao longo de alguns meses, essa atualização maliciosa foi descarregada milhões de vezes e tinha como alvo específico uma aplicação de carteira Bitcoin (Copay) para roubar chaves de criptomoedas.

Outros exemplos incluem pacotes como ua-parser-js, node-ipc, e event-source-polyfill que foram sequestrados por invasores ou sabotados pelos seus próprios desenvolvedores para entregar cargas indesejadas (como spyware, mineradores de moedas ou scripts destrutivos). Em 2021, pesquisadores de segurança demonstraram ataques de "confusão de dependências" — nos quais, se uma empresa usa um nome de pacote interno e um invasor publica um pacote com o mesmo nome no npm, as ferramentas de compilação podem puxar a versão do invasor. Esses cenários são particularmente perigosos porque podem dar aos invasores a execução remota de código durante a compilação ou na produção, sem explorar nenhuma vulnerabilidade tradicional.

Mitigação:

  • Verifique a autenticidade da embalagem: Use hashes de integridade do pacote (o npm usa automaticamente bloqueio de pacotes com hashes sha512 para pacotes – mantenha esse ficheiro de bloqueio confirmado). Considere ativar a autenticação de dois fatores (2FA) nas contas npm e dê preferência a pacotes de fontes confiáveis.
  • Bloqueie dependências internas: se tiver pacotes privados, certifique-se de que o seu registo ou processo de compilação não os obtenha acidentalmente do registo público. Crie pacotes internos de namespace ou utilize registos com escopo.
  • Monitorize os scripts de instalação: tenha cuidado com pacotes que possuem scripts de instalação/pós-instalação. Verifique o que esses scripts fazem (alguns pacotes maliciosos utilizam-nos para executar comandos prejudiciais durante a instalação).
  • Use ferramentas de segurança: aproveite a auditoria do npm e outras ferramentas para identificar anomalias. Por exemplo, se um pacote amplamente utilizado lançar repentinamente uma nova versão secundária após um longo período de calmaria, trate-o com cautela (como foi o caso do lançamento da versão 3.3.6 do event-stream).
  • Princípio do privilégio mínimo: Ao executar compilações ou CI, execute-as em ambientes sandbox. Para produção, considere mecanismos como o Node's --política experimental para controlar quais módulos podem require o quê, ou contentorização para limitar os danos.

Aikido proteger a sua cadeia de fornecimento de software. Aikido , por exemplo, pode analisar metadados de pacotes e até mesmo o conteúdo dos pacotes em busca de indicadores maliciosos. Ele pode bloquear a instalação de pacotes conhecidos por estarem comprometidos ou que apresentam comportamento suspeito (como scripts pós-instalação ofuscados). Threat Intelligence Aikidomantém o controlo sobre malware em pacotes de código aberto, portanto, se amanhã uma biblioteca popular for invadida, Aikido avisá-lo ou impedir atualizações para a versão corrompida. Além disso, SAST Aikido SAST detetar o uso de operações confidenciais em dependências (como se uma dependência de repente começar a executar comandos shell ou acessar a rede de maneira inesperada). Ao integrar essas ferramentas no seu pipeline, você adiciona uma forte camada de defesa contra o próximo ataque do tipo fluxo de eventos – essencialmente tendo um revisor de código automatizado para código de terceiros.

10. Secrets codificados Secrets credenciais expostas

Codificar secrets chaves API, tokens, senhas) no seu código JavaScript ou configuração é uma prática arriscada que, infelizmente, continua comum. No código front-end, qualquer segredo (por exemplo, uma chave API para um serviço de terceiros) é visível para o utilizador final e deve ser tratado como público — mas os programadores às vezes esquecem isso e deixam tokens confidenciais no pacote JS. No código backend Node.js ou nos ficheiros de configuração, secrets ser enviados para o git e acabar no controlo de código-fonte ou no pacote implementado. A exposição de secrets levar a acesso não autorizado, apropriação de conta ou contas caras (por exemplo, se um invasor encontrar uma chave API de um provedor de nuvem, ele pode usar recursos ou descarregar as suas bases de dados).

A dimensão deste problema é destacada por pesquisas: só em 2024, quase 23,8 milhões de novos secrets codificados secrets detetados em commits públicos do GitHub, um aumento de 25% em relação ao ano anterior. Violações de alto perfil ocorreram devido ao vazamento de credenciais — por exemplo, um vazamento de credenciais do New York Times e outro na Sisense foram atribuídos à secrets . Mesmo em imagens do Docker, milhares de chaves API foram encontradas inadvertidamente incorporadas. Conclusão: a exposição de segredos é generalizada e, muitas vezes, a maneira mais fácil para os invasores entrarem sem explorar um bug de software.

Exemplo real: Em 2019, um programador acidentalmente enviou uma cadeia de conexão MongoDB (com credenciais) para um repositório público do GitHub. Em poucas horas, invasores que estavam a analisar o GitHub encontraram-na, acederam ao banco de dados e mantiveram os dados como reféns para pedir resgate. Em outro caso, programadores de aplicativos móveis deixaram uma chave privada do Firebase no JavaScript do aplicativo – invasores extraíram-na e acederam aos dados dos utilizadores no Firebase. Esses exemplos mostram que, seja em um .js ficheiro, um .env arquivo enviado por engano, ou em qualquer lugar da sua base de código, secrets alvos fáceis para os invasores, caso sejam expostos.

Mitigação:

  • Nunca codifique Secrets: Use variáveis de ambiente ou um serviço secrets . Seu aplicativo Node.js pode ler a partir de process.env em tempo de execução, em vez de ter o segredo na fonte. Para necessidades de front-end, considere fazer o proxy das solicitações através do seu back-end para que o segredo não seja exposto ou use fluxos OAuth que não exijam a incorporação secrets.
  • Ignorar e verificar o Git: Não se comprometa .env arquivos ou outros arquivos que contenham segredos. Use .gitignore para excluí-los. Além disso, use ferramentas de verificação de segredos (o GitHub tem um verificador de segredos integrado para repositórios públicos, e ferramentas de terceiros podem verificar commits) para detectar qualquer segredo que possa ter escapado.
  • Rotação de chaves: em caso de suspeita de fuga de segredos, faça a rotação imediatamente. Tenha um plano para a rotação de chaves e use credenciais separadas para diferentes ambientes (para que uma fuga no desenvolvimento não comprometa a produção, por exemplo).
  • Cofres e gestão de configurações: use um secrets adequado ou um gestor de segredos na nuvem para armazenar e obter secrets tempo de execução, em vez de armazená-los em ficheiros de configuração.

Aikido recursos secrets que verificam continuamente o seu código e configurações em busca de padrões de credenciais. Por exemplo, se alguém acidentalmente enviar uma chave de acesso AWS ou um token API, Aikido sinalizá-lo (mesmo durante uma solicitação pull) com um alerta de alta prioridade. Ele reconhece padrões e também pode usar o contexto (por exemplo, uma sequência hexadecimal de 40 caracteres em um ficheiro de configuração pode ser sinalizada como uma possível chave API). Além disso, a plataforma Aikidopode integrar-se ao controlo de versão para impedir secrets cheguem à produção, detectando-os no pipeline de CI. Isso é semelhante a ter um guardião que verifica: «Tem a certeza de que deseja submeter essa chave?». No caso de um segredo ser encontrado, Aikido ajudar a avaliar o impacto, identificando onde esse segredo pode ter-se propagado e até sugerindo correções (como quais chaves devem ser rotacionadas). Ao empregar essas ferramentas, os programadores podem fazer commits em repositórios com a confiança de que não estão inadvertidamente a publicar as chaves do reino.

Conclusão

A força do JavaScript – a sua ubiquidade e flexibilidade, do navegador ao backend – é exatamente o que torna a sua segurança uma tarefa tão crítica. Vimos como uma simples falha (uma saída não sanitizada, um pacote desatualizado, uma chave API vazada) pode comprometer a segurança de uma aplicação. A boa notícia é que a conscientização e as melhores práticas são muito úteis: ao compreender essas principais vulnerabilidades, os programadores podem evitar erros comuns, como avaliar dados não confiáveis ou deixar uma porta aberta através de ../ num caminho. Adotar uma mentalidade que prioriza a segurança significa validar entradas, codificar saídas, atualizar dependências e nunca presumir que «ninguém vai notar o meu erro» – porque, se não o detectar, um invasor acabará por o fazer.

Incorpore a segurança ao seu fluxo de trabalho de desenvolvimento. Adote hábitos de codificação seguros (revisione as folhas de referência da OWASP, use linters e verificadores de tipos para detectar problemas antecipadamente). E aproveite as ferramentas de segurança integradas que trabalham com você – desde análise estática de código auditoria de dependências e verificação de segredos. Soluções como Aikido permitem-lhe incorporar essas práticas no seu pipeline de CI/CD, para que cada commit e compilação seja verificado automaticamente quanto a vulnerabilidades. Ao detectar problemas antecipadamente e com frequência, reduz o risco sem diminuir o ritmo. O mundo do JavaScript move-se rapidamente, mas com as proteções certas em vigor, pode inovar com a mesma rapidez sem deixar a sua aplicação exposta. Faça entregas com confiança e segurança – os seus utilizadores e DevSecOps sua DevSecOps vão agradecer-lhe!

Continue a ler:
As 9 principais vulnerabilidades Container Docker
As 7principaisvulnerabilidades Cloud
As 10 principais vulnerabilidades de segurança de aplicações web que todas as equipas devem conhecer
As 9 principais segurança Kubernetes e configurações incorretas segurança Kubernetes
Principais vulnerabilidades de segurança de código encontradas em aplicações modernas
As 10 principais vulnerabilidades de segurança Python que os programadores devem evitar As 9 segurança da supply chain de software explicadas

4.7/5

Proteja seu software agora

Comece Gratuitamente
Não é necessário cc
Agendar uma demonstração
Seus dados não serão compartilhados · Acesso somente leitura · Não é necessário cartão de crédito

Fique seguro agora

Proteja seu código, Cloud e runtime em um único sistema centralizado.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados da varredura em 32 segundos.