PostgreSQL 一次修補 52 個漏洞 十四分支同步步入終點

PostgreSQL 安全更新 52 漏洞

PostgreSQL 全球開發組於 2026 年 11 月 12 日發布 18.7、17.12、16.16、15.20、14.25,以及 19 第二個候選版本(19 RC 2)。這次更新合共修補 52 個安全漏洞與超過 140 個程式錯誤,多個漏洞的 CVSS 3.1 評分達 8.8,屬於可執行任意程式碼的類型混淆與 use-after-free 問題[1]。

高危漏洞集中在類型混淆

官方公告列出的漏洞中,大量條目描述為類型混淆後執行任意程式碼,涉及 ALTER ... SET DATA TYPE、輸出參數、平行 RECORD、複合類型別位藉值、plperl 預編譯查詢等路徑,CVSS 評分普遍為 8.8,具備低權限的已認識帳戶即可觸發[1]。另有 pg_restore 缺少非 plain 封存檔驗證、pg_dump 的 not-null 約束名稱導致 SQL 注入等問題,部分只需受害者誘入惡意封存檔便會中招。

權限邊界方面,INSERT ... ON CONFLICT 可繞過自動更新檢查的 WHERE 條件,亦可無視行級安全政策讀取資料;DROP OWNED 能移除不屬於自己的資料表的 restrictive row security 政策。vacuumdb --missing-stats-only 更可讓資料庫擁有者以 vacuumdb 使用者身分執行程式碼。這些問題顯示,即使用已限制資料庫權限,仍難假定帳戶之間完全隔離。

更新後需要動手的地方

官方明確指出這是累積更新,不需要 dump 與 reload,也不需要 pg_upgrade,停止服務並替換二進位即可[1]。但若曾懷疑 GIN 索引受影響,須以 REINDEX INDEX 重建;使用 pg_trgm 的話,要重建所有採用 gist_trgm_ops 的 GiST 索引。

如果讀取資料表時出現 missing chunk number 錯誤,代表 TOAST 相關索引可能已失效,需要以 REINDEX TABLE 一併重建。使用增量備份的環境,官方建議更新後先做一次完整備份,再以差異備份作為後續增量備份的基礎。分區表方面,過去可能存在 NOT NULL NO INHERIT 約束,公告提提供查詢語句列出受影響約束,開發者可選擇刪除,或以 ALTER TABLE ... ALTER CONSTRAINT ... INHERIT 修復,後者在任何分區含 NULL 值時會失敗。

此外,本次更新把時區資料更新至 tzdata 2026f,涉及加拿大西北地區與湄公河省改為全年固定時區,以及古巴夏季節氣節約時間的約定時間。

十四分鐘終止支援

公告同時宣布 14.25 是 PostgreSQL 14 的最後一個版本,即刻分正式終止支援,不再提供安全與錯誤修正。仍在生產環境運營 14 的機構,需要計劃升級至受支援版本。按官方版本政策,每個主版本自首個版本起提供五年支援,錯過終止支援之後,即使發現新漏洞也不會有修補[3]。

PostgreSQL 19 方面,RC 2 修正了多項候選期發現的問題,包括回傳 JSON_ARRAY()、JSON_OBJECT() 在表達式索引、生成藉位與分割鍵的使用(這些索引可能變成過時),以及 GROUPING SETS 結構錯誤、first_value() 與 nth_value() 配合 IGNORE NULLS 的無限迴圈等。如果在測試 19 期建立過相關索引或生成藉位,升級前必須先刪除或重新定義,否則 pg_dump、pg_restore 與 pg_upgrade 會失效。官方計劃若無意外,19 將於 2026 年 11 月 19 日正式發布[1]。

升級注意

實務上建議先在測試環境驗證,重點驗證含 GIN 與 pg_trgm 索引的查詢是否仍返回正確結果,然後才在生產環境滾動更新。自行編譯的環境需同步更新 contrib 及 plperl、pltcl 等程式語言模組,否則部分修正不會生效。個別高危漏洞的技術細節可參考官方安全公告,例如 ALTER ... SET DATA TYPE 的類型混淆問題[2]。

參考資料

[1] PostgreSQL 18.7, 17.12, 16.16, 15.20, 14.25, and 19 RC 2 Released!(2026-11-12)

[2] CVE-2026-6460: Type confusion after ALTER … SET DATA TYPE

[3] PostgreSQL Versioning Policy

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

*