
CVE-2026-14669 の概念実証エクスプロイト。PostgreSQL の to_char() タイムゾーン省略形におけるヒープバッファオーバーフローであり、情報漏えいと ROP チェーンを通じて RCE を可能にします。Docker ラボと自動化された PoC が含まれます。
PostgreSQL の to_char() 関数は、タイムゾーン書式を処理する際にヒープバッファオーバーフロー脆弱性が存在します。攻撃者は非常に長い POSIX タイムゾーン略称を設定することで、25 バイトの固定バッファへの領域外書き込みを引き起こし、情報漏洩と ROP チェーンを組み合わせてリモートコード実行を実現できます。
to_char(timestamptz) 関数| PostgreSQL シリーズ | 影響範囲 |
|---|
| 18.x | 18.0 – 18.5 |
| 17.x | 17.0 – 17.10 |
| 16.x | 16.0 – 16.14 |
| 15.x | 15.0 – 15.18 |
| 14.x | 14.0 – 14.23 |
formatting.c 内の DCH_TZ / DCH_tz 処理パスは、タイムゾーン略称を 25 バイトの固定スタックバッファに格納しますが、入力長のチェックは一切行われません。タイムゾーン略称が 24 バイトを超えると、strcpy() がヒープメモリに対して領域外書き込みを行います。
トリガーパス:
SET TIME ZONE '<超长缩写>+00';
SELECT to_char(now()::timestamptz, 'TZ');
↓
DCH_to_char() → DCH_from_char_action()
↓
strcpy(buf, tmtcTzn(...)) ← 堆溢出
V12 Security の PoC は次の 3 つのステージで構成されています:
ヒープオーバーフローで隣接するヒープオブジェクトを破壊し、PIE ベースアドレスとヒープポインタを漏洩させて ASLR をバイパスします。
ラージオブジェクトまたは bytea フィールドを利用して、ヒープ上に ROP ガジェットチェーンを配置します。
2 回目のオーバーフローでヒープ上の関数ポインタを上書きし、ROP チェーンにジャンプして任意のコマンドを実行します(postgres ユーザー権限で)。
poc.py - 完全なエクスプロイトスクリプト(210 行、PostgreSQL 19beta1 向け)requirements.txt - Python 依存関係(psycopg、pwntools)docker-compose.yml - 脆弱性テスト環境docker-compose up -d
コンテナの起動が完了するまで待ちます(ヘルスチェックに合格):
docker logs pg-tzlab
pip install -r requirements.txt
python3 poc.py
デフォルトでは 127.0.0.1:55432 に接続し、ユーザー名は postgres、パスワードは postgres です。
エクスプロイトが成功すると、コンテナログにコマンド実行の出力が表示されます:
docker logs pg-tzlab | grep PWNED
poc.py 内の定数を編集します:
HOST, PORT - 対象アドレスDEFAULT_COMMAND - 実行するコマンド⚠️ 重要:この PoC は特定ビルドのオフセットアドレスをハードコードしています(postgres:19beta1 Docker イメージ sha256:a6bdd01...)。他のバージョンではガジェットの再配置が必要です。
SET TIME ZONE 文(50 文字超)を監視する⚠️ 本 PoC はセキュリティ研究、脆弱性検証、防御的テストのみを目的としています。
本 PoC を使用する場合、現地の法令と対象システムの認可範囲を遵守することに同意したものとみなされます。