2017-08-10 安全性更新發布

發布於 2017-08-10,作者:PostgreSQL 全球開發團隊

PostgreSQL 全球開發團隊已發布我們資料庫系統所有支援版本的更新,包括 9.6.4、9.5.8、9.4.13、9.3.18 和 9.2.22。此版本修正了三個安全性問題。它也修補了過去三個月回報的 50 多個其他錯誤。受到以下安全性問題影響的使用者應盡快更新。受到 CVE-2017-7547 影響的使用者需要在升級後執行額外步驟才能解決問題。其他使用者應計畫在下一次方便的停機時間進行更新。

安全性問題

此版本已關閉三個安全性漏洞

CVE-2017-7546:某些驗證方法接受空密碼

libpq 以及任何使用 libpq 的連線驅動程式都會忽略空密碼,並且不會將其傳輸到伺服器。當使用 libpq 或基於 libpq 的連線驅動程式執行基於密碼的驗證方法時,設定空密碼似乎等同於停用密碼登入。但是,使用非基於 libpq 的連線驅動程式可能會允許具有空密碼的用戶端登入。

為了修正此問題,此更新停用了在任何基於密碼的驗證方法中提交空密碼。伺服器將拒絕在帳戶上設定任何空密碼。

CVE-2017-7547:"pg_user_mappings" 目錄檢視將密碼洩漏給缺乏伺服器權限的使用者

此修復與外部資料包裝函式功能的使用有關,特別是用於使用者對應功能。

在此修復之前,即使使用者沒有相關外部伺服器的 USAGE 權限,也可以存取查看 pg_user_mappings 中的選項。這表示使用者可以看到詳細資訊,例如伺服器管理員而非使用者可能設定的密碼。

此修復僅會修正利用 initdb 新建立的叢集的行為。若要修正現有系統上的此問題,您需要按照以下步驟操作。如需更多詳細資訊,請參閱版本說明

  1. 在您的 postgresql.conf 檔案中,新增以下內容

    allow_system_table_mods = true
    
  2. 新增該行後,您需要重新啟動您的 PostgreSQL 叢集。

  3. 在叢集的每個資料庫中,以超級使用者身分執行以下命令

    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);
    
  4. 您也需要在您的template0template1 資料庫上執行此命令,否則您未來建立的資料庫中仍會存在此漏洞。

    首先,您需要允許 template0 接受連線。在 PostgreSQL 9.5 中,您可以執行以下操作

    ALTER DATABASE template0 WITH ALLOW_CONNECTIONS true;
    

    在 PostgreSQL 9.4 及更早版本中,您必須執行此命令

    UPDATE pg_database SET datallowconn = true WHERE datname = 'template0';
    

    然後,在您的 template0template1 資料庫中,按照步驟 3 中的說明執行命令

    完成後,您需要禁止 template0 的連線。在 PostgreSQL 9.5 中,您可以執行以下操作

    ALTER DATABASE template0 WITH ALLOW_CONNECTIONS false;
    

    在 PostgreSQL 9.4 及更早版本中,您必須執行以下操作

    UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';
    
  5. 從您的 postgresql.conf 檔案中移除以下行

    allow_system_table_mods = false
    
  6. 重新啟動您的 PostgreSQL 叢集

如需更多詳細資訊,請參閱版本說明

CVE-2017-7548:lo_put() 函數忽略 ACL

lo_put() 函數應該需要與 lowrite() 相同的權限,但是缺少權限檢查,這會允許任何使用者變更大型物件中的資料。

為了修正此問題,lo_put() 函數已變更為檢查目標物件上的 UPDATE 權限。

錯誤修正與改進

此更新也修正了過去幾個月回報的一些錯誤。其中一些問題僅影響 9.6 版本,但許多問題影響所有支援的版本

  • pg_upgrade:更正了有關升級待命伺服器的流程的文件,以確保主伺服器和待命伺服器安全地同步。還包含一項修復,以確保最後一筆 WAL 記錄沒有 "wal_level = minimum",這會阻止待命伺服器在重新啟動時連線
  • 修正了並行鎖定競爭條件的問題,該問題可能導致某些更新失敗
  • 針對低機率資料損毀情境的數個修正
  • 修正了在記憶體中排序超過 10 億個 Tuple 時防止崩潰的問題
  • 在 Windows 上修正了在無法配置共用記憶體位址時重試建立程序的問題,這通常是由防毒軟體干擾引起的
  • 修正了 libpq 中的問題,以確保使用 GSS/SASL 和 SSPI 驗證的失敗連線嘗試已正確重設
  • 針對 SSL 連線處理和記錄的修正
  • 修正了允許在聚合函數的參數中使用的子 SELECT 陳述式中使用視窗函數的問題
  • 允許在從查詢複製時,在查詢計畫中進行平行處理
  • 對 ALTER TABLE 的多項修正
  • 修正了確保 ALTER USER ... SET 和 ALTER ROLE ... SET 接受相同的語法變體的問題
  • 針對統計資料收集器的修正,確保在 postmaster 關閉請求後立即提出的統計資料請求將被寫入磁碟
  • 修正了在待命伺服器升級期間可能建立無效 WAL 區段的問題
  • 數個 walsender / walreceiver 修正,特別是關於訊號處理和關閉/重新啟動
  • 數個邏輯解碼修正,包括移除將小型子交易洩漏到磁碟的問題
  • 允許 CHECK 約束在執行 CREATE FOREIGN TABLE 時最初為 NOT VALID
  • 針對 postgres_fdw 的修正,用於在 ALTER SERVER / ALTER USER MAPPING 命令後立即應用變更,並提高從無回應伺服器逸出的能力
  • 針對 pg_dump 和 pg_restore 的數個修正,包括修正 Windows 上 pg_dump 輸出到 stdout 的問題
  • 修正了 Windows 上 pg_basebackup 輸出到 stdout 的問題,類似於 pg_dump 的修正
  • 修正了 pg_rewind 正確處理超過 2GB 的檔案的問題,儘管這種大小的檔案很少會出現在資料目錄中
  • 針對使用 Microsoft Visual C (MSVC) 建置 PostgreSQL 的數個修正,主要圍繞來源程式庫

版本 9.2 的 EOL 警告

PostgreSQL 9.2 版將於 2017 年 9 月終止支援。該專案預計僅針對該版本發布一次更新。我們敦促使用者盡快開始計畫升級到更高版本的 PostgreSQL。請參閱我們的版本控制政策以了解更多資訊。

更新

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

連結