對於許多 Junior 工程師來說,我們在開發時習慣將雲端託管服務(Managed Services)視為「黑盒子」,認為只要 API 呼叫正確且權限設定妥當,底層的安全性由雲端供應商(CSP)負責。然而,近期由 Wiz 研究團隊揭露的 CosmosEscape 漏洞鏈,給了我們一個極其深刻的教訓:即使是像 Microsoft 這樣等級的供應商,其多租戶隔離機制也可能因為一個微小的設計疏忽而全面崩潰。
這篇文章將詳細分析 CosmosEscape 的技術路徑、其對雲端架構的衝擊,以及它揭示的系統性風險。
什麼是 CosmosEscape?
CosmosEscape 是一個針對 Azure Cosmos DB 的嚴重漏洞鏈。簡單來說,它允許攻擊者從一個自己控制的資料庫起步,最終獲得對該服務上所有客戶(租戶)資料庫的讀寫權限。
這類漏洞最可怕的地方在於它打破了「租戶隔離」(Tenant Isolation)。在雲端環境中,租戶隔離是底線——A 客戶絕對不能看到 B 客戶的資料。而 CosmosEscape 則直接將這道牆推倒,讓攻擊者能夠獲取一個平台級別的「萬能鑰匙」。
技術分析:從單一查詢到全平台控制
這場攻擊並非透過複雜的社工或暴力破解,而是一條極其精簡的技術路徑:
突破沙箱:Gremlin 查詢與 .NET 反射 Azure Cosmos DB 支援 Gremlin 查詢語言(用於圖形資料庫)。系統在處理 Gremlin 查詢時,會將其編譯成 .NET 程式碼執行。為了安全,Microsoft 實作了限制機制(Sandbox),旨在確保這些查詢僅能執行 Gremlin 預定義的操作。
然而,研究人員發現這些限制未能有效阻擋 .NET Reflection(反射)。反射是 .NET 的一種強大功能,允許程式在執行期間檢查、操縱物件或呼叫私有方法。攻擊者利用精心構造的 Gremlin 查詢,透過反射機制逃脫了沙箱限制。
獲取 RCE:控制 DB Gateway 一旦逃脫沙箱,攻擊者就在 DB Gateway 上取得了 RCE(Remote Code Execution,遠端程式碼執行) 權限。DB Gateway 是處理所有客戶查詢的多租戶服務組件。由於這個組件處於核心位置,它必須擁有極高的權限才能為不同租戶分發請求。
終極目標:Cosmos Master Key 在 DB Gateway 的記憶體或配置中,存在著一個被 Wiz 稱為 Cosmos Master Key 的全平台秘密金鑰。
這個 Master Key 的權限極其驚人:它可以被用來獲取任何 Cosmos DB 帳戶的主金鑰(Primary Key),並且能根據訂閱(Subscription)和租戶識別碼(Tenant ID)列舉出所有資料庫。這意味著攻擊者只要拿到這個 Key,就等於擁有了整個 Azure Cosmos DB 服務的最高管理權限。
影響範圍(Blast Radius) 這次漏洞的影響範圍遠超想像,因為 Cosmos DB 不僅服務外部客戶,還被 Microsoft 內部的許多核心服務所使用,包括 Microsoft Teams 和 Copilot。這意味著該漏洞理論上能威脅到 Microsoft 自身的後端數據。
時間線與修復過程
這起事件的修復過程揭示了大型分散式系統在面對「核心金鑰洩漏」時的無力感:
2025 年 11 月 20 日:Wiz 向 Microsoft 回報漏洞。 2025 年 11 月 22 日(兩天後):Microsoft 發布熱修復(Hotfix),封鎖了漏洞所在的 Gremlin 進入點。這暫時阻止了攻擊路徑,但並沒有移除已經洩漏的 Master Key。 2026 年 7 月:Microsoft 終於完成全區域的憑證模型(Credential Model)重構,正式移除並替換掉該全平台金鑰。
關鍵點: 從封鎖漏洞到徹底移除危險金鑰,中間整整耗時 六個月。
工程思考:為什麼修復需要這麼久?
很多開發者會質疑:「既然知道金鑰洩漏了,直接換掉不就好了嗎?」
在單機應用程式中確實如此,但在像 Cosmos DB 這樣規模的系統中,這涉及到底層架構的變更。DB Gateway 之前的運作邏輯是:使用 Master Key $\rightarrow$ 獲取特定帳戶的私鑰 $\rightarrow$ 轉發請求。
要移除 Master Key,意味著 Microsoft 必須重新設計整個憑證獲取流程,並在不中斷全球數萬個客戶服務的前提下,將新模型部署到所有區域。這不是改一行程式碼就能解決的,而是一次大規模的基礎設施重構。
對開發者的實務啟示與風險分析
重新審視「共用責任模型」(Shared Responsibility Model) 通常雲端廠商會告訴我們:他們負責「雲端本身的安全性」(Security of the Cloud),我們負責「雲端內資料的安全性」(Security in the Cloud)。
但 CosmosEscape 證明了,當漏洞發生在供應商的基礎設施層(如租戶隔離崩潰)時,客戶端完全沒有任何對策。你無法透過設定防火牆或更改密碼來防止這種攻擊,因為攻擊發生在 API 接收請求之前的底層。
集中化風險(Concentration Risk) 這引發了關於「單一供應商依賴」的討論。如果將所有關鍵數據都放在單一雲端服務商,一旦發生此類平台級漏洞,影響將是毀滅性的。雖然將數據備份到另一個供應商或地端(On-premises)成本高昂,但在極端風險管理下,這可能是必要的。
缺乏透明度的不確定性 值得注意的是,此次事件中: 沒有發布 CVE 編號或 CVSS 分數。 沒有正式的 MSRC(Microsoft Security Response Center)公告。 沒有明確說明漏洞存在的時間窗口。
這意味著客戶無法得知自己的數據在過去多久的時間內處於風險之中,只能選擇相信供應商「沒有發現被利用證據」的說法。
最後的工程判斷
對於平台工程師或架構師來說,CosmosEscape 給我們的最大啟發不是學習如何利用 .NET 反射,而是學會詢問一個關鍵問題:
> 「我們所使用的託管服務中,是否存在一個橫跨所有租戶的單一憑證(Global Credential)?如果這個憑證洩漏,移除它的成本和時間是多少?」
在設計系統時,應盡量避免「單點崩潰導致全盤皆輸」的設計。如果必須使用全域金鑰,則應考慮如何將其權限最小化,或建立一套能夠在短時間內快速輪轉(Rotate)且不影響可用性的金鑰管理機制。
總結: 雲端服務雖然方便,但「託管」並不代表「絕對安全」。理解底層的租戶隔離邏輯與憑證流轉,才能在面對不可控的供應商風險時,做出更合理的備援與防禦決策。