PostgreSQL 全球開發團隊已發布我們資料庫系統所有支援版本的更新,包括 9.6.4、9.5.8、9.4.13、9.3.18 和 9.2.22。此版本修正了三個安全性問題。它也修補了過去三個月回報的 50 多個其他錯誤。受到以下安全性問題影響的使用者應盡快更新。受到 CVE-2017-7547 影響的使用者需要在升級後執行額外步驟才能解決問題。其他使用者應計畫在下一次方便的停機時間進行更新。
此版本已關閉三個安全性漏洞
libpq 以及任何使用 libpq 的連線驅動程式都會忽略空密碼,並且不會將其傳輸到伺服器。當使用 libpq 或基於 libpq 的連線驅動程式執行基於密碼的驗證方法時,設定空密碼似乎等同於停用密碼登入。但是,使用非基於 libpq 的連線驅動程式可能會允許具有空密碼的用戶端登入。
為了修正此問題,此更新停用了在任何基於密碼的驗證方法中提交空密碼。伺服器將拒絕在帳戶上設定任何空密碼。
此修復與外部資料包裝函式功能的使用有關,特別是用於使用者對應功能。
在此修復之前,即使使用者沒有相關外部伺服器的 USAGE 權限,也可以存取查看 pg_user_mappings 中的選項。這表示使用者可以看到詳細資訊,例如伺服器管理員而非使用者可能設定的密碼。
此修復僅會修正利用 initdb 新建立的叢集的行為。若要修正現有系統上的此問題,您需要按照以下步驟操作。如需更多詳細資訊,請參閱版本說明。
在您的 postgresql.conf 檔案中,新增以下內容
allow_system_table_mods = true
新增該行後,您需要重新啟動您的 PostgreSQL 叢集。
在叢集的每個資料庫中,以超級使用者身分執行以下命令
SET search_path = pg_catalog;
CREATE OR REPLACE VIEW pg_user_mappings AS
SELECT
U.oid AS umid,
S.oid AS srvid,
S.srvname AS srvname,
U.umuser AS umuser,
CASE WHEN U.umuser = 0 THEN
'public'
ELSE
A.rolname
END AS usename,
CASE WHEN (U.umuser <> 0 AND A.rolname = current_user
AND (pg_has_role(S.srvowner, 'USAGE')
OR has_server_privilege(S.oid, 'USAGE')))
OR (U.umuser = 0 AND pg_has_role(S.srvowner, 'USAGE'))
OR (SELECT rolsuper FROM pg_authid WHERE rolname = current_user)
THEN U.umoptions
ELSE NULL END AS umoptions
FROM pg_user_mapping U
LEFT JOIN pg_authid A ON (A.oid = U.umuser)
JOIN pg_foreign_server S ON (U.umserver = S.oid);
您也需要在您的template0 和 template1 資料庫上執行此命令,否則您未來建立的資料庫中仍會存在此漏洞。
首先,您需要允許 template0 接受連線。在 PostgreSQL 9.5 中,您可以執行以下操作
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
在 PostgreSQL 9.4 及更早版本中,您必須執行此命令
UPDATE pg_database SET datallowconn = true WHERE datname = 'template0';
然後,在您的 template0 和 template1 資料庫中,按照步驟 3 中的說明執行命令
完成後,您需要禁止 template0 的連線。在 PostgreSQL 9.5 中,您可以執行以下操作
ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
在 PostgreSQL 9.4 及更早版本中,您必須執行以下操作
UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';
從您的 postgresql.conf 檔案中移除以下行
allow_system_table_mods = false
重新啟動您的 PostgreSQL 叢集
如需更多詳細資訊,請參閱版本說明。
lo_put() 函數應該需要與 lowrite() 相同的權限,但是缺少權限檢查,這會允許任何使用者變更大型物件中的資料。
為了修正此問題,lo_put() 函數已變更為檢查目標物件上的 UPDATE 權限。
此更新也修正了過去幾個月回報的一些錯誤。其中一些問題僅影響 9.6 版本,但許多問題影響所有支援的版本
PostgreSQL 9.2 版將於 2017 年 9 月終止支援。該專案預計僅針對該版本發布一次更新。我們敦促使用者盡快開始計畫升級到更高版本的 PostgreSQL。請參閱我們的版本控制政策以了解更多資訊。
所有 PostgreSQL 更新版本都是累積性的。與其他次要版本一樣,使用者不需要傾印和重新載入其資料庫或使用 pg_upgrade 即可應用此更新版本;您可以直接關閉 PostgreSQL 並更新其二進位檔案。
連結