Skip to main content

Biblioteca npm Sequelize ORM é vulnerável a ataques de injeção de SQL

Escrito por

11 de setembro de 2019

0 minutos de leitura

Os mapeadores objeto-relacional, também conhecidos como ORMs, são um conjunto de bibliotecas SQL que ajudam os desenvolvedores a gerenciar o código do banco de dados, abstraindo-o em construções da linguagem.

As bibliotecas ORM para SQL são consideradas ótimas para prevenir injeções de SQL, mas, infelizmente, elas próprias podem conter falhas de segurança que abrem caminho para ataques de injeção de SQL no nível da aplicação.

Por que devo me preocupar com ataques de injeção de SQL?

Uma das principais vantagens dos ORMs é o uso de instruções preparadas, uma técnica que escapa dados de entrada para evitar vulnerabilidades de injeção de SQL. Ainda assim, os ataques de injeção estão entre os principais riscos na OWASP Top 10, e um relatório da Akamai sobre o Estado da Internet constatou que as vulnerabilidades de injeção de SQL já representam quase dois terços dos ataques a aplicações web (65,1%).

Já falamos em mais detalhes sobre injeção de SQL e ORMs. Nesta publicação, quero me concentrar no exemplo recente de injeção de SQL descoberto pela equipe da Snyk na popular biblioteca npm sequelize.

Snyk encontra injeção de SQL na biblioteca npm Sequelize ORM

Em junho de 2019, a Snyk descobriu vetores de ataque que poderiam levar a ataques de injeção de SQL em aplicações que usam Sequelize, uma popular biblioteca npm para aplicações Node.js. Ao todo, encontramos três vulnerabilidades de injeção de SQL no Sequelize, identificadas pelos CVEs CVE-2019-10752 CVE-2019-10749, CVE-2019-10748.

Logo após confirmar o problema, entramos em contato com os mantenedores de sequelize, Jan Aagaard Meier e Sushant Dhiman, para divulgar nossas descobertas de forma responsável e fornecer um exemplo de injeção de SQL que demonstra a vulnerabilidade e os caminhos no código que levam a ela.

Como prova do compromisso do Sequelize com a segurança e com a proteção rápida dos usuários, a equipe respondeu prontamente e lançou correções nas versões 3.x e 5.x da biblioteca, eliminando a vulnerabilidade e oferecendo aos usuários um caminho de atualização para evitar injeções de SQL.

Página de lançamento do GitHub do Sequelize v5.8.11 mostrando uma correção de segurança para injeção de SQL em chaves de caminho JSON do MySQL/MariaDB

O projeto Sequelize lançou correções na versão 3.35.1 para as vulnerabilidades de segurança que afetam o PostgreSQL e na versão 5.8.11, que corrigiu vulnerabilidades nos dialetos MySQL e MariaDB. Recomendamos enfaticamente que você atualize o quanto antes para garantir que esteja usando versões seguras de sequelize.

A vulnerabilidade de injeção de SQL mais recente entre as três mencionadas foi corrigida na versão 5.15.1 do Sequelize. Veja um exemplo nas notas oficiais da versão:

Captura de tela das notas de lançamento da versão 5.15.1, que descrevem uma correção de segurança contra injeção de SQL em JSON no Sequelize e mostram um exemplo de vetor de ataque.

Exemplo de injeção de SQL em MySQL e MariaDB

Todas as versões de sequelize anteriores à 5.8.11 são vulneráveis a injeções de SQL (CVE-2019-10748), pois contêm chaves de caminho JSON que não são escapadas corretamente nos dialetos MySQL e MariaDB.

Veja o exemplo a seguir de injeção de SQL com sequelize:

class Project extends Sequelize.Model {}

Project.init({
  name: Sequelize.STRING,
  meta: Sequelize.JSON,
}, {
  sequelize,
  tableName: 'projects',
});

(async () => {
  await sequelize.sync();

  console.log(await Project.findAll({
    where: {meta: {"a')) AS DECIMAL) = 1 UNION SELECT VERSION(); -- ": 1}},
    attributes: ['name'],
    raw: true,
  }));
})();

O campo do banco de dados meta espera um objeto JSON, mas a chave fornecida não é sanitizada corretamente para escapar aspas simples. Se a aspa simples for passada junto com o texto )) AS DECIMAL) esperado pela consulta, o código poderá ser explorado.

Este exemplo de injeção de SQL mostra como é possível executar outras consultas SQL, como uma UNION, ou encerrar completamente uma consulta com um ponto e vírgula e acrescentar um comando ao final, como ; DROP TABLE USERS.

Uma vulnerabilidade semelhante de injeção de SQL afeta todas as versões de sequelize anteriores à 3.35.1 no dialeto PostgreSQL.

Fui afetado? O que devo fazer?

Se a Snyk monitora seu projeto e encontra versões vulneráveis do sequelize, você recebe uma notificação pelos alertas periódicos da Snyk. Além disso, se você conectou seu repositório do GitHub, criamos automaticamente um Pull Request para atualizar sequelize para uma versão corrigida.

A equipe de pesquisa de segurança da Snyk trabalha continuamente para descobrir vulnerabilidades em diversos ecossistemas de linguagens. Entre os exemplos estão a vulnerabilidade de segurança recente na biblioteca npm lodash e a extensa pesquisa que revelou a vulnerabilidade Zip Slip em vários ecossistemas de linguagens, afetando milhares de aplicações.

Se seus projetos não são monitorados pela Snyk e você quer verificar se usam esse pacote, faça o teste abaixo ou use nossa CLI para testar seus projetos localmente.

Também recomendamos que você adote práticas seguras de programação e siga as boas práticas, como as orientações da OWASP para prevenção de injeção de SQL.

Acha que encontrou uma vulnerabilidade no Sequelize?Na Snyk, valorizamos a comunidade de segurança e acreditamos que a divulgação responsável de vulnerabilidades em pacotes de código aberto ajuda a proteger a segurança e a privacidade dos usuários. Se você acha que encontrou uma vulnerabilidade no Sequelize, envie-a ao programa de divulgação de vulnerabilidades em pacotes do Snyk Open Source, e cuidaremos do resto!https://snyk.io/vulnerability-disclosure/

Comece a participar de desafios de Capture the Flag

Aprenda a resolver desafios de Capture the Flag assistindo sob demanda ao nosso workshop virtual introdutório.