觀點 · 資訊分享
CloudNativePG 監控匯出器漏洞:低權限資料庫帳號可升成超級使用者,請升到 1.28.3 或 1.29.1
Kubernetes 上常用的 PostgreSQL 營運工具 CloudNativePG 公布嚴重漏洞(CVSS 9.9):指標匯出器用超級使用者連線後只做降權,攻擊者可恢復權限並在資料庫 Pod 內執行系統指令。預設監控設定就受影響,官方在 1.28.3 與 1.29.1 修補。
- 發布
- 2026-05-11
- 篇幅
- 約 4 分鐘 · 1,841 字
- 結構
- 10 節 + 3 題常見問題
- 標籤

一句話看懂:CloudNativePG 的監控程式用「超級使用者」身分連進資料庫,只是在上面蓋一層低權限的外衣;外衣可以被脫掉,低權限帳號就可能升成超級使用者並在資料庫 Pod 內執行系統指令,請升到 1.28.3 或 1.29.1。

先用白話講:這個漏洞怎麼發生的?
想像一位保全每天要巡視大樓,為了方便,他拿的是「總鑰匙」,但上班前被要求「穿上實習生制服」,假裝只有實習生權限。問題是:制服可以自己脫掉,脫掉後總鑰匙還在手上。
CloudNativePG 的指標匯出器就是這樣:它用 postgres 超級使用者連線,再用 SET ROLE 降成 pg_monitor(監控專用角色),但連線的真實身分還是超級使用者。
發生什麼事
GitHub 公告(5 月 11 日)說明:
- 在匯出器執行的查詢裡,只要有運算式能呼叫 RESET ROLE,就能恢復超級使用者權限
- 接著可利用 COPY … TO PROGRAM,在主要 Pod 內以 postgres 身分執行作業系統指令
- 從低權限資料庫角色到取得這些能力,可在一個抓取週期內(30 秒以內)完成
- GitHub 公告列的 CVSS 為 9.9(嚴重)
兩條受影響的路徑
| 路徑 | 條件 | 受影響範圍 |
|---|---|---|
| 路徑 1 | 自訂指標查詢含有未指定結構(schema)的名稱,且有資料庫使用者擁有可影響名稱解析的結構 | 所有支援版本;允許客戶影響自訂查詢的多租戶平台風險最高 |
| 路徑 2 | 預設的 default-monitoring.yaml,其中 pg_extensions 查詢用了未指定結構的 current_database(),並對每個使用者資料庫執行 | 所有支援版本,不需自訂指標;擁有資料庫的非超級使用者(包含預設的 app 角色)即可觸發 |
公告還提到:若應用程式本身有 SQL 注入,攻擊者也可能藉此一路打到資料庫 Pod。
修補方式與版本
- 修補版本:1.28.3(1.28 系)與 1.29.1(1.29 系)
- 預設查詢改為明確指定結構(schema-qualify):關閉路徑 2;若你把預設監控設定複製到自己的 ConfigMap,必須自行修改
- 專用角色:匯出器改用
cnpg_metrics_exporter(只有 pg_monitor 權限、無超級使用者),從根本解決問題 - 縱深防禦:監控交易會把 pg_catalog 放到 search_path 最前面
升級時要注意
- 原本靠超級使用者權限的自訂查詢(例如讀取沒有授權給新角色的使用者資料表,或 pg_authid 這類系統表)會失敗,需要對 cnpg_metrics_exporter 明確授權
- 有複本叢集時,要先升級來源主叢集,再升級複本叢集,否則複本會因為缺少該角色而抓取失敗
來不及升級的暫時做法(官方列的)
- 在自訂指標查詢中,把所有目錄函式與檢視加上 pg_catalog 前綴,這只是部分緩解
- 限制只有完全可信的角色才能擁有被抓取叢集裡的資料庫;PostgreSQL 15 以前 public 預設把 CREATE 權限給所有人,風險更高
給開發者的技術細節
- 公告特別說明,只把連線降成 pg_monitor 或用 SET SESSION AUTHORIZATION 都不夠,因為認證身分仍是 postgres;只有改用不同的認證身分才能徹底關閉問題
- 專用角色是無密碼的,帶外設定的密碼會在下次協調時被清掉
我的看法
這個漏洞最值得注意的一點是:問題出在「監控」這種大家覺得無害的附屬功能,而且預設設定就中。自架 Kubernetes 資料庫的人常把心力放在備份與高可用,容易忽略監控元件擁有的權限。
實務上我的建議是:先升級並確認新角色上線;接著盤點自己的自訂監控查詢;最後檢討「誰能擁有資料庫」,因為這個漏洞需要有資料庫擁有權或建立物件的權限才能觸發。多租戶或給客戶共用的資料庫叢集,更要優先處理。
名詞小辭典
- CloudNativePG:在 Kubernetes 上管理 PostgreSQL 的開源營運工具。
- 超級使用者:資料庫裡權限最高的角色,什麼都能做。
- 指標匯出器:定期向資料庫查詢狀態,提供給監控系統的小程式。
- search_path:資料庫解析名稱時搜尋結構的順序,順序被利用就可能引到假的物件。
資料來源
常見問題
CloudNativePG 是什麼?
一個在 Kubernetes 上部署與管理 PostgreSQL 叢集的開源營運工具(Operator),負責建立資料庫、備份、故障切換與監控等工作。
我沒有自訂監控查詢,會受影響嗎?
會。公告指出預設監控設定中的 pg_extensions 查詢用了未指定結構的 current_database(),並且對每個使用者資料庫執行,所以只啟用預設監控的部署也受影響;擁有資料庫的低權限角色(包含預設的 app 角色)就可能觸發。
來不及升級可以怎麼緩解?
公告列了暫時辦法:自訂指標查詢裡的名稱都加上 pg_catalog 前綴(這只是部分緩解),並限制只有完全可信的角色能擁有被監控叢集裡的資料庫。這些都不等於徹底修好,仍要升級。
接著讀
全部觀點 →AWS GuardDuty 開始盯資料庫查詢:帳密被偷之後的偷資料、刪資料也抓得到AWS 讓 GuardDuty 的 RDS 防護從「只看登入」延伸到「看查詢行為」,Aurora PostgreSQL 與 RDS for PostgreSQL 上的大量匯出、惡意刪除都能被標記,不用裝代理程式,首次開啟有 30 天免費試用。閱讀 →Google Cloud 資料庫內建 BM25 搜尋:AlloyDB、Cloud SQL 不用再另架搜尋引擎Google Cloud 讓 AlloyDB 與 Cloud SQL for PostgreSQL 17 以上版本,直接在資料庫裡做 BM25 關鍵字排序(預覽版)。搭配向量搜尋就能做「混合搜尋」,不必再多養一套 Elasticsearch 之類的搜尋服務。閱讀 →AKS 掛 Azure Files 不必再塞儲存體金鑰:每個 Pod 用自己的身分,只拿得到該拿的檔案Azure Files 的 CSI 驅動程式在 AKS 上正式支援工作負載身分:容器可以用自己的身分掛載 SMB 檔案共用,不用把整個儲存體帳號的金鑰放進叢集,權限也能細到單一應用程式。閱讀 →