
CVE-2026-2005 の PoC
PostgreSQL pgcrypto拡張機能のPGPセッションキー解析におけるヒープベースのバッファオーバーフローに対するPoCエクスプロイト。任意のメモリ読み取り/書き込みとスーパーユーザーへの権限昇格を実現します。
詳細な技術情報は、Zeroday Cloudアドバイザリを参照してください。

脆弱性のあるコミットからPostgreSQLをクローンし、コンパイルして、バイナリのシンボルオフセットが正確に一致するようにします。エクスプロイトは、漏洩したポインタをELFシンボルオフセットと照合することでASLRベースを解決します。ビルドやバージョンが異なるとオフセットが異なり、失敗します。
git clone https://github.com/postgres/postgres.git
cd postgres
git checkout 4b324845ba5d24682b9b3708a769f00d160afbd7
./configure \
--prefix="$HOME/projects/pg/pgsql" \
--with-libxml \
--with-libxslt \
--enable-debug \
--with-ssl=openssl
make -j$(nproc)
make install-world-bin
pip install -r requirements.txt
python poc.py \
--binary "$HOME/projects/pg/pgsql/bin/postgres" \
--dbname test-db \
--host 127.0.0.1 \
--port 5432 \
--user test-user \
--password secret \
--cmd id
エクスプロイトは7つの段階で進行します:
ヒープポインタリーク - 細工されたPGPメッセージがmdstバッファのmallocチャンクヘッダを破損します。PostgreSQLが破損したチャンクに対してpfree()を呼び出すと、アロケータはポインタアドレスを含むエラーを発行し、mdst->dataのヒープ位置をリークします。
任意読み取り - 2回目のオーバーフローでmdst->dataを書き換えて(leaked_ptr - 0x10000)を指すようにします。復号後、mbuf_steal_data()はそのアドレスの内容を復号された出力として返し、古いコードポインタを含む可能性のあるヒープメモリをダンプします。
ポインタスキャン - 16進ダンプから、コードアドレス(0x500000000000以上)のように見えるがヒープ領域にはない8バイトのリトルエンディアン値をスキャンします。これらは候補PIE(位置独立実行可能ファイル)ポインタです。
PIEベース投票 - 各候補アドレスをpostgresバイナリのELFシンボルオフセットと照合します。ページオフセットが一致する(addr - sym_offset)ペアごとに投票が行われます。10票以上の候補が保持され、投票数でソートされた最小のベース(PIEは最低マッピングELFセグメント)が最有力候補となります。
PIEベース検証 - 任意読み取りプリミティブを使用して、エクスプロイトは(candidate_base + current_user_offset)のCurrentUserIdを読み取り、セッションの既知のOIDと比較します。一致すればPIEベースが確定します。
任意書き込み - オーバーフローはmsrcとの両方のMBufヘッダを破損します。偽装された/は、暗号化されたスーパーユーザーOID(10)を含む埋め込みsym暗号化パケットを指します。偽装されたはを指します(はのが出力長を最初の4バイトに書き込むことを考慮しています)。
pip install -r requirements.txt)pgcryptoを有効にしてコンパイルされたPostgreSQLこのProof of Conceptは教育および防御研究目的のみです。所有しているシステム、またはテストする明示的な許可を得たシステムに対してのみ使用してください。
| Argument | Default | Description |
|---|
--binary | (postgres binary) | シンボル抽出用のpostgresバイナリへのパス |
--dbname | postgres | ターゲットデータベース名 |
--host | localhost | PostgreSQLホスト |
--port | 5432 | PostgreSQLポート |
--user | postgres | データベースユーザー |
--password | (empty) | データベースパスワード |
--cmd | whoami | 権限昇格後に実行するOSコマンド |
--gdb | (flag) | オーバーフローポイントでtmux経由でGDBをアタッチ |
mdstmsrc->dataread_posmdst->dataCurrentUserId - 4-4pgp-pgsql.c:533SET_VARSIZE権限昇格 - CurrentUserIdが10(bootstrapスーパーユーザー)に上書きされると、COPY FROM PROGRAMが指定されたOSコマンドをpostgresシステムユーザーとして実行します。