PostgreSQL 17.1、16.5、15.9、14.14、13.17 和 12.21 版本已發布!

發表於 2024-11-14,作者:PostgreSQL 全球開發團隊
PostgreSQL 專案 安全性

PostgreSQL 全球開發團隊已發布對所有支援的 PostgreSQL 版本的更新,包括 17.1、16.5、15.9、14.14、13.17 和 12.21。此版本修復了 4 個安全性漏洞以及過去幾個月報告的 35 多個錯誤。

如需完整的變更列表,請查看發布說明

PostgreSQL 12 終止支援通知

這是 PostgreSQL 12 的最後一個版本。PostgreSQL 12 現在已終止支援,將不再接收安全性與錯誤修復。如果您在生產環境中執行 PostgreSQL 12,我們建議您規劃升級到更新、受支援的 PostgreSQL 版本。請參閱我們的版本政策以取得更多資訊。

安全性問題

CVE-2024-10976:PostgreSQL 列安全性低於例如子查詢,忽略使用者 ID 變更

CVSS v3.1 基本分數:4.2

受影響的、存在漏洞的版本:12 - 17。

PostgreSQL 中對具有列安全性的表格追蹤不完整,允許重複使用的查詢檢視或變更與預期不同的列。CVE-2023-2455CVE-2016-2193 修復了列安全性與使用者 ID 變更之間的大多數互動。它們遺漏了子查詢、WITH 查詢、安全性呼叫者檢視或 SQL 語言函數引用具有列級安全性策略的表格的情況。這與先前的兩個 CVE 具有相同的後果。也就是說,在使用了角色特定策略並且在一個角色下規劃了給定的查詢,然後在其他角色下執行時,它可能導致應用不正確的策略。這種情況可能發生在安全性定義器函數中,或者在最初規劃了常見使用者和查詢,然後在多個 SET ROLE 中重複使用時。

應用不正確的策略可能允許使用者完成原本禁止的讀取和修改。這僅影響使用了 CREATE POLICY 定義列安全性策略的資料庫。攻擊者必須根據特定應用程式的查詢計劃重複使用、使用者 ID 變更和角色特定列安全性策略的模式來定制攻擊。PostgreSQL 17.1、16.5、15.9、14.14、13.17 和 12.21 之前的版本受到影響。

PostgreSQL 專案感謝 Wolfgang Walther 報告此問題。

CVE-2024-10977:PostgreSQL libpq 保留了來自中間人攻擊的錯誤訊息

CVSS v3.1 基本分數:3.1

受影響的、存在漏洞的版本:12 - 17。

在 PostgreSQL 中,用戶端使用伺服器錯誤訊息允許伺服器在目前的 SSL 或 GSS 設定下不受信任,向 libpq 應用程式提供任意非 NUL 位元組。例如,中間人攻擊者可以發送長錯誤訊息,psql 的人類或螢幕抓取使用者會將其誤認為有效的查詢結果。對於使用者介面清楚地指示一個錯誤訊息和其他文字之間邊界的用戶端,這可能不是問題。PostgreSQL 17.1、16.5、15.9、14.14、13.17 和 12.21 之前的版本受到影響。

PostgreSQL 專案感謝 Jacob Champion 報告此問題。

CVE-2024-10978:PostgreSQL SET ROLE、SET SESSION AUTHORIZATION 重設為錯誤的使用者 ID

CVSS v3.1 基本分數:4.2

受影響的、存在漏洞的版本:12 - 17。

PostgreSQL 中不正確的權限分配允許權限較低的應用程式使用者檢視或變更與預期不同的列。攻擊需要應用程式使用 SET ROLESET SESSION AUTHORIZATION 或等效功能。當應用程式查詢使用來自攻擊者的參數或將查詢結果傳達給攻擊者時,就會出現問題。如果該查詢對 current_setting('role') 或目前的使用者 ID 做出反應,則可能會修改或傳回資料,就好像會話未使用 SET ROLESET SESSION AUTHORIZATION 一樣。攻擊者無法控制哪個不正確的使用者 ID 適用。來自權限較低的來源的查詢文字在這裡不是問題,因為 SET ROLESET SESSION AUTHORIZATION 不是未經驗證的查詢的沙箱。PostgreSQL 17.1、16.5、15.9、14.14、13.17 和 12.21 之前的版本受到影響。

PostgreSQL 專案感謝 Tom Lane 報告此問題。

CVE-2024-10979:PostgreSQL PL/Perl 環境變數變更執行任意程式碼

CVSS v3.1 基本分數:8.8

受影響的、存在漏洞的版本:12 - 17。

PostgreSQL PL/Perl 中不正確的環境變數控制允許沒有權限的資料庫使用者變更敏感的處理程序環境變數 (例如 PATH)。即使攻擊者缺少資料庫伺服器作業系統使用者,這通常也足以啟用任意程式碼執行。PostgreSQL 17.1、16.5、15.9、14.14、13.17 和 12.21 之前的版本受到影響。

PostgreSQL 專案感謝 Coby Abrams 報告此問題。

錯誤修復與改進

