
PostgreSQL 18.6 - 高 - リモート - ファイル書き込み - pg_basebackup が CVE-2026-6475 の絶対 tar シンボリックリンク残存を追跡
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · postgres-basebackup-symlink
クラス: ファイル書き込み 到達範囲: リモート
PostgreSQL 18.6 (724edf9) - PostgreSQL Global Development Group
CVE-2026-6475 は tar のメンバー名に対して path_is_safe_for_extraction を追加した。絶対シンボリックリンクターゲットはテーブルスペースが機能するよう、そのチェックを依然としてスキップする。astreamer_file.c はその後ターゲットを symlink() し、後に fopen(..., "wb") がそれを追跡する。デフォルトの pg_basebackup フォーマットは plain (-F p) である。pg_rewind の create_target_symlink はパスをチェックし、決してリンクしない。
BASE_BACKUP を話す敵対的ソースは、絶対シンボリックリンクを植え付け、バックアップ UID が書き込める任意のファイルを上書きできる。 被害者モデルは 6475 と同じ。これはメンバー名チェックの再提出ではない。
| ID | CVE 未割当 |
| クラス | ファイル書き込み (CVE-2026-6475 の絶対 tar シンボリックリンク残存) |
| 到達範囲 | リモート (UI:R クライアント対敵対的 PostgreSQL) |
| CWE | CWE-59, CWE-22 |
| CVSS | High: 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| 製品 | PostgreSQL |
| 影響 | 18.6 タグ REL_18_6 (724edf9bde9d356724ad384a2e196edc3c9f80f7)、ツリー内 pg_basebackup / pg_rewind |
| 認証 | 被害者が攻撃元に対してデフォルトの pg_basebackup -D <dir> を実行 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
オペレーターに自身の PostgreSQL に対して pg_basebackup -D を実行させることができる者 (CVE-2026-6475 と同じ UI:R モデル) は、-D の外側に書き込むことができる。
| 権限 | 手法 / シンク | ラボ実証済みまたは推測 |
|---|---|---|
整合性: -D の外側にファイルを書き込む | 敵対的 BASE_BACKUP tar: 安全な相対名 (pg_tblspc/16384) と絶対リンクターゲットを持つ typeflag '2' メンバー、続いてその名前の下の通常メンバー。extract_link の後 create_file_for_extract が O_NOFOLLOW なしで fopen(..., "wb") | ラボ実証済み。/work/oracle/ に POSTGRES-BASEBACKUP-SYMLINK-WITNESS を書き込んだ。Dest はシンボリックリンクを保持。コントロール tar (シンボリックリンクなし) はオラクルを空のままにし、-D 内に PG_VERSION のみを書き込んだ |
整合性: シェル rc、authorized_keys、systemd ユーザーユニット、または crontab を上書き | 同じシンク、クライアント UID が書き込める任意のパス | 推測。このラボはそれらのファイルに触れない |
| 可用性: クライアント設定や鍵を破壊 | 同じ書き込み | 推測。実証されていない |
| クライアントディスクの偵察 | extract は書き込みであり、読み取りではない | クローズ |
.. または絶対メンバー名を辿る | path_is_safe_for_extraction | クローズ。それが CVE-2026-6475 |
| サーバー側の非特権 SQL / 未認証プロトコル | 18.6 デフォルトサーバー | クローズ。この残存はクライアント側 |
| tar のみのバックアップ | pg_basebackup -F t は展開せずに tar を保存 | クローズ |
postgres 内での RCE | このシンクではない | クローズ |
pg_rewind にも同じ create_target_symlink / open() の残存がある。このラボは pg_basebackup のみを駆動する。
18.6 の波 (28 件の CVE、加えてこのツリーに既にある 18.4/18.2 のセット) の後、postgres/postgres REL_18_6 を固定した。22 回の探索。デフォルトサーバー、非特権 SQL、未認証プロトコル: この基準ではいずれも該当なし。CVE-2026-6475 が再読すべき兄弟であった。
メンバー名はチェックされる。絶対シンボリックリンクターゲットはチェックされない:
if (!is_absolute_path(linktarget) &&
!path_is_safe_for_extraction(member->linktarget))
{
pg_fatal("link target has unsafe path name: \"%s\"",
member->linktarget);
}
extract_link(mystreamer->filename, linktarget);
create_file_for_extract は依然として fopen(filename, "wb") である。astreamer_file.c:351-356 のコメントは、リンクが pg_tblspc 内にあることをチェックせずにマッピングが適用されると述べている。
すでに記録された誤った道: 6475 をクローズ済みとして扱い立ち去ること、-D を稼働中のデータディレクトリに向けること、見せかけのためにシェル rc を上書きすること。正直な 18.6 サーバーは pg_tblspc/<oid> シンボリックリンクのみを発行し、テーブルスペースの内容を別のアーカイブに置く。BASE_BACKUP を話す悪意あるソースは、後続の通常メンバーを同じ tar に入れることができる。それが残存である。
python3 postgres-basebackup-symlink-Abraxas-Labs.py
または
cd lab
./run.sh
ソースイメージとして postgres:18.6 を使用し、BASE_BACKUP スピーカーを実行する。クライアントは同じタグのツリー内 pg_basebackup (pg_basebackup (PostgreSQL) 18.6)。ループバック 127.0.0.1:19370。Compose プロジェクト postgres-basebackup-symlink。-D を稼働中のデータディレクトリに向けないこと。
SUCCESS postgres-basebackup-symlink control-inside=yes oracle-outside=yes dest-is-symlink=yes image=postgres:18.6 how=pg_basebackup POSTGRES-BASEBACKUP-SYMLINK-WITNESS
絶対シンボリックリンクターゲットは、--tablespace-mapping によって書き換えられない限り安全でないものとして扱う。植え付けられたリンクを追跡できないよう、抽出ファイルを O_NOFOLLOW / lstat で開く。path_is_safe_for_extraction を rewind の path だけでなく link にも適用する。-D を離れたシンボリックリンクを経由するパスを持つ通常メンバーを拒否する。
724edf9bde9d356724ad384a2e196edc3c9f80f7)src/fe_utils/astreamer_file.c · src/fe_utils/astreamer_tar.csrc/bin/pg_rewind/file_ops.cGNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。