2025年9月25日: PostgreSQL 18 釋出!

PostgreSQL 16.3、15.7、14.12、13.15 和 12.19 釋出!

釋出於 2024-05-09,作者 PostgreSQL 全球開發組
PostgreSQL 專案 安全

PostgreSQL 全球開發組釋出了對所有受支援的 PostgreSQL 版本(包括 16.3、15.7、14.12、13.15 和 12.19)的更新。此版本修復了一個安全漏洞和過去幾個月報告的 55 個以上錯誤。

在系統檢視 pg_stats_extpg_stats_ext_exprs 中發現了一個安全漏洞,可能允許已認證的資料庫使用者檢視他們沒有足夠許可權檢視的資料。此漏洞的修復僅適用於新安裝的 PostgreSQL,即在此修復應用後使用 initdb 工具建立的 PostgreSQL。如果您當前安裝了 PostgreSQL 並擔心此問題,請遵循“更新”部分中的說明進行補救。

有關更改的完整列表,請參閱 發行說明

PostgreSQL 12 EOL 通知

PostgreSQL 12 將於 2024 年 11 月 14 日停止接收修復。如果您在生產環境中使用 PostgreSQL 12,我們建議您計劃升級到更新的、受支援的 PostgreSQL 版本。有關更多資訊,請參閱我們的 版本策略

安全問題

CVE-2024-4317:限制 pg_stats_extpg_stats_ext_exprs 條目的可見性給表所有者

CVSS v3.1 基本得分:3.1

支援的、易受攻擊的版本:14 - 16。

PostgreSQL 內建檢視 pg_stats_extpg_stats_ext_exprs 缺少授權,允許未經授權的資料庫使用者讀取其他使用者透過 CREATE STATISTICS 命令建立的最常見值和其他統計資訊。最常見的值可能會洩露竊聽者無法讀取的列值,或者他們無法執行的函式的結果。

此修復僅適用於新安裝的 PostgreSQL,即在此修復應用後使用 initdb 工具建立的 PostgreSQL。如果您當前安裝了 PostgreSQL 並擔心此問題,請遵循“更新”部分中的說明進行補救。

PostgreSQL 專案感謝 Lukas Fittl 報告此問題。

錯誤修復和改進

本次更新修復了過去幾個月報告的 55 個以上錯誤。以下列出的問題會影響 PostgreSQL 16。其中一些問題也可能影響 PostgreSQL 的其他受支援版本。

  • 修復了使用多行 VALUES 子句的 INSERT 語句時出現的問題,其中目標列是陣列或複合型別的域。
  • 在使用 MERGEMERGE ... DO NOTHING 時,需要對目標表具有 SELECT 許可權
  • 根據 SQL 標準,當 MERGE 中的目標行在修改期間與多個源行匹配時,將引發錯誤。
  • 修復了當表在一個布林列上分割槽,並且查詢包含布林 IS NOT 子句時,對 NULL 分割槽的錯誤修剪。
  • 使 ALTER FOREIGN TABLE ... SET SCHEMA 將任何擁有的序列移動到新模式。
  • CREATE DATABASE 現在可以不區分大小寫地識別 STRATEGY 關鍵字。
  • 修復了 EXPLAIN 在點陣圖堆掃描期間計算堆頁的方式,以便顯示所有計數頁,而不僅僅是包含可見元組的頁。
  • 避免在移除孤立的臨時表時發生死鎖。
  • VACUUM 進行多項修復,包括一項可以減少不必要 I/O 的修復。
  • 多項查詢規劃器修復。
  • 為擁有數千個角色的安裝增加了某些操作的最佳化。
  • 修復了返回單個複合型別列的 SQL 語言過程的混淆問題。
  • 修復了 date_bin() 中的錯誤舍入和溢位風險。
  • 檢測將 interval 新增或減去到時間戳時發生的整數溢位。
  • 修復了邏輯複製中的多個競態條件,包括確定是否需要表同步操作。
  • 如果新伺服器會話的客戶端套接字無法設定為非阻塞模式,則斷開連線。
  • initdb -c 現在可以不區分大小寫地匹配引數名稱。
  • 修復了 PL/pgSQL 對錶達式後面的單行註釋(-- 樣式註釋)的解析方式。

更新

所有 PostgreSQL 更新版本都是累積的。與其他次要版本一樣,使用者不需要轉儲和重新載入資料庫或使用 pg_upgrade 來應用此更新版本;您可以直接關閉 PostgreSQL 並更新其二進位制檔案。

對於受 CVE-2024-4317 影響且希望修復此問題的現有安裝,您需要執行以下步驟:

  1. 在 PostgreSQL 安裝的 share 目錄中(例如 /usr/share/postgresql/)查詢 SQL 指令碼 fix-CVE-2024-4317.sql,或從下方任一 URL 從 PostgreSQL git 倉庫下載。您需要使用與您的主版本匹配的指令碼。

  2. PostgreSQL 16https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/catalog/fix-CVE-2024-4317.sql;hb=refs/heads/REL_16_STABLE

  3. PostgreSQL 15https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/catalog/fix-CVE-2024-4317.sql;hb=refs/heads/REL_15_STABLE
  4. PostgreSQL 14https://git.postgresql.org/gitweb/?p=postgresql.git;a=blob;f=src/backend/catalog/fix-CVE-2024-4317.sql;hb=refs/heads/REL_14_STABLE

從以上 URL 中,您可以點選標有“raw”的 URL 下載可供複製貼上的版本。

請務必使用適合您的 PostgreSQL 主版本的指令碼。如果看不到此檔案,則說明您的版本不受此漏洞影響(僅影響 PostgreSQL 14、15 和 16),或者您的次要版本太舊,還沒有此修復。

  1. 在叢集的每個資料庫中,以資料庫超級使用者的身份執行 fix-CVE-2024-4317.sql 指令碼。例如,在 psql 中,如果檔案位於 /usr/share/postgresql/,則命令將如下所示:

\i /usr/share/postgresql/fix-CVE-2024-4317.sql

  1. 您還必須在 template0template1 資料庫中執行此指令碼,否則漏洞將仍然存在於您稍後建立的資料庫中。要修復 template0,您需要暫時允許它接受連線。您可以使用以下命令執行此操作:

ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;

template0template1 中執行 fix-CVE-2024-4317.sql 指令碼後,您應該撤銷 template0 接受連線的能力。您可以使用以下命令執行此操作:

ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;

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

有關更多詳細資訊,請參閱 發行說明

連結

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