
自己完結型のDockerラボ。CVE-2026-2005(PostgreSQLのpgcrypto拡張機能におけるヒープバッファオーバーフロー)の悪用を練習するためのもので、権限昇格とコンテナ内コード実行を可能にします。
CVE-2026-2005(PostgreSQLのpgcrypto拡張機能におけるヒープバッファオーバーフロー)の悪用を練習するための自己完結型Dockerラボです。スーパーユーザー権限なしでリモートコード実行を可能にします。
影響を受けるバージョン: PostgreSQL ≤ 17.7 / 16.11 / 15.15 / 14.20 / 18.1
修正バージョン: 18.2, 17.8, 16.12, 15.16, 14.21(2026-02-12リリース)
要件: Docker、Docker Compose
git clone <this-repo>
cd CVE-2026-2005
docker compose up -d
PostgreSQLは127.0.0.1:5433で待ち受けます。
アプリケーションの設定ファイルからデータベースの認証情報を入手済みです:
| パラメータ | 値 |
|---|
| ホスト | 127.0.0.1 |
| ポート | 5433 |
| データベース | targetdb |
| ユーザー名 | pentester |
| パスワード | pentester123 |
接続してアクセスを確認します:
psql -h 127.0.0.1 -p 5433 -U pentester -d targetdb
このアカウントはpublicスキーマに対するCREATE権限を持っています。スーパーユーザーではありません。
両方のフラグを取得してラボを完了させてください。
フラグ1 — データベース権限昇格
SELECT * FROM flag_db;
-- DBセッション内でスーパーユーザーに昇格した後にのみ読み取り可能
フラグ2 — コンテナ内コード実行
/var/lib/postgresql/flag.txt
-- コンテナ内でpostgres OSユーザーとしてコマンドを実行した後にのみ読み取り可能
スコープに関する注記:
COPY TO PROGRAMはDockerコンテナ内で実行され、ホスト上では実行されません。 実際の環境における主な影響は、データベース全体の読み取りアクセス(全テーブル、全データベース)です。 Dockerホストへの到達には、別のコンテナエスケープ技術が必要です。
この欠陥はpgcrypto/pgp-pubenc.c内のpgp_parse_pubenc_sesskey()にあります。
公開鍵暗号化セッションキーパケットを復号する際、この関数は攻撃者が制御するRSA/ElGamalペイロードからセッションキーの長さをmsglen - 3として導出し、境界チェックなしで固定32バイトのバッファ(PGP_MAX_KEY)にコピーします。攻撃者はバッファ境界を超えて数百バイトを書き込むことができます。
エクスプロイトは3つの段階で進行します:
dst構造体を破壊して.data内のCurrentUserIdを10(BOOTSTRAP_SUPERUSERID)で上書きしますCOPY (SELECT '') TO PROGRAM '<cmd>'がコンテナ内でpostgresユーザーとしてOSコマンドを実行します。Dockerを使用しない実際のデプロイでは、これはデータベースホスト上でのOSレベルのアクセスを意味します。ASLRレイアウトは同じpostmasterプロセスへのすべての接続で同一であるため、ある接続で漏洩したアドレスは次の接続でも有効です。
pgcrypto/pgp-pubenc.cobjdump -t $(which postgres) | grep CurrentUserIddocker compose down -v
このラボは、許可されたセキュリティ研究および教育のみを目的としています。所有しているシステム、または明示的なテスト許可を得たシステムでのみ実行してください。