Pular para o conteúdo principal
Fechar
Segurança

SQL Injection no Drupal: Quando a Abstração Falha

Gabriel Ferraresi· CEO | Tech8620 de maio de 20265 min
drupalsql injectionsegurança webcvepostgresql

Frameworks de abstração de banco de dados prometem que SQL injection é um problema resolvido. O CVE-2026-9082 prova que essa promessa descansa na premissa de que a abstração está correta para todos os drivers, todos os padrões de input, todos os caminhos de código. Quando a abstração falha, a queda é mais dura porque ninguém espera por ela.

O bug que não deveria existir

A Database Abstraction API do Drupal existe para impedir SQL injection. É a camada que separa o desenvolvedor do SQL raw, que sanitiza placeholders, que garante que input do usuário nunca vira código executável. Exceto quando vira.

O PostgreSQL EntityQuery condition handler processa filtros via JSON:API. Quando um atacante envia filter[name][condition][value][]=v, o PHP parseia isso em arrays associativos onde as chaves são controladas pelo atacante. O código em Condition.php faz foreach(condition['value'] as key => value) e concatena key no nome do placeholder SQL: LOWER(:db_placeholder_key).

Chaves controladas pelo atacante no nome do placeholder. Isso escapa da gramática preparada e injeta SQL raw na cláusula WHERE. A abstração que deveria impedir SQL injection é exatamente o vetor de SQL injection.

O fix: array_values(). Uma função. Strip das chaves, força índices numéricos. O patch inteiro é uma linha. O que é mais revelador: a simplicidade da correção ou a fragilidade que ela expõe? "Quase correta" é "totalmente vulnerável".

O caminho de ataque: anônimo, rápido, escalável

JSON:API é habilitado por default desde Drupal 8.8. Os endpoints /user/login?_format=json e os filtros JSON:API são os dois caminhos anônimos confirmados que alcançam o code path vulnerável. Sem autenticação. Sem sessão. Sem privilégio. Apenas um HTTP request craftado.

O PoC público gera HTTP 500 com SQLSTATE[HY093] — prova de que o payload foi concatenado no SQL. A distância entre esse erro e a extração de dados é curta. A distância para RCE é ainda menor.

No PostgreSQL, pg_execute_server_program permite COPY (SELECT ...) TO PROGRAM 'sh -c "cmd"'. O usuário de banco do Drupal tem privilégios elevados para schema migrations. A cadeia completa: SQL injection → dump da tabela users → escrita de backdoor PHP no webroot → login como admin → RCE. Em automação, segundos. Um script que percorre essa cadeia não precisa de intervenção humana.

Os números que importam

Imperva registrou 15.000+ tentativas contra aproximadamente 6.000 sites em 65 países nas primeiras 48h. 50% dos ataques concentrados em gaming e financial services — setores onde dados de usuários e transações financeiras são o alvo principal.

Drupal estimou que menos de 5% das instalações usam PostgreSQL. Mas Drupal roda em centenas de milhares de sites — governo, universidades, enterprise. 5% ainda são milhares de alvos. E esses alvos tendem a ser os maiores: governos e grandes organizações frequentemente escolhem PostgreSQL por requisitos de compliance e licenciamento.

CISA adicionou o CVE ao KEV (Known Exploited Vulnerabilities). Prazo federal para correção: 27 de maio. Quando o governo dos EUA dá um prazo, é porque o risco é real e a exploração está acontecendo.

A discrepância que engana

Drupal classificou 23/25 — "Highly Critical". A descrição: "all non-public data accessible, all data modifiable or deletable". NVD atribuiu CVSS 6.5 — impacto "Low".

Quando o vendor diz "todos os dados não-públicos acessíveis" e o NVD diz "impacto baixo", confie no vendor. O NVD não modela RCE via COPY TO PROGRAM. O scoring do CVSS não captura cadeias de exploração que cruzam camadas — do banco de dados ao sistema operacional. Essa discrepância não é acadêmica: equipes de segurança que priorizam por CVSS vão subestimar o risco. Equipes que priorizam pela classificação do vendor vão agir corretamente.

Nós vemos isso repetidamente na nossa operação: scores do NVD que não refletem a realidade de exploração. O CVSS é um input, não um veredito. A classificação do vendor, o contexto da infraestrutura e a existência de cadeias de exploração públicas são indicadores mais confiáveis.

