PostgreSQL の脆弱性 CVE-2026-6460 などを直すため、PostgreSQL は2026年11月12日、サポート中のすべての版の更新(18.7・17.12・16.16・15.20・14.25)を出し、52件の脆弱性と140件超の不具合を直した。 中でも CVE-2026-6460(CVSS 8.8)は、ALTER … SET DATA TYPE などで型を変えたあとに古い型の値が残る「型の取り違え」で、オブジェクトを作れる認証済みユーザーが、データベースを動かす OS ユーザーとして任意のコードを実行できる。発見者の1人の Mehmet Ince 氏は、原因の仕組みが2004年からあったと書き、PostgreSQL 18.6 でサーバーのシェルを取る実演を公開した。

TIMELINECVE-2026-6460 の経緯

2004年の仕組みが、2026年11月の更新でようやく直った

  1. 2004.5

    原因の仕組みが入る

    ALTER COLUMN ... TYPE で、複合型の列の型を後から変えられるようになる

  2. 2015.5

    攻撃に使った仕組みが入る

    展開済みオブジェクトのポインタと、その呼び出し口が加わる

  3. 2026.8

    発見者がクラウド各社に PoC を共有

    AWS・Azure・Google・Supabase などのマネージド PostgreSQL に個別に報告

  4. 11/9

    修正のコミット(2026年)

    型の取り違えを防ぐ「傘」の修正。関連の亜種も同時に直す

  5. 11/12

    18.7・17.12・16.16・15.20・14.25 を公開

    52件の脆弱性と140件超の不具合を修正。14 は今回で保守終了

出典: PostgreSQL のリリース告知(2026-11-12)、発見者 Mehmet Ince の解説(2026-11-09)

まず、動いているサーバーの版を確かめる。psql で次のクエリを実行すると、修正済みかどうかを返す。

SELECT current_setting('server_version') AS version,
  CASE
    WHEN v >= 190000 THEN '19系:RC 2 以降か確かめる'
    WHEN v >= 180007 THEN '修正済み'
    WHEN v BETWEEN 170012 AND 179999 THEN '修正済み'
    WHEN v BETWEEN 160016 AND 169999 THEN '修正済み'
    WHEN v BETWEEN 150020 AND 159999 THEN '修正済み'
    WHEN v BETWEEN 140025 AND 149999 THEN '修正済み(14は今回で保守終了)'
    ELSE '要更新'
  END AS status
FROM (SELECT current_setting('server_version_num')::int AS v) s;

30秒でわかる CVE-2026-6460(2026年11月12日の公式発表)

  • ・何が起きる:オブジェクトを作れる認証済みユーザーが、サーバーの OS ユーザーとして任意のコードを実行できる(CVSS 8.8)
  • ・直った版:18.7・17.12・16.16・15.20・14.25。13 以前に修正版はない。14 は今回で保守終了
  • ・攻撃の条件:ログインできること。一時オブジェクトを作る権限は既定で全員にあるので、低い権限のアカウントでも条件を満たしうる
  • ・同じ更新で直ったもの:52件。うち32件が CVSS 8.8、27件がコード実行。pg_dump や pg_restore などクライアント側のツールも含む
  • ・やること:サーバーとクライアントのツールを更新。すぐにできなければ、信頼できないロールから CREATE と TEMPORARY を外す

まずやること

・自分でサーバーを運用している:上のクエリで「要更新」なら、修正済みのバージョンに上げる。すぐに上げられなければ、下の「対策」の2で作成権限を絞る
・マネージドサービス(RDS・Azure・Cloud SQL・Supabase など)を使っている:自分ではバイナリを入れ替えられない。事業者の告知と、マイナーバージョンの更新の予定を確かめる
・運用端末や CI で pg_dump・pg_restore を使っている:クライアントのパッケージも更新する。他人から受け取ったダンプは、更新前の pg_restore で戻さない

PostgreSQL まわりの脆弱性では、管理ツールの pgAdmin 脆弱性 CVE-2026-116241|Import/ExportのOSコマンドインジェクション も10月に出ている。依存先の脆弱性を含めた守り方の全体像は サプライチェーン攻撃とは|手口・防御ツール比較・npm 12の新機構まで実践解説 にまとめた。

CVE-2026-6460 の時系列

日付 出来事 出どころ
2004年5月5日 ALTER TABLE … ALTER COLUMN … TYPE が入り、複合型の列の型を後から変えられるようになる。今回の型の取り違えの元になった仕組み 発見者の解説
2015年5月14日 展開済みオブジェクトのポインタと、その呼び出し口が入る。発見者が攻撃に使った仕組み 発見者の解説
2026年4月ごろ 発見者が、マネージド PostgreSQL を使えるかを調べる中で研究を始める 発見者の解説
2026年8月中旬 発見者が AWS(Aurora・RDS)、Microsoft Azure、Supabase などに検証用のコードを共有。Google も AlloyDB の報告を最優先(P0)に格上げした(時期の記載はない) 発見者の解説
2026年11月9日 PostgreSQL の修正のコミットが入る。発見者が解説を公開 発見者の解説
2026年11月12日 18.7・17.12・16.16・15.20・14.25 と 19 RC 2 を公開。52件の脆弱性を修正 PostgreSQL のリリース告知
2026年11月19日 PostgreSQL 19 の正式版の予定 PostgreSQL のリリース告知

CVE-2026-6460 は、PostgreSQL が「傘」として扱った修正だ。発見者によると、同じ根の問題として21件を報告し、52件のうち6件がこの研究に直接つながる(CVE-2026-6460、120142、120148、116329、116306、120139)。修正のコミットには14人の報告者の名前があり、OpenAI のセキュリティ研究チームや Anthropic の研究者も含まれる。発見者は、自分はサイバー攻撃向けの AI モデルを使わずにたどり着いたと書き、AI の時代の脆弱性研究では同じ弱点に複数の道からたどり着くことがあると述べている。

何が起きたか:型を変えたあとに古い値が残る

PostgreSQL の値は、自分がどの型かを持っていない。型の情報は別の場所(データ辞書)にあり、値はそれに従って読まれる。公式の説明では、型を変えたあとも古い型の値が、データ辞書の項目、PL/pgSQL の変数など、システムのあちこちに残りえた。

発見者の実演の流れはこうだ。一時オブジェクト用のスキーマ(pg_temp)に、項目が1つの複合型を作る。その型を使うクエリを準備(PREPARE)してから、項目の型を変え、準備したクエリを実行する。すると PostgreSQL は、古い型で作られた値を新しい型として扱う。発見者はここから、メモリの中身を読み書きし、アドレスの乱数化を破り、最後に system() を呼ぶところまでつなげた。

公式は、主な攻撃の道を ALTER … SET DATA TYPE としつつ、ALTER TABLE ... ADD COLUMN; ROLLBACK; ALTER TABLE ... ADD COLUMN のような別の DDL の道もあるとしている。

PRECONDITIONS攻撃が成り立つ条件

外から誰でもではない。ログインできて、型を作れるアカウントが要る

  1. 1.データベースにログインできる

    認証を通らない攻撃はできない(Red Hat の評価も同じ)

  2. 2.オブジェクトを作れる

    スキーマの CREATE 権限、または一時オブジェクトの TEMPORARY 権限

  3. 3.一時オブジェクトの権限は既定で全員にある

    低い権限のロールでも pg_temp に型を作れた(16.15 で確認)

  4. 4.成功するとサーバーの OS ユーザーでコードが動く

    データベースのデータとサーバー上のファイルに手が届く

出典: PostgreSQL の CVE-2026-6460 のページ、Red Hat の評価、PostgreSQL 16.15 での手元の確認(2026-11-14)

攻撃の条件は、ログインできることと、オブジェクトを作れることだ。Red Hat は、認証が前提なので認証なしのリモート攻撃にはならないとして、評価を Important(重要)にしている。

ただし、「オブジェクトを作れる」の範囲は思ったより広い。一時オブジェクトを作る TEMPORARY 権限は、データベースを作ったときに PUBLIC(全員)へ与えられる。PostgreSQL 16.15 の手元のクラスタで、スキーマへの CREATE 権限を持たない一般のロールを作って試したところ、CREATE TYPE pg_temp.poc AS (key uuid); は成功した。PostgreSQL 14 以前では、public スキーマへの CREATE 権限も既定で全員にある。アプリ用のアカウントや、分析・読み取り用に配ったアカウントも、攻撃の入り口になりうる。

成功すると、PostgreSQL のサーバーを動かす OS ユーザー(多くは postgres)としてコードが動く。そのデータベースのデータ全体と、サーバー上のファイルに手が届く。

同じ更新で直った52件の内訳

種類 件数 例
CVSS 8.8 32件 CVE-2026-6460(型の取り違え)、plperl の解放後使用、pg_restore のアーカイブ検証の欠落
任意のコード実行につながるもの 27件 型の取り違え、解放後使用、整数のあふれ
PL/Perl・PL/Tcl の手続き言語 6件 plperl・pltcl の解放後使用
クライアント側のツール 6件 pg_dump(SQL インジェクション、psql のコマンド注入)、pg_restore、reindexdb、vacuumdb、pg_basebackup
認証の前に起きるもの 1件 取り消し要求でスピンロックが漏れる(CVE-2026-116322、CVSS 5.3)

クライアント側のツールの脆弱性は、サーバーのバージョンを上げても直らない。たとえば CVE-2026-116314 は、細工したアーカイブを pg_restore に読ませるとコードが実行される。他人から受け取ったダンプを戻す運用では、運用端末や CI に入っている pg_dump・pg_restore も新しいバージョンにする。

PostgreSQL 14 は 14.25 が最後のリリースで、今後の修正は出ない。13 以前はすでに保守が終わっていて、今回の52件の修正版はない。

CVE-2026-6460 の対策:更新と、作成権限の絞り込み

WHAT TO DOやることの順番

まず更新。すぐできないなら作成権限を絞る

  1. 版を確かめる

    修正版は 18.7・17.12・16.16・15.20・14.25

  2. 更新する

    マイナー更新はバイナリの入れ替えだけ。マネージドは事業者の告知を確認

  3. 作成権限を絞る

    信頼できないロールから CREATE と TEMPORARY を外す

  4. 更新後の作業

    対象の索引の REINDEX、増分バックアップの取り直し

出典: PostgreSQL のリリース告知の Updating の節、Red Hat の緩和策

1. 更新する。 マイナーバージョンの更新なので、ダンプと再読み込みや pg_upgrade は要らず、PostgreSQL を止めてバイナリを入れ替える。ただし、下の3に当てはまる場合や、何回かの更新を飛ばしてきた場合は、入れ替えのあとに追加の作業が要る。サーバーだけでなく、psql・pg_dump・pg_restore などクライアントのパッケージも更新する。マネージドサービスでは自分でバイナリを入れ替えられないので、事業者の告知と更新の予定を確かめる。

2. すぐに更新できないなら、作成権限を絞る。 Red Hat は、PostgreSQL への接続を信頼できる管理用のホストに限り、信頼できないアカウントからオブジェクト作成の権限を外すよう勧めている。ここでいう権限には、スキーマへの CREATE だけでなく、データベースの TEMPORARY も含めて考える。手元の 16.15 では、REVOKE TEMPORARY ON DATABASE postgres FROM PUBLIC; のあと、同じ一般のロールで pg_temp に型を作ろうとすると、permission denied to create temporary tables で止まった。ただし、一時テーブルを使うアプリはこれで動かなくなる。外したあとは、必要なロールにだけ TEMPORARY を与え直す。権限の絞り込みは時間稼ぎで、更新の代わりにはならない。

3. 更新したら、同じリリースで直った不具合の後始末をする。 CVE-2026-6460 とは別に、このリリースは索引やバックアップが壊れる不具合も直している。リリース告知の「Updating」の節は次の作業を挙げている。

当てはまる場合 更新後にやること
GIN 索引が壊れている疑いがある その索引を REINDEX
pg_trgm の GiST 索引(gist_trgm_ops)を使っている その索引を REINDEX
表を読むと missing chunk number のエラーが出る 表を REINDEX(TOAST 表も作り直される)
長さを指定しない bpchar の列に B-tree 索引がある その索引を REINDEX(char(n) は対象外)
増分バックアップを使っている 新しい完全バックアップを取り、以後の増分の起点にする
パーティション表に NOT NULL NO INHERIT の制約がある 告知のクエリで探し、外すか INHERIT に直す

何回かの更新を飛ばしてきた場合は、間の版のリリースノートの作業も要る。

自分のシステムを確かめるコマンド

冒頭の版のクエリに加えて、オブジェクトを作れるロールを洗い出す。スーパーユーザーでない、ログインできるロールごとに、一時オブジェクトを作れるか(can_create_temp)と、どこかのスキーマにオブジェクトを作れるか(can_create_in_schema)を返す。

SELECT r.rolname,
  has_database_privilege(r.oid, current_database(), 'TEMPORARY') AS can_create_temp,
  EXISTS (
    SELECT 1 FROM pg_namespace n
    WHERE n.nspname NOT LIKE 'pg\_%' AND n.nspname <> 'information_schema'
      AND has_schema_privilege(r.oid, n.oid, 'CREATE')
  ) AS can_create_in_schema
FROM pg_roles r
WHERE r.rolcanlogin AND NOT r.rolsuper
ORDER BY 1;

PostgreSQL 16.15 の手元のクラスタで、一般のロール(app_user)とスキーマの持ち主(app_owner)を作って試した結果は次のとおりだ。

状態 app_user app_owner
既定 一時オブジェクトを作れる(t)、スキーマには作れない(f) 一時オブジェクトを作れる(t)、スキーマに作れる(t)
REVOKE TEMPORARY ... FROM PUBLIC のあと どちらも作れない(f・f) スキーマにだけ作れる(f・t)

t が並ぶロールは、更新が終わるまで攻撃の条件を満たす。このクエリは今つないでいるデータベースだけを見るので、データベースごとに実行する。この結果だけでは、攻撃を受けたかどうかは言えない。判定しているのは、条件を満たすロールがあるかという構成だけだ。冒頭の版のクエリも同じで、「修正済み」はこの更新を当てたことを示すだけで、更新の前に侵入されていないことまでは示さない。

コンテナでバージョンを固定している場合は、リポジトリの中も探す。古いバージョンのイメージを指定している箇所が見つかる。

git fetch --all --prune
grep -rnE "(image:|FROM)[[:space:]\"']*[^[:space:]\"']*postgres(ql)?:[0-9]" --include='Dockerfile*' --include='*.yml' --include='*.yaml' .

postgres:16.4 のようなバージョンの指定が見つかったら、修正済みのバージョン(PostgreSQL 16.16 など)以降に上げる。何も見つからなくても、イメージを固定していないだけで、動いているコンテナが修正済みとは限らない。postgres:16 のようにメジャー版だけの指定は、イメージを取り直せば修正版になるが、手元に古いイメージが残っていないかを確かめる。接続文字列の postgres:5432 のような書き方には当たらない。マネージドサービスの版の指定(Terraform の engine_version など)は、このコマンドでは探さないので、別に確かめる。

影響範囲と、まだわかっていないこと

対象 影響
PostgreSQL 18.0〜18.6 影響あり。18.7 で修正
PostgreSQL 17.0〜17.11 影響あり。17.12 で修正
PostgreSQL 16.0〜16.15 影響あり。16.16 で修正
PostgreSQL 15.0〜15.19 影響あり。15.20 で修正
PostgreSQL 14.0〜14.24 影響あり。14.25 で修正(14 は今回で保守終了)
PostgreSQL 13 以前 公式の表に修正版はない(保守終了)
PostgreSQL 19 RC 2 に修正を含む。正式版は11月19日の予定
マネージド PostgreSQL・互換製品 発見者は、試したすべての事業者が影響を受けたと書いている。対応は各事業者の告知を確かめる

まだわかっていない点は次のとおりだ。

・実際の悪用:公式の発表に、悪用が確認されたという記載はない
・攻撃コードの公開:発見者は 18.6 での実演の動画を公開したが、攻撃コード自体の公開は確かめられていない
・マネージドサービスごとの対応状況:発見者は事業者が独自の緩和策を入れたと書いているが、事業者ごとの完了時期は示していない
・互換製品への影響:PostgreSQL 互換をうたう製品への影響は、発見者の記述にとどまる

発見者は、11月30日のプラハの PostgreSQL ミートアップで、この研究の詳しい話をすると告知している。

ウェブサーバーで同じ週に出た重大な脆弱性は Apache 脆弱性 CVE-2026-119618|mod_http2のRCEを2.4.71で修正、対象と確認方法 にまとめた。

参照ソース

・CVE-2026-6460: PostgreSQL type confusion after ALTER … SET DATA TYPE executes arbitrary code(PostgreSQL)
・PostgreSQL 18.7, 17.12, 16.16, 15.20, 14.25, and 19 RC 2 Released!(PostgreSQL・2026-11-12)
・Part 3/6 | How I Ended Up Turning a 22-Year-Old PostgreSQL Type-Confusion Primitive into RCE (CVE-2026-6460)(Mehmet Ince・2026-11-09)
・CVE-2026-6460(Red Hat Customer Portal)
・PostgreSQL Versioning Policy(PostgreSQL)