具代表性的面試主題

能力式安全如何防止 confused deputy?

通用中等
Offer.cc 編輯團隊發佈 更新

題幹

請向面試官解釋能力式安全。說明高權限服務如何因使用呼叫方提供的名稱而成為混淆代理,以及傳遞 capability 如何改變權限流,並討論撤銷、稽核和最小權限的取捨。

1. 題幹與適用情境

一個服務接收讀取或寫入資源的請求。服務本身擁有較寬權限,但呼叫方只能獲得有限能力。如果服務接收呼叫方控制的路徑或資源 ID,再用自身權限執行操作,攻擊者可能誘使它完成呼叫方本不能直接完成的動作。AWS 將這類問題稱為 confused deputy。

能力式安全把權限放進明確的參照或權杖:它同時指向資源並攜帶使用權限。這個 capability 應不可偽造、範圍受限,並只傳給確實需要的程式碼。題目考察安全模型,不限定雲端廠商或程式語言。

2. 面試官考察點

  • 權限推理: 能否區分認證、授權與持有被委託權限。
  • 威脅建模: 能否指出代理、混淆輸入、高權限動作和攻擊者控制邊界。
  • 最小權限: 是否把 capability 收縮到單一操作、物件、租戶或時間窗口。
  • 生命週期判斷: 能否解釋撤銷、過期、稽核和洩漏,而不聲稱 capability 能解決一切。
  • 取捨表達: 能否在真實營運約束下比較 capability 與環境身分和策略檢查。

弱回答只會說「使用 token」。強回答會說明 token 授權什麼、如何約束,以及洩漏或必須撤銷時會發生什麼。

3. 回答前需要澄清的問題

代理是本地程式碼、服務還是雲端角色?

模式相同,但邊界不同。函式庫可能無意繼承檔案控制代碼;服務可能使用工作負載身分;雲端角色可能被誘騙去存取跨帳戶資源。先說清楚誰擁有寬權限。

委託的是哪個資源和操作?

明確是讀、寫、追加、刪除、呼叫還是組合操作。針對單一物件和方法的 capability 比萬用資源名稱更容易稽核和撤銷。

撤銷和洩漏要求是什麼?

詢問是否需要立即撤銷、離線使用、多租戶隔離或不可否認稽核。這些約束決定使用記憶體參照、簽名權杖、租約、代理或中心策略檢查。

4. 30 秒回答框架

「混淆代理發生在低權限呼叫方提供資源名稱,而高權限服務使用自身權限執行操作,卻沒有把請求綁定到呼叫方明確獲授的範圍。能力式安全讓權限顯式化:傳遞不可偽造的參照或權杖,限定一個資源和操作,並要求代理只能使用該參照。我會在委託時收縮 capability,把它綁定到租戶和受眾,按風險設定過期或撤銷,並記錄簽發和使用。Capability 能減少環境權限和混淆代理風險,但洩漏、重放、復原和稽核仍需單獨設計。」

5. 分步驟深入解答

步驟一:區分身分與權限

認證回答誰在呼叫,授權回答該身分按策略能做什麼。Capability 是具體的帶權限參照:持有它並通過不可偽造性檢查,就獲得特定動作。它可以和身分並存,但不依賴每次內部呼叫都重新讀取全域環境身分。

步驟二:畫出混淆代理流程

假設報表服務能以工作負載身分讀取任意檔案。使用者傳送 file=/reports/other-tenant.csv。如果服務只驗證請求已認證,它就成了代理:使用者提供名稱,服務花費更大的權限。缺少的綁定是「該呼叫方確實被授予這個物件的權限」。

步驟三:用有範圍的權限取代名稱

改由有權所有者建立某個報表和操作的 capability,例如租戶 A 的唯讀權限,直到指定時間。呼叫方把 capability 交給服務。服務解引用它或交給代理,不把任意路徑轉換成權限。object-capability 研究將這種模式描述為把存取權編碼到物件中,限制物件之間的互動。

步驟四:委託時收縮權限

元件繼續委託時,應產生更弱的 capability:減少方法、限制子物件、縮短壽命、綁定租戶或增加速率限制。不能因為下游方便就擴大 capability。只暴露 readMetadata() 的包裝器比傳遞可寫可刪的檔案控制代碼更安全。

步驟五:處理權杖和重放

跨程序傳遞時,使用簽名、綁定受眾的保護參照,或由代理簽發控制代碼。包含資源、動作、租戶、簽發者、受眾、過期時間和需要防重放時的唯一 ID。使用前驗證完整性與上下文。加密只能隱藏內容,不能單獨保證範圍或阻止重放。

步驟六:規劃撤銷和復原

純記憶體 capability 易傳遞,卻難以全域撤銷。租約、短過期、透過撤銷儲存間接參照或輪換金鑰,分別在即時控制、可用性和延遲之間取捨。權杖洩漏後,應撤銷控制代碼或綁定,必要時輪換相關金鑰並檢查紀錄;刪除使用者記錄不一定會讓已簽發 capability 失效。

步驟七:保留稽核和策略邊界

記錄誰簽發 capability、範圍是什麼、哪個代理使用以及結果。即使 capability 是授權原語,也要保留身分上下文以便追責。高風險動作可疊加租戶狀態、法律保留或 step-up authentication 等策略檢查。

6. 高品質示範回答

「混淆代理是權限錯配:呼叫方提供資源名稱,但服務擁有更大權限並執行操作。服務把名稱當成授權,因此被混淆。AWS 在跨帳戶和跨服務場景中記錄了這個模式。

我會傳遞明確的 capability:不可偽造的參照或受保護權杖,限定租戶、物件、操作、受眾和過期時間。代理只能使用這個 capability;繼續委託時建立更弱的子 capability。遠端權杖要檢查完整性、上下文與重放約束,並記錄簽發和使用。

撤銷是關鍵取捨。敏感動作可以用短租約或可撤銷控制代碼,但要接受查詢成本。Capability 能減少環境權限並讓權限流更可見,卻不能消除洩漏、復原、稽核和策略要求。我會測試跨租戶存取、權杖重放、混淆名稱與撤銷競態。」

7. 常見錯誤

  • 「認證通過就夠了」 → 讓寬權限服務自行決定範圍 → 把操作綁定到明確且受限的權限。
  • 「簽名 token 自動就是 capability」 → 忽略受眾、操作、過期與重放 → 把完整性和範圍分開驗證。
  • 「登入檢查後繼續使用呼叫方路徑」 → 重現混淆代理流程 → 傳遞 capability 或代理控制代碼,而不是任意名稱。
  • 「Capability 消除了授權策略」 → 漏掉租戶狀態和上下文規則 → 對高風險動作疊加策略檢查。
  • 「撤銷沒有成本」 → 忽略分散式副本和離線使用 → 按需求選擇租約、間接參照或過期。
  • 「隱藏所有身分上下文」 → 讓事故調查無法進行 → 稽核簽發者、主體、範圍和使用事件。

8. 追問及應對

Capability 和 ACL 查詢有什麼差別?

ACL 查詢從身分和資源名稱出發,在使用時查策略。Capability 則沿資料流攜帶被委託權限。ACL 集中策略和撤銷;capability 讓權限顯式並減少環境權限,但仍需處理生命週期和洩漏。

Capability 可以被複製嗎?

程序內參照通常能被持有它的程式碼複製,邊界在於誰能收到以及是否收縮。遠端權杖若不綁定通道、隨機數、受眾或短租約,也可能被重放。可複製性是要建模的風險,不代表權杖無害。

如何保護 capability URL?

把它當作 bearer 憑證:使用 HTTPS、窄範圍、短過期、不可猜熵、受眾綁定、速率限制,並從紀錄和 referrer 中脫敏。敏感或可重複動作應先一次性兌換可撤銷控制代碼。

雲端系統哪裡仍會出現混淆代理?

服務角色、建置執行器或儲存代理接收使用者控制的資源 ID,再使用寬角色就是典型場景。把請求綁定到資源策略、租戶和目標動作;AWS 的跨帳戶指引就是具體邊界例子。

公開來源

同類題目