# PostgreSQL 一次修補 52 個漏洞（CVE-2026-6460 等）：先更新，再看誰建得了物件

> PostgreSQL 18.7、17.12、16.16、15.20、14.25 修補 52 個漏洞，其中 32 個 CVSS 評 8.8。多數要先登入而且建得了物件才打得到，先更新，再清點哪些帳號有這個能力。

原文：https://sheng.page/posts/postgresql-cve-2026-6460-what-to-check/ · 發布：2026-11-13 · 作者：Sheng

PostgreSQL 在 2026 年 11 月 12 日發布 18.7、17.12、16.16、15.20 與 14.25，一次修補 52 個漏洞，其中 32 個的 CVSS 評 8.8。討論最多的是 CVE-2026-6460，能登入資料庫又建得了物件的帳號，可以用跑資料庫的那個作業系統使用者身分執行任意程式。還在支援的 14 到 18 各版，沒升到這幾個版號的都在範圍內。

先更新小版本並重啟，再清點哪些帳號建得了物件。查核到 2026-11-13 09:50（台北時間）為止，官方公告沒有提到在野利用，CISA KEV 最新一版也沒有列入。只是研究者已經公開技術細節，CVE-2026-6460 要的又只是通過驗證、建得了物件的帳號，預設權限下不少一般帳號就符合，應用程式的連線帳號被 SQL injection 借走也算，排修補不必等攻擊被證實。

## 受影響的條件

官方把 CVE-2026-6460 歸為 type confusion。照公告的說法，系統對帶型別的值追蹤不足，值本身也不帶型別資訊，型別改過以後，舊的值還可能留在 data dictionary 項目、PL/pgSQL 變數等地方，被當成另一種型別來用。主要路徑是 `ALTER ... SET DATA TYPE`，公告也寫明還有別的 DDL 路徑。CVSS 3.0 評 8.8，向量是 AV:N/AC:L/PR:L/UI:N，攻擊者要先通過身分驗證，而且得是公告所說的 object creator。

這次更新不能只看一個編號。評 8.8 的 32 個，標題多半直接寫著 executes arbitrary code（可執行任意程式碼），成因包括 type confusion、use-after-free、integer wraparound 和 heap buffer overflow，牽涉到 plpgsql、plperl、pltcl、dblink 與全文檢索函式。另有 6 個出在 client 工具，`pg_dump`、`pg_restore`、`reindexdb`、`vacuumdb`、`pg_basebackup` 都在內，跑備份還原的主機和 CI 也要更新，光升資料庫伺服器不夠。不必登入的只有少數，其中 CVE-2026-116322 未經驗證就能觸發，評 5.3，只影響 18，其他幾個多半要等使用者自己去還原或訂閱對方的資料。

14.25 是 PostgreSQL 14 的最後一版，官方公告寫明 14 從此停止支援，還在 14 上的服務，這次更新完就該把大版本升級排進行程。13 與更早的版本已不在上游支援範圍，這次沒有對應的修補版，用廠商延長支援的就看廠商公告。

## 誰算建得了物件

一般帳號沒給過 CREATE，很容易以為這件事輪不到自己，可是照 PostgreSQL 文件，每個資料庫建立時就把 CONNECT 與 TEMPORARY 給了 PUBLIC，任何登入得了的角色都建得了暫存資料表。15 起新建資料庫的 public schema 不再讓 PUBLIC 建物件，但 release notes 寫明升級或還原 dump 會保留原本的權限，從 14 以前一路升上來的叢集，public 可能還開著。

下面是在 OrbStack 上用官方 image 做的清點，只建一個角色、查系統目錄，沒有執行任何改型別的語句，也沒有重現漏洞。兩個全新的叢集各建一個只有 LOGIN 的角色 `lowpriv`，再跑同一段查詢：

```sql
select r.rolname,
       has_database_privilege(r.oid, current_database(), 'TEMPORARY') as temp,
       (select string_agg(n.nspname, ',') from pg_namespace n
         where n.nspname !~ '^pg_' and n.nspname <> 'information_schema'
           and has_schema_privilege(r.oid, n.oid, 'CREATE')) as create_in,
       (select count(*) from pg_class c
         where c.relowner = r.oid and c.relkind in ('r','p')) as owned_tables
from pg_roles r
where r.rolcanlogin and not r.rolsuper
order by 1;
```

實際輸出，上面是 postgres:18.7，下面是 postgres:14.25：

```text
 rolname | temp | create_in | owned_tables 
---------+------+-----------+--------------
 lowpriv | t    |           |            0

 rolname | temp | create_in | owned_tables 
---------+------+-----------+--------------
 lowpriv | t    | public    |            0
```