此更新修復了過去幾個月報告的 35 多個錯誤。下面列出的問題會影響 PostgreSQL 17。其中一些問題也可能影響其他受支援的 PostgreSQL 版本。

  • 修復連接或分離具有外部鍵約束的表格分割區時的問題。升級後,受此問題影響的使用者需要執行手動步驟才能完成修復。請參閱「升級」部分和發布說明以取得更多資訊。
  • 修復當 LC_CTYPECLC_COLLATE 為不同語言環境時,使用 libc 作為預設定序提供者的問題。這可能會導致不正確的查詢結果。如果您的資料庫中有這些設定,請在更新到此版本後重新索引任何受影響的索引。此問題僅影響 17.0。
  • 多項查詢規劃器修復,包括不允許連接分割區(partitionwise join),如果分割區的定序不符。
  • 修復 MERGE ... WHEN NOT MATCHED BY SOURCE 動作的可能錯誤答案或 wrong varnullingrels 規劃器錯誤。
  • 修復 COPY FORCE_NOT_NULLFORCE_NULL 的驗證。
  • 修復 json_objectagg() 呼叫包含不穩定函數時的伺服器崩潰。
  • 確保分割區表格和 CREATE TABLE ... USING 中指定的非內建存取方法之間存在已註冊的依賴關係。此修復僅防止在此更新之後建立的分割區表格出現問題。
  • 修復提交可序列化交易中的競爭條件。
  • 修復 COMMIT PREPARED 中的競爭條件,該條件可能需要在崩潰並復原後手動刪除檔案。
  • 修復 pg_cursors 檢視,以排除未完全設定的游標來防止錯誤。
  • 減少邏輯解碼記憶體消耗。
  • 修正了當穩定函數從 CALL 陳述式的引數列表中呼叫,且 CALL 位於 PL/pgSQL EXCEPTION 區塊內時,接收到過時的列值的問題。
  • 修正了 ARM (aarch64) 系統上 JIT 崩潰的問題。
  • psql\watch 現在將小於 1 毫秒的值視為 0(執行之間沒有等待)。
  • 修正了無法在密碼檔案 (pgpass) 中使用複製使用者認證的問題
  • pg_combinebackup 現在如果增量備份檔案存在於應該包含完整備份的目錄中,會拋出錯誤。
  • 修正了避免在 vacuumdb 和平行 reindexdb 中重新索引暫存表格和索引的問題。

此版本也將時區資料檔案更新到 tzdata 版本 2024b。此 tzdata 版本將舊的 System-V 相容性時區名稱更改為複製相應的地理時區;例如,PST8PDT 現在是 America/Los_Angeles 的別名。主要可見的後果是,對於標準化時區引入之前的時間戳記,該時區被認為代表命名位置的本地平均太陽時。例如,在 PST8PDT 中,先前的 timestamptz 輸入(例如 1801-01-01 00:00)會被呈現為 1801-01-01 00:00:00-08,但現在會被呈現為 1801-01-01 00:00:00-07:52:58

此外,還包含對墨西哥、蒙古和葡萄牙的歷史修正。值得注意的是,Asia/Choibalsan 現在是 Asia/Ulaanbaatar 的別名,而不是一個獨立的時區,主要是因為發現這些時區之間的差異是基於不可靠的資料。

更新

所有 PostgreSQL 更新版本都是累積的。與其他小版本一樣,使用者無需傾印和重新載入其資料庫或使用 pg_upgrade 即可套用此更新版本;您可以簡單地關閉 PostgreSQL 並更新其二進制檔案。

如果您有一個具有外部鍵約束的分割表格,並且您已經執行了 ATTACH PARTITION/DETACH PARTITION 命令,則需要在升級後採取進一步的步驟。您可以透過在現在獨立的表格上執行 ALTER TABLE ... DROP CONSTRAINT 來修正每個錯誤的約束,然後重新新增約束。如果重新新增約束失敗,您將需要手動重新建立參考表格和被參考表格之間的一致性,然後重新新增約束。

此查詢可用於識別損壞的約束並建構重新建立它們所需的命令

SELECT conrelid::pg_catalog.regclass AS "constrained table", conname AS constraint, confrelid::pg_catalog.regclass AS "references", pg_catalog.format('ALTER TABLE %s DROP CONSTRAINT %I;', conrelid::pg_catalog.regclass, conname) AS "drop", pg_catalog.format('ALTER TABLE %s ADD CONSTRAINT %I %s;', conrelid::pg_catalog.regclass, conname, pg_catalog.pg_get_constraintdef(oid)) AS "add" FROM pg_catalog.pg_constraint c WHERE contype = 'f' AND conparentid = 0 AND (SELECT count(*) FROM pg_catalog.pg_constraint c2 WHERE c2.conparentid = c.oid) <> (SELECT count(*) FROM pg_catalog.pg_inherits i WHERE (i.inhparent = c.conrelid OR i.inhparent = c.confrelid) AND EXISTS (SELECT 1 FROM pg_catalog.pg_partitioned_table WHERE partrelid = i.inhparent));

由於一個或多個 ADD CONSTRAINT 步驟可能會失敗,因此您應該將查詢的輸出儲存到檔案中,然後嘗試執行每個步驟。

此外,如果您正在執行 PostgreSQL 17.0 並使用 libc 作為預設的排序規則提供者,並且已將 LC_CTYPE 設定為 C,而 LC_COLLATE 是不同的語言環境,則需要重建基於文字的索引。您可以使用 REINDEX INDEX CONCURRENTLY 命令來執行此操作。

跳過一個或多個更新版本的用戶可能需要執行額外的更新後步驟;請參閱早期版本的版本說明以獲取詳細資訊。

有關更多詳細資訊,請參閱版本說明

連結

如果您對此版本公告有更正或建議,請將其發送到 pgsql-www@lists.postgresql.org 公共郵件列表