In this article
Como proteger aplicações Node.js contra vulnerabilidades de redirecionamento aberto
Como desenvolvedores, sabemos que escrever código seguro não é um luxo: é uma necessidade. Entre os inúmeros problemas de segurança que podem afetar aplicações, as vulnerabilidades de redirecionamento aberto merecem atenção especial.
As vulnerabilidades de redirecionamento aberto ocorrem quando uma aplicação incorpora dados fornecidos pelo usuário a um redirecionamento de URL. Isso pode permitir que pessoas mal-intencionadas redirecionem vítimas para sites de phishing ou malware por meio da aplicação vulnerável. Em aplicações Node.js, essas vulnerabilidades podem causar danos consideráveis, pois é comum receber URLs como dados de entrada dos usuários para fins de lógica de negócios, como a página inicial pessoal, o perfil em uma rede social ou a foto de perfil.
Confira este guia completo para saber mais sobre vulnerabilidades de redirecionamento aberto em Node.js. Estas práticas recomendadas também ajudam a proteger aplicações Node.js.
Entenda as vulnerabilidades de redirecionamento aberto
Uma vulnerabilidade de redirecionamento aberto ocorre quando uma aplicação incorpora, de forma insegura, dados fornecidos pelo usuário ao destino de uma operação de redirecionamento. Isso pode permitir que invasores redirecionem usuários desavisados de um site confiável para um site malicioso.
Entender as vulnerabilidades de redirecionamento aberto é fundamental para a segurança de aplicações ao criar aplicações Node.js ou escrever JavaScript para o código executado no navegador. Nesta seção, explicamos como identificá-las, quais são os riscos envolvidos e como elas são descritas pelo Open Web Application Security Project (OWASP).
Por exemplo, considere uma aplicação Node.js com Express que define a seguinte rota como parte do middleware da aplicação:
app.get('/home, function(req, res){
let redirectURL = req.query.url;
res.redirect(redirectURL);
});
No exemplo de código Express acima, um usuário pode ser redirecionado para qualquer URL informada no parâmetro de consulta url. Isso pode ser útil para redirecioná-lo a uma página de cobrança ou de planos de assinatura, a um painel específico ou a uma página de perfil. No entanto, invasores podem explorar esse comportamento criando uma URL que redireciona para um site malicioso e enganando os usuários para que a acessem.
Como encontrar uma vulnerabilidade de redirecionamento aberto
Para identificar uma vulnerabilidade de redirecionamento aberto, é preciso entender como sua aplicação processa dados fornecidos pelos usuários, especialmente quando eles são usados para redirecionar. Em aplicações Node.js, preste atenção a métodos como res.redirect() no Express, que podem ser usados sem a sanitização adequada dos dados de entrada do usuário.
Em aplicações Node.js, os redirecionamentos de URL são usados com frequência por vários motivos, como:
Redirecionar usuários para uma versão diferente do site (por exemplo, para dispositivos móveis ou computadores) com base no dispositivo usado.
Gerenciar a autenticação, redirecionando os usuários à página original após o login bem-sucedido.
Acompanhar as atividades ou os cliques dos usuários para fins de análise.
No entanto, o uso inadequado desses redirecionamentos pode levar a uma falha de segurança conhecida como vulnerabilidade de redirecionamento aberto.
O Snyk Code, recurso de segurança de código do Snyk, pode ajudar bastante nesse sentido. Ele analisa seu código-fonte em busca de possíveis problemas de segurança como esse, gera relatórios detalhados e sugere correções. Instale a extensão para VS Code e comece a proteger seu código!
Vulnerabilidade de redirecionamento aberto no OWASP
O OWASP reconhece as vulnerabilidades de redirecionamento aberto como uma ameaça significativa. Elas estão incluídas na lista de riscos de segurança que os desenvolvedores devem conhecer, o que demonstra a gravidade potencial desse tipo de vulnerabilidade.
Entre os riscos e impactos das vulnerabilidades de redirecionamento aberto estão:
Phishing: invasores podem redirecionar usuários para um site malicioso que parece legítimo e enganá-los para que forneçam informações confidenciais.
Distribuição de malware: o invasor pode redirecionar usuários para um site que hospeda malware, provocando downloads automáticos sem que eles saibam.
Danos à reputação: se sua aplicação for identificada como origem desse tipo de ataque, sua reputação poderá sofrer danos graves.
Uma das formas de uma vulnerabilidade de redirecionamento aberto chegar à sua base de código é por meio de dependências de código aberto de terceiros. Com o Snyk Open Source, você pode analisar seus pacotes de código aberto em busca de vulnerabilidades e receber orientações para corrigi-las, mantendo suas aplicações seguras.
Você pode começar a proteger suas aplicações contra vulnerabilidades de redirecionamento aberto gratuitamente. Crie uma conta no Snyk.
Vulnerabilidades de redirecionamento aberto em aplicações Node.js
Vale lembrar: as vulnerabilidades de redirecionamento aberto ocorrem quando uma aplicação aceita dados de entrada não confiáveis. Isso pode fazer com que a aplicação web Node.js redirecione a solicitação para uma URL incluída nesses dados não confiáveis. Na lógica de negócios implementada em aplicações Node.js, entender e mitigar essas vulnerabilidades nas definições de rotas, nos controladores e em outros pontos que processam URLs é fundamental para manter um ambiente seguro.
As vulnerabilidades de redirecionamento aberto também são relevantes para aplicações de frontend que usam Node.js no servidor para renderizar componentes de interface e entregá-los ao cliente.
Vulnerabilidades de redirecionamento aberto em aplicações Next.js com renderização no servidor (SSR)
Next.js é um framework popular para aplicações React renderizadas no servidor. Assim como outras aplicações Node.js, as aplicações Next.js também podem estar vulneráveis a ataques de redirecionamento aberto.
Em uma aplicação Next.js, uma vulnerabilidade de redirecionamento aberto pode ocorrer quando a aplicação usa propriedades do servidor para buscar dados no momento da solicitação e, em seguida, redireciona o usuário com base nesses dados. Por exemplo:
export async function getServerSideProps(context) {
const { req, res } = context
const target = req.headers.referer
if (target) {
res.writeHead(302, { Location: target })
res.end()
}
return { props: {} }
}
Neste trecho de código, a aplicação redireciona o usuário para a URL presente no cabeçalho referer. Se esse valor não for validado corretamente, podem ocorrer ataques de redirecionamento aberto.
Vulnerabilidades de redirecionamento aberto no framework web Fastify
O exemplo mais básico de uma vulnerabilidade de redirecionamento aberto é o redirecionamento para um caminho absoluto, a forma mais simples de uma aplicação Fastify processar dados de entrada diretamente do usuário. Veja como ficaria no framework web Fastify o código Express mencionado anteriormente:
const fastify = require('fastify')({ logger: true });
fastify.get('/home, (request, reply) => {
const target = request.query.target;
reply.redirect(target);
});
fastify.listen(3000, (err, address) => {
if (err) throw err;
fastify.log.info(`server listening on ${address}`);
});
Neste exemplo com Fastify, assim como no código Express, há uma vulnerabilidade de redirecionamento aberto. Ela ocorre quando a aplicação confia cegamente nos dados de entrada do usuário para determinar o destino do redirecionamento de URL.
Veja outra variação de redirecionamento de URL:
fastify.get('/safeRedirect', (request, reply) => {
const target = request.query.target
if (isValidUrl(target)) {
// isValidUrl is a hypothetical function to validate the URL
reply.redirect(target)
} else {
reply.send({ error: 'Invalid URL' })
}
})Neste exemplo, foi adicionada uma forma de validação (isValidUrl). No entanto, se ela não for robusta o suficiente, os invasores ainda poderão encontrar uma maneira de contorná-la. Por exemplo, um padrão de expressão regular em isValid() pode apresentar falhas.
Problemas de segurança que levam a vulnerabilidades de redirecionamento aberto
É importante que os desenvolvedores conheçam os seguintes problemas de segurança, que podem levar a vulnerabilidades de redirecionamento aberto:
Não validar nem sanitizar os dados de entrada do usuário que determinam a URL de redirecionamento.
Permitir redirecionamentos para qualquer domínio externo sem usar uma lista de permissões.
Não codificar a URL de redirecionamento pode levar a vulnerabilidades como cross-site scripting (XSS).
Detecte e corrija vulnerabilidades de redirecionamento aberto com o Snyk
Snyk Code e Snyk Open Source são ferramentas de segurança para desenvolvedores que ajudam a detectar e corrigir vulnerabilidades de redirecionamento aberto em suas aplicações Node.js. Essas ferramentas analisam seu código-fonte, pacotes de código aberto, imagens de contêiner e configurações incorretas na nuvem em busca de vulnerabilidades.
Snyk Code é uma solução avançada que ajuda a encontrar e corrigir vulnerabilidades no seu código. Ela oferece resultados precisos com menos falsos positivos, facilitando o foco dos desenvolvedores nos problemas mais críticos.
Snyk Open Source ajuda você a encontrar, corrigir e monitorar vulnerabilidades conhecidas em dependências de código aberto de Node.js e JavaScript.
Veja um exemplo de como usar o Snyk para analisar sua aplicação Node.js ou Next.js em busca de vulnerabilidades de redirecionamento aberto.
Primeiro, integre o Snyk ao seu ambiente de desenvolvimento. Para isso, instale a CLI do Snyk e execute um comando simples:
npm install -g snykDepois de instalar a CLI do Snyk, você pode testar sua aplicação Node.js para verificar se há vulnerabilidades:
snyk testEsse comando analisa sua aplicação e gera um relatório de todas as vulnerabilidades conhecidas, incluindo as de redirecionamento aberto.
O Snyk identifica vulnerabilidades e fornece orientações práticas para corrigi-las. Por exemplo, se uma vulnerabilidade de redirecionamento aberto for detectada, o Snyk informa o local exato da vulnerabilidade no seu código, o nível de gravidade e recomendações detalhadas de correção, como estas:
✗ Open Redirect [Medium Severity][https://snyk.io/vuln/SNYK-JS-REDIRECT-569620] in redirect@1.0.0
introduced by your-app@1.0.0 > redirect@1.0.0
This issue was fixed in versions: 2.0.0Ferramentas como o Snyk ajudam desenvolvedores a escrever código seguro e detectar vulnerabilidades. O Snyk é uma ferramenta de segurança criada para desenvolvedores que analisa código-fonte, pacotes de código aberto, imagens de contêiner e configurações na nuvem em busca de vulnerabilidades ocultas.
O Snyk oferece suporte a muitas linguagens de programação e frameworks, entre eles JavaScript e Node.js.
Se você é desenvolvedor e quer proteger suas aplicações e reduzir os riscos associados às vulnerabilidades de redirecionamento aberto, cadastre-se no Snyk hoje mesmo e fortaleça suas práticas de segurança de aplicações.
Proteja seu código enquanto desenvolve
O Snyk analisa seu código em busca de problemas de qualidade e segurança e recomenda correções direto no seu IDE.