PostgreSQL 全球開發組已釋出所有受支援版本的 PostgreSQL 更新,包括 17.1、16.5、15.9、14.14、13.17 和 12.21。此次釋出修復了過去幾個月報告的 4 個安全漏洞和 35 個以上的錯誤。
有關更改的完整列表,請參閱 發行說明。
這是 PostgreSQL 12 的最終版本。PostgreSQL 12 現已達到生命週期終點,將不再接收安全和錯誤修復。如果您在生產環境中使用 PostgreSQL 12,我們建議您計劃升級到更新的、受支援的 PostgreSQL 版本。請參閱我們的 版本策略 以獲取更多資訊。
CVSS v3.1 基本評分:4.2
受支援且存在漏洞的版本:12 - 17。
PostgreSQL 中對帶有行安全策略的表跟蹤不完整,允許重複使用的查詢檢視或更改與預期不同的行。 CVE-2023-2455 和 CVE-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 報告此問題。
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 報告此問題。
CVSS v3.1 基本評分:4.2
受支援且存在漏洞的版本:12 - 17。
PostgreSQL 中不正確的許可權分配允許許可權較低的應用程式使用者檢視或更改與預期不同的行。攻擊需要應用程式使用 SET ROLE、SET SESSION AUTHORIZATION 或等效功能。當應用程式查詢使用攻擊者的引數或將查詢結果傳達給攻擊者時,會產生此問題。如果該查詢響應 current_setting('role') 或當前使用者 ID,它可能會修改或返回資料,就好像會話沒有使用 SET ROLE 或 SET SESSION AUTHORIZATION 一樣。攻擊者無法控制應用哪個不正確的使用者 ID。來自較低許可權源的查詢文字在此處不是問題,因為 SET ROLE 和 SET SESSION AUTHORIZATION 不是未經驗證的查詢的沙箱。PostgreSQL 17.1、16.5、15.9、14.14、13.17 和 12.21 之前的版本受到影響。
PostgreSQL 專案感謝 Tom Lane 報告此問題。
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_CTYPE 是 C 而 LC_COLLATE 是不同區域設定時出現的問題。這可能導致查詢結果不正確。如果您的資料庫中存在這些設定,請在更新到此版本後重新索引任何受影響的索引。此問題僅影響 17.0。MERGE ... WHEN NOT MATCHED BY SOURCE 操作可能出現的錯誤答案或 wrong varnullingrels 規劃器錯誤。COPY 命令中的 FORCE_NOT_NULL 和 FORCE_NULL 的驗證。json_objectagg() 呼叫包含易失性函式時伺服器崩潰的問題。CREATE TABLE ... USING 中指定的非內建訪問方法之間存在已註冊的依賴關係。此修復僅防止在更新後建立的分割槽表出現問題。COMMIT PREPARED 中的競態條件,該條件在崩潰和恢復後可能需要手動刪除檔案。pg_cursors 檢視,透過排除尚未完全設定的遊標來防止錯誤。CALL 語句的引數列表中呼叫,並且該 CALL 位於 PL/pgSQL EXCEPTION 塊中時,接收到過時的行值。psql 的 \watch 命令現在將小於 1 毫秒的值視為 0(執行之間不等待)。pgpass)中使用複製使用者憑據失敗的問題。pg_combinebackup 現在如果增量備份檔案出現在本應包含完整備份的目錄中時會丟擲錯誤。vacuumdb 和並行 reindexdb 中對臨時表和索引進行重複索引。此版本還更新了時區資料檔案到 tzdata release 2024b。此 tzdata 版本將舊的 System-V 相容時區名稱更改為複製相應的地理時區;例如 PST8PDT 現在是 America/Los_Angeles 的別名。主要可見的後果是,對於標準化時區引入之前的時間戳,該時區被認為代表命名地點的本地平均太陽時。例如,在 PST8PDT 中,時間戳輸入(如 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 公共 郵件列表。