系統程式設計的前沿

以能力為基礎的安全(capability-based security)

多數系統回答「這個程式被允許做這件事嗎?」的方式,是拿身分去比對一份清單:這個使用者擁有這個檔案、這個帳號有管理員權限,所以動作被許可。以能力為基礎的安全採取不同的立場。權威不是你因為「身為誰」而擁有的東西;它是你「持有」的東西——一個不可偽造的權證,它既指名一個特定資源,又授予對它的一項特定權利。若你持有那個權證,你就能動作;若你不持有,你甚至無法指涉那個資源。這個權證就叫做能力(capability)。

具體而言,把能力想成一把同時也是標籤的鑰匙:它說「就是這個檔案,附寫入權限」,且無法被猜測、偽造,或被竄改成指向別處——它通常是核心發放並追蹤的一個受保護參考,而非程式能捏造的一個數字。關鍵在於不存在環境權威:一個程式無法僅憑在全域名稱空間裡指名一條路徑就觸及某資源,因為根本沒有全域命名——它只能使用它被明確賦予了能力的那些資源。你藉由把一個能力傳給別人來委派權威(而且你可以傳一個較弱的,比方說唯讀),那個人現在就正好擁有那個、別無其他。WASI 的預先開啟目錄與 seL4 的存取控制,都是這個模型真實、現代的例子。

它之所以重要,是因為它讓「最小權限」成為自然的預設、而非一個志向:一個只被交付了某一個通訊端與某一個目錄之能力的元件,字面上碰不到其他任何東西,所以它裡頭的臭蟲或被攻陷,是依建構而被圍堵的。對比一下常見的環境權威世界,在那裡一個行程帶著你的全部權限執行,單一的缺陷就能觸及你的整個帳號。不過要老實談極限:能力必須真的不可偽造,而撤銷可能很彆扭(收回一個已委派的能力,比刪掉權限清單裡的一列要難),而且若一個有特權的元件被誘騙去代替別人使用它的能力,「混淆代理人」(confused deputy)式的錯誤仍可能發生。這個模型重塑了權威所在之處;它本身並不使系統毫無臭蟲。

環境權威(常見):行程帶著你「全部」的權利執行; open("/etc/passwd") 只憑指名路徑就成功 -> 一個臭蟲就觸及一切 能力模型:你只被交付了 { 目錄把柄:/srv/data,權利:讀取 } -> 你能讀取 /srv/data 底下,且字面上無法指名其他任何東西

有了能力就沒有環境權威:一個元件只能對它被明確交付了權證的資源動作,使最小權限成為預設。

能力安全重塑了權威所在之處,但本身並不使系統毫無臭蟲:權證必須真的不可偽造,撤銷一個已委派的能力比刪掉一筆權限項目要難,而一個被誘騙代替攻擊者使用其能力的、有特權的「混淆代理人」仍可能存在。

又称
capabilitiesobject-capability model權能能力安全模型