A história se repete

O Drupalgeddon de 2014 (CVE-2014-3704) estava na mesma camada de abstração. Mesmo resultado: SQL injection através da API que deveria impedir SQL injection. A mesma premissa quebrada. A mesma confiança mal colocada.

Doze anos depois, a história se repete. Não porque os desenvolvedores do Drupal são negligentes — são excelentes. Repete porque a premissa de que uma camada de abstração cobre todos os casos é estruturalmente frágil. Cada novo driver, cada novo formato de input, cada novo code path é uma superfície de ataque que a abstração não testou. O fato de funcionar para 95% dos casos não protege os 5% restantes — e os 5% restantes podem ser os mais críticos.

A lição não é "não use abstrações". A lição é: abstrações reduzem risco, não eliminam. E quando o risco residual se materializa, você precisa de uma camada independente que funcione quando a abstração falha.

Defesa em profundidade, não confiança em camada única

O patch é necessário e urgente. Mas patch é reativo — você aplica depois que a vulnerabilidade é descoberta, depois que os ataques começam, depois que o CISA adiciona ao KEV. A janela entre a divulgação e a correção é onde os danos acontecem.

Um WAF com regras de SQL injection bloqueia os payloads antes que cheguem à aplicação. Não substitui o patch, mas protege durante a janela crítica. E mais importante: protege contra a próxima vulnerabilidade na mesma camada. Porque se a história se repete a cada 12 anos na mesma API, a próxima falha de abstração não é uma questão de "se", é uma questão de "quando".

Na Tech86, operamos com o princípio de que nenhuma camada de proteção é suficiente por si só. A abstração do framework é a primeira linha. O WAF é a segunda. O monitoramento de anomalias é a terceira. Quando uma falha, as outras continuam de pé. É isso que chamamos de Blindagem Perímetro — e é exatamente o tipo de proteção que o CVE-2026-9082 torna evidente.

Interessado nesta solução?

Conheça nossos serviços gerenciados e infraestrutura.

Conheça Blindagem Perímetro WAF

Perguntas Frequentes

Não. O bug está no Condition.php do handler PostgreSQL do EntityQuery. Instalações MySQL/MariaDB não são afetadas. Mas se você usa PostgreSQL — mesmo que seja minoria — o risco é crítico.

O NVD subestimou. Drupal classificou 23/25 — 'Highly Critical'. A diferença acontece porque o NVD não modela a cadeia de RCE via COPY TO PROGRAM do PostgreSQL. Quando o vendor diz 'todos os dados não-públicos acessíveis' e o NVD diz 'impacto baixo', confie no vendor.

Sim. A correção é array_values() aplicada ao array de condições antes do foreach. Isso remove as chaves controladas pelo atacante e força índices numéricos sequenciais. Uma função, uma linha, e a vulnerabilidade desaparece. O que é mais assustador: a simplicidade do fix ou a fragilidade que ele revela?

Sim. Os dois caminhos confirmados — /user/login?_format=json e filtros JSON:API — são acessíveis anonimamente. Não precisa de sessão, não precisa de privilégio. Apenas um HTTP request craftado.

Sim, como camada de contenção. Um WAF com regras de SQL injection bloqueia os payloads antes que cheguem à aplicação. Não substitui o patch, mas protege durante a janela entre a divulgação e a correção — e contra variantes futuras na mesma camada.

Blog — Fale Conosco

Tem alguma pergunta sobre nossos artigos ou serviços? Nossa equipe está pronta para ajudar.

Agendar Reunião

Reserve um horário.

Agendar Agora

E-mail

Envie uma mensagem.

[email protected]

WhatsApp

Conversa rápida.

Endereço

Avenida Paulista, 1636 - São Paulo - SP - 01310-200

Especialista Tech86

Online agora

Olá! Como podemos ajudar a escalar seu negócio hoje?

Tech86 Engineering

Nós valorizamos sua privacidade

Utilizamos cookies e tecnologias similares para otimizar a sua experiência, analisar o tráfego do site e personalizar conteúdo. Ao clicar "Aceitar Todos", você concorda com o uso de todos os cookies. Leia nossa Política de Privacidade.