什麼權限都沒給的角色，兩版都拿得到 TEMPORARY，14.25 還能在 public 建物件。這段查詢唯讀，可以直接在每個資料庫跑一次，`temp` 是 t、`create_in` 有值或 `owned_tables` 大於 0 的帳號，先當成建得了物件。它只是初篩，資料庫層級的 CREATE、要 `SET ROLE` 切過去才拿得到的權限都沒查，`owned_tables` 也只算直接擁有的資料表，查出來全空不代表沒事。

應用程式自己的連線帳號最容易漏掉。不少系統讓同一個帳號兼跑 migration，資料表的擁有者就是它，`ALTER TABLE` 看的是擁有權，收回 schema 的 CREATE 也拿不走這個能力。應用程式若有 SQL injection，以前估損害看的是這個帳號在資料庫裡有多少權限，現在得把資料庫主機上那個作業系統使用者碰得到的東西也算進去，包括資料目錄和同一台主機上的其他資料庫。讓使用者直接下 SQL 的服務，像多租戶平台或報表工具，要排在最前面。

## 收權限只能縮小範圍

還沒辦法馬上更新的話，可以先把預設給出去的權限收回來：

```sql
revoke temporary on database postgres from public;
revoke create on schema public from public;
```

實測收完以後，兩版的 `temp` 都變成 f，14.25 的 `create_in` 也空了。這兩道只收回給 PUBLIC 的授權，直接授予某個角色、或從其他角色繼承來的權限都還在。範圍也各自不同，第一道只改指名的資料庫，寫 `postgres` 就只動到它，第二道只改當下連線那個資料庫的 public，有幾個資料庫就要換名、連進去各做一次。

新建的資料庫也會回到預設，實測裡 TEMPORARY 又是 t，14.25 上 public 的 CREATE 也回來了。先在 `template1` 收過再建，public 的 CREATE 會跟著範本收掉，TEMPORARY 卻還是 t，資料庫層級的權限不從範本複製，每建一個都得再收一次。收之前先確認有沒有程式依賴暫存資料表，報表和批次作業常用。

Red Hat 的緩解建議也是限制網路連線，並收回不受信任帳號的建物件權限。官方公告沒有列 workaround，又寫明攻擊路徑不只一條，收完權限能擋下哪些我沒有驗證，所以這只算縮小範圍，真正的修補還是更新。長遠來看，跑 migration 的帳號該和服務平常連線的帳號分開，平常那個只留每天用得到的權限，下次遇到同類漏洞，要清點的範圍就小得多。

## 各家的狀態

| 對象 | 查核時狀態 |
| --- | --- |
| 上游 PostgreSQL | 18.7、17.12、16.16、15.20、14.25 已於 2026-11-12 發布，14.25 是 14 的最後一版 |
| 官方 Docker image | `postgres:18.7`、`17.12`、`14.25` 已經可以 pull，實測版本字串為 18.7 (Debian 18.7-1.pgdg13+2) 等 |
| Debian | bookworm 15.19、trixie 17.11、forky 18.6 仍未修正（open），sid 已是 18.7-1 |
| Ubuntu | archive 最新仍是 jammy 14.24、noble 16.15、resolute 18.6，發布日 2026-08-20 |
| Red Hat | 評為 Important，CVE 資料仍是 draft，只列 Hardened Images 的 postgresql17、postgresql18、libpq 為 Affected，尚無 RHSA，沒列到的產品不能當成不受影響 |
| RDS、Cloud SQL、AlloyDB、Azure | 版本頁與 release notes 最新仍是 18.6 這一輪，未見這次修補的公告 |

代管服務有時會自行回補，版本頁沒列只代表查核時看不到，先用 `select version()` 看實際跑的版本，再對照各家針對這次漏洞的公告。Supabase、Neon 等其他服務我只用搜尋找過，沒找到聲明。

## 公開細節、在野攻擊與 KEV

研究者 Mehmet Ince 發表了系列文章描述 CVE-2026-6460 的利用過程，細節已經公開，本文不連結。漏洞彙整站另有標成 PoC 的條目，真偽未驗證。CISA KEV 最新一版是 2026-11-10 發布的 2026.11.10，共 1,779 筆，沒有 CVE-2026-6460，這一版比修補早兩天，能說的只有它還沒列入。

## 清點與更新步驟

1. 列出所有 PostgreSQL，連同 standby 與 replica、容器、代管執行個體、跑 `pg_dump` 與 `pg_restore` 的備份主機和 CI。
2. 逐台用 `select version()` 看實際在跑的版本，套件版本只說明磁碟上裝了什麼。
3. 有修補版就更新小版本並重啟，不用 dump 再還原。官方公告列了幾項更新後的動作，用 `gist_trgm_ops` 的 GiST 索引和沒宣告長度的 `bpchar` 欄位上的 B-tree 索引要 `REINDEX`，GIN 索引懷疑受損時也要，用增量備份的要重做一次完整備份。
4. 用到 C 語言 extension 的，要照新版重新編譯，release notes 寫明這樣才算完整防護，有些 extension 還得改原始碼。新增的 `composite_type_mismatch` 參數可以關掉這批檢查，官方註明關了有安全風險，別拿它當相容性的解法。同一批修補也收緊了 `ALTER COLUMN TYPE`，例如函式的預設運算式依賴那個 composite type 時就不再允許，migration 可能因此失敗，更新前先在測試環境跑一次。
5. 等不到修補版的，先限制誰連得到資料庫的 port，再用上面的查詢清點建得了物件的帳號，把用不到的權限收回來。
6. 還在 14 的，排大版本升級。

```sh
# 伺服器實際在跑的版本，以及這台機器上的 client 工具版本
psql --no-psqlrc --tuples-only --command 'select version()'
pg_dump --version
```

## 補充筆記

- 這次更新修補 52 個漏洞，32 個 CVSS 評 8.8，CVE-2026-6460 只是其中之一。
- 14 到 18 都受影響，修補版是 18.7、17.12、16.16、15.20、14.25，14 從這一版起停止支援。
- 多數漏洞要先登入並建得了物件，而 TEMPORARY 預設就給了 PUBLIC。
- 應用程式帳號若擁有資料表，就要當成建得了物件的帳號來看。
- 收回 TEMPORARY 與 schema 的 CREATE 要逐一資料庫處理，新建的資料庫 TEMPORARY 會再打開，這只是縮小範圍。
- client 工具也在修補清單上，備份主機與 CI 要一起更新，C 語言 extension 要重新編譯。

## 延伸閱讀

- [PostgreSQL 18.7、17.12、16.16、15.20、14.25 發布公告](https://www.postgresql.org/about/news/postgresql-187-1712-1616-1520-and-1425-released-3442/)：PostgreSQL 官方公告，一手來源，漏洞數量、14 停止支援與更新後動作以此為準。
- [PostgreSQL 18.7 release notes](https://www.postgresql.org/docs/release/18.7/)：官方 release notes，一手來源，extension 重新編譯與 `ALTER COLUMN TYPE` 的變更寫在這裡，17.12、14.25 等版本各有對應頁面。
- [CVE-2026-6460](https://www.postgresql.org/support/security/CVE-2026-6460/)：PostgreSQL 官方安全公告，一手來源，含描述與 CVSS。
- [PostgreSQL Security Information](https://www.postgresql.org/support/security/)：官方 CVE 總表，一手來源，52 個漏洞的版本與評分逐列可查。
- [Privileges](https://www.postgresql.org/docs/current/ddl-priv.html)：PostgreSQL 官方文件，一手來源，說明各權限與預設給 PUBLIC 的項目。
- [PostgreSQL 15 release notes](https://www.postgresql.org/docs/release/15.0/)：官方 release notes，一手來源，public schema 預設權限的變更。
- [Versioning Policy](https://www.postgresql.org/support/versioning/)：官方支援政策，一手來源，各大版本的最終發布日。
- [Red Hat Security Data API：CVE-2026-6460](https://access.redhat.com/hydra/rest/securitydata/cve/CVE-2026-6460.json)：Red Hat 的廠商資料，查核時仍是 draft。
- [Debian security tracker CVE-2026-6460](https://security-tracker.debian.org/tracker/CVE-2026-6460)：Debian 官方追蹤頁，一手來源，看各版修補狀態。
- [Launchpad postgresql-16](https://launchpad.net/ubuntu/+source/postgresql-16)：Ubuntu 套件發布紀錄，一手來源，其他大版本換套件名稱即可。
- [CISA Known Exploited Vulnerabilities Catalog](https://www.cisa.gov/known-exploited-vulnerabilities-catalog)：CISA 官方清單，一手來源，收錄已證實遭利用的漏洞。
- [Type safety（Wikipedia）](https://en.wikipedia.org/wiki/Type_safety)：百科條目，只當型別錯誤的背景知識。

> 想法與技術判斷出自 Sheng，和 Claude 一起起草 · Codex 與 Grok 二審；權限清點在 OrbStack 以 postgres:18.7、postgres:14.25 實測，未重現漏洞；資料查核至 2026-11-13 09:50（台北時間）