混淆代理人問題

Confused Deputy Problem(混淆代理問題)是資訊安全領域中,作為說明能力式安全(Capability-based security)重要性的典型例子而被提出的問題。

使用者或客戶端程式透過使用權限更高的代理程式,可能產生非預期的安全漏洞。

範例
在混淆代理問題(confused deputy)的原始範例中, 有一個編譯器(compiler)程式提供於商業分時系統(timesharing service)上。使用者可以執行該編譯器,並可選擇指定一個檔名作為除錯輸出的寫入位置;只要使用者對該檔案具有寫入權限,編譯器就能寫入該檔案。

該編譯器同時也會收集程式語言功能使用情況的統計資料。這些統計資料被儲存在「SYSX」目錄中的「(SYSX)STAT」檔案內。為了實現這點,編譯器程式被賦予了寫入 SYSX 目錄內檔案的權限。

然而,SYSX 中還有其他檔案;特別是,系統的計費資訊被儲存在「(SYSX)BILL」檔案中。某位使用者執行編譯器時,將「(SYSX)BILL」指定為除錯輸出的目標檔案。

這便產生了混淆代理問題。編譯器向作業系統(operating system)提出請求以開啟「(SYSX)BILL」。雖然使用者本身沒有存取該檔案的權限,但編譯器有,因此開啟成功。接著,編譯器如常地將編譯輸出寫入該檔案(此處即為「(SYSX)BILL」),覆寫了原有內容,導致計費資訊被毀損。

混淆代理(The confused deputy)
在這個例子中,編譯器程式就是「代理(deputy)」,因為它是在回應使用者的請求而行動。該程式被認為是「混淆的(confused)」,因為它被欺騙去覆寫系統的計費檔案。

每當一個程式嘗試存取檔案時,作業系統需要知道兩件事:程式請求的是哪個檔案,以及該程式是否具有存取該檔案的權限。在這個例子中,檔案是透過其名稱「(SYSX)BILL」來指定的。程式從使用者那裡取得檔名,但並不知道使用者是否擁有寫入該檔案的權限。當程式開啟檔案時,系統使用的是程式本身的權限,而不是使用者的權限。當檔名從使用者傳遞給程式時,權限資訊並沒有一同傳遞;權限是在系統中被靜默且自動地提升的。

此攻擊的關鍵並不在於計費檔案是以字串形式的名稱來指定。真正重要的是:

檔案的指定方式(designator)本身並未攜帶存取該檔案所需的完整權限;
系統會隱含地使用程式自身對該檔案的存取權限。
其他範例
跨網站請求偽造(Cross-Site Request Forgery, CSRF)是一種混淆代理攻擊的例子,它利用網頁瀏覽器(web browser)對網頁應用程式執行敏感操作。此類攻擊的一種常見形式發生於網頁應用程式使用 Cookie 驗證瀏覽器所傳送的所有請求時。攻擊者可以利用 JavaScript 強迫瀏覽器傳送已驗證的 HTTP 請求。

Samy computer worm 利用跨網站指令碼攻擊(XSS),將瀏覽器已驗證的 MySpace 工作階段變成一個混淆代理。透過 XSS,該蠕蟲強迫瀏覽器將自身的可執行副本作為 MySpace 訊息發佈,而受感染使用者的朋友在檢視該訊息後,也會執行該蠕蟲。

點擊劫持(Clickjacking)是一種由使用者充當混淆代理的攻擊。在此攻擊中,使用者以為自己只是無害地瀏覽某個網站(由攻擊者控制的網站),但實際上卻被誘導去對另一個網站執行敏感操作。

FTP Bounce 攻擊可以利用遠端 FTP 伺服器作為混淆代理,使攻擊者間接連線到其自身機器無法存取的 TCP 連接埠。

另一個例子與個人防火牆(personal firewall)軟體有關。此類軟體可以限制特定應用程式的網際網路存取權限。然而,有些應用程式會透過啟動瀏覽器並指示其存取特定 URL 來繞過限制。瀏覽器本身具有開啟網路連線的權限,即使原始應用程式沒有。防火牆軟體可能會嘗試透過在某個程式啟動另一個會存取網路的程式時提示使用者來解決此問題。然而,使用者通常沒有足夠資訊判斷該存取是否合法——誤判(false positives)十分常見,而且即使是熟練使用者,也有相當大的風險會逐漸習慣性地點擊「OK」來忽略這些提示。

並非所有濫用權限的程式都是混淆代理。有時候,權限誤用只是程式錯誤的結果。混淆代理問題發生於某個物件的指定資訊從一個程式傳遞到另一個程式時,其相關權限在雙方都未明確操作的情況下,意外地發生改變。這種問題之所以隱蔽,是因為雙方都沒有明確地改變權限。

另一個例子是:某位管理員授權某個 AI 代理(AI agent)代表自己行動,而該 AI 隨後又將權限委派給另一個既未經原管理員審核、也未獲授權的 AI 代理。這個未經審核的 AI 隨後便可能在沒有原始開發者許可或監督的情況下執行操作。

解決方案
在某些系統中,可以要求作業系統使用另一個客戶端的權限來開啟檔案。這種解法有一些缺點:

它要求伺服器必須明確地注意安全性。若伺服器設計天真或實作粗心,可能不會採取這個額外步驟。
如果伺服器本身同時又是另一個服務的客戶端,並且想要進一步傳遞對該檔案的存取權,那麼識別正確權限將變得更加困難。
它要求客戶端信任伺服器不會濫用借來的權限。此外,即使將伺服器與客戶端的權限取交集,也無法真正解決問題;因為伺服器可能仍必須一直持有非常廣泛的權限(而不只是特定請求所需的權限),才能代表任意客戶端行動。

解決混淆代理問題最簡單的方法,是將「物件的指定資訊」與「存取該物件的權限」綁定在一起。這正是 capability(能力)的概念。

在編譯器範例中,若採用 capability security(能力式安全),客戶端傳給伺服器的將不是檔案名稱,而是該輸出檔案的 capability,例如檔案描述符(file descriptor)。由於客戶端本身沒有計費檔案的 capability,因此它無法將該檔案指定為輸出目標。

在跨網站請求偽造(CSRF)的例子中,跨網站提供的 URL 將會攜帶自身的權限,而不是依賴網頁瀏覽器客戶端本身的權限。
另見

  • Setuid 可執行檔(Unix)
  • Ambient authority(環境權限)

參考資料

评论 (0)

  • 还没有评论,来抢沙发吧。