「多數高保證的工作都做在由笨機器人控制的動能裝置與地獄機器上。隨著資訊處理技術對社會越來越重要,這些顧慮也擴散到先前被認為本質上無害的領域,例如作業系統。」——Earl Boebert

「政府手機上的密碼老是掉,我進不去。」——美國外交官、前 CIA 官員 Kurt Volker,解釋他為何用私人手機傳訊息

「我做簡報;你洩密;他/她因洩露機密資訊而犯下刑事罪。」——英國公務員的動詞變化

為什麼要讀多層級安全#

接下來幾章會用案例研究探討安全政策的概念。安全政策是對「我們試圖達成什麼」的簡潔描述;它由我們對「想避免的壞結果」的理解所驅動,並反過來驅動工程。

本章其餘部分探討許多軍事與情報系統使用的**多層級安全(multilevel security, MLS)**政策模型:它們保存不同機密等級(密件、機密、最高機密…)的資訊,並必須確保資料只能被權限至少同等高的主體讀取。這類政策現在也越來越常被稱為資訊流控制(information flow control, IFC)。

  1. 約 1980 到 2005 年間,美國國防部投入數十億美元資助多層級安全研究。 所以這個模型被鑽研得極其詳盡,而我們得以理解「以極大熱忱追求單一政策目標」的二階效應。
  2. 用來實作它的**強制存取控制(MAC)**系統,如今已出現在 Android、iOS 與 Windows 等所有主要作業系統中,用來保護核心元件不被惡意程式竄改。
  3. 雖然多層級安全概念原本是為軍事系統的機密性而發展,許多商業系統現在使用多層級完整性政策。例如攸關安全的系統使用若干安全完整性等級

詩人阿基羅庫斯(Archilochus)有句名言:狐狸知道很多小事,刺蝟知道一件大事。安全工程通常屬於狐狸的地盤,而多層級安全是刺蝟取徑的例子。

什麼是安全政策模型#

在可能採取由上而下取徑的地方,安全工程通常會走成:威脅模型 → 安全政策 → 安全機制。這個過程中關鍵、卻常被忽視的部分,是安全政策

安全政策指的是一份清楚簡潔表達「保護機制要達成什麼」的文件。它由我們對威脅的理解驅動,並反過來驅動系統設計。它在「指定系統的保護需求、以及評估它們是否被滿足」上所扮演的角色,就像系統規格之於功能、安全論證之於 safety。如同規格,它的主要功能是溝通。

反面教材:企業「安全政策」的空話

許多組織用「安全政策」一詞指涉一堆空洞陳述:

Megacorp 公司安全政策

  1. 本政策經管理階層核准。
  2. 全體員工應遵守本安全政策。
  3. 資料應僅提供給有「知悉必要」的人。
  4. 一切違反本政策之情事應立即通報安全部門。

這種語言很常見,但(至少對安全工程師而言)毫無用處

  1. 它迴避了核心議題——誰決定「知悉必要」,又如何決定?
  2. 它混合了不同層次的陳述(組織對政策的核准,邏輯上不該是政策本身的一部分)。
  3. 有一個機制,但是隱含而非明示的:「員工應遵守」——但這實際上表示他們必須做什麼? 服從要由系統強制執行,還是使用者「憑良心」?
  4. 違規要如何被偵測,誰有通報的具體義務?

仔細想想,這是政治語言。政客的工作是化解社會中的張力,而這往往需要模糊的語言,好讓不同派系各自投射自己的期望;企業高層也常在政治性地運作,以平衡公司內部不同派系。

因為「安全政策」一詞常被濫用為「用安全來搞政治」,安全工程師已開始使用更精確的詞:

術語定義
安全政策模型(security policy model)對系統必須具備之保護性質的簡潔陳述。要點通常一頁以內就能寫完。這是系統保護目標與整個社群、或與客戶高層達成一致的文件,也可能是形式數學分析的基礎
安全標的(security target)對「特定實作提供哪些保護機制、它們如何對應到一份控制目標清單」的較詳細描述。它是產品測試與評估的基礎
保護剖繪(protection profile)像安全標的,但以與實作無關的方式表達,以便跨產品與版本做可比的評估。可能涉及使用半形式語言。這是要依 Common Criteria 評估之產品的必要條件

多層級安全政策#

1940 年 3 月 22 日,羅斯福總統簽署第 8381 號行政命令,讓某些類型的資訊可被列為限制級、密件或機密。杜魯門總統後來加上更高的最高機密。這發展成一套通用的文件敏感度保護標記制度,並在冷戰期間被北約各國政府採用。

最高機密(TOP SECRET)
機密(SECRET)
密件(CONFIDENTIAL)
非機密(UNCLASSIFIED)

原本的想法是:洩漏可能造成人命損失的資訊標為「機密」,洩漏可能造成大量人命損失的標為「最高機密」。

政府雇員與承包商依其被審查的仔細程度擁有權限(clearances)。在美國,「機密」權限涉及查核 FBI 指紋檔案,而「最高機密」還涉及過去五到十五年的背景查核、面談,且常包括測謊。候選人必須揭露近年所有性伴侶,以及一切可能被用來勒索他們的材料。

存取控制政策很簡單:只有當你的權限至少與文件的等級一樣高時,你才能讀它。 所以被授予「最高機密」的官員可以讀「機密」文件,反之則不行。資訊只能向上流動,永遠不能向下——除非有權者刻意決定解密它。

制度如何變得複雜:代號、描述詞、警語與國際標記

制度很快變得更複雜。文件分級的損害判準從可能的軍事後果,擴大到經濟損害甚至政治難堪。既非機密也非公開的資訊,在美國稱為「受控非機密資訊」(CUI),英國則用「Official」。

還有一套代號(codewords)制度,讓資訊(尤其是機密以上)能被進一步限縮。例如可能揭露情報來源或方法的資訊——如探員身分或解密能力——通常被列為「最高機密特殊區隔情報」(TS/SCI),意味著還加上所謂的知悉必要限制,一或多個代號被附加到檔案上。

有些代號關聯到特定軍事行動或情報來源,只提供給一組具名使用者。要讀一份文件,使用者必須擁有附加其上的所有代號。

一個分級標籤加上一組代號,構成一個安全類別;若至少有一個代號,就構成一個區隔(compartment)——一組具有相同存取控制政策的紀錄。

還有描述詞、警語與國際防務組織標記

  • 描述詞是「管理」「預算」「人事任命」這類詞:它們不引發任何特殊處理要求,所以標為「密件-管理」的檔案可以當成單純的「密件」處理。
  • 警語是「僅限英國人員閱覽」(UK Eyes Only)、或美國對應的 NOFORN 這類警告;它們確實產生限制。
  • 還有 NATO 這類國際防務組織標記。

一個奇特之處:在英國,「NATO Secret」比「Secret」更不機密,所以它是一種反代號,把內容在格上往下移而非往上移。

Anderson 報告與可信計算基礎#

1960 年代電腦開始被廣泛使用時,這套分級制度造成嚴重摩擦。

Paul Karger 當時在美國空軍工作,他描述自己必須從一個密件系統登出、走過院子到另一棟小屋、向持槍衛兵出示通行證、然後進去登入一個機密系統——一天十幾次。

人們很快意識到需要一種在同一張桌子上處理不同等級資訊的方式,但要怎麼做才不會洩密? 一個作業系統臭蟲修好了,就會發現另一個漏洞。

當時的憂慮是:即使不熟練的使用者也可能發現漏洞並機會性地利用;對惡意程式碼威脅的意識也在敏銳增長。(病毒到 1980 年代才被發明;70 年代的憂慮是特洛伊木馬。)

接著發生了嚴重的恐慌:五角大廈的**全球軍事指揮管制系統(WWMCCS)**被發現易受特洛伊木馬攻擊。這導致它的使用被限制在有「最高機密」權限的人,非常不方便。

下一步是 James Anderson 1972 年為美國政府所做的研究,結論是:

它引入了**參考監視器(reference monitor)**的概念——作業系統的一個元件,負責仲裁存取控制決定,並小到足以接受分析與測試,且測試的完整性能被保證。

用現代術語說,這類元件連同其相關的操作程序,構成可信計算基礎(Trusted Computing Base, TCB)。更形式地說,TCB 被定義為「其正確運作足以確保安全政策被執行」的元件集合(硬體、軟體、人…);或更生動地說:其失效可能導致安全政策被破壞的那些元件。

Bell-LaPadula 模型#

獲得廣泛接受的多層級安全政策模型,由 Dave Bell 與 Len LaPadula 在 1973 年提出。其基本性質是:資訊不能向下流動。

  • 簡單安全性質:任何行程都不得讀取較高等級的資料。也稱為不得向上讀(no read up, NRU)
  • *-性質(star property):任何行程都不得寫入資料到較低等級。也稱為不得向下寫(no write down, NWD)

*-性質是 Bell 與 LaPadula 的關鍵創新,由 WWMCCS 慘案與對特洛伊木馬攻擊的更一般恐懼所驅動。

一個沒有權限的使用者可能寫一個特洛伊木馬並把它放在某處,讓一位有「機密」權限的系統管理員執行;它接著能把自己複製到系統的「機密」部分、讀取那裡的資料,並設法以某種方式把它訊號傳到下面。

敵方探員也完全有可能在一家商業軟體公司找到工作,並在產品中嵌入尋找機密文件複製的程式碼。如果它接著能把它們往下寫到創造者能讀取的地方,安全政策就被違反了。 資訊也可能因為臭蟲而洩漏,如果應用程式能向下寫的話。

所以既有的文化假設:安全政策的執行獨立於使用者行動。而 BLP 更進一步——它不只要獨立於使用者的直接行動,還要獨立於他們的間接行動(例如他們所執行之程式採取的行動)。

獨立於使用者行動而強制執行安全政策的系統,被描述為具有強制存取控制(MAC);相對於 Unix 這類系統中使用者可自行決定其檔案存取權的任意存取控制(DAC)

BLP 模型讓設計者能證明定理:給定簡單安全性質(不得向上讀)與 *-性質(不得向下寫),可以證明——特別是——如果你的起始狀態是安全的,那麼你的系統就會保持安全。

對 BLP 的標準批評#

BLP 的引入引起了大量興奮:這是一個做到國防體系認為自己想要之事、直覺上清晰、卻仍讓人能證明定理的安全政策。研究者開始猛打它、精煉它。

System Z 爭論與寧靜性質

第一場大爭論是關於 John McLean 的「System Z」,他把它定義為一個 BLP 系統,外加一個功能:使用者可以請系統管理員暫時把任何檔案從 High 解密到 Low。這樣一來,Low 使用者可以讀任何 High 檔案,而不違反 BLP 的假設。

Dave Bell 反駁說 System Z 作弊了,因為它做了他的模型不允許的事(改變標籤不是狀態上的有效操作);而 John McLean 的回擊是:模型並沒有明白告訴他這件事——所以 BLP 規則本身是不夠的。

這個議題靠引入**寧靜性質(tranquility property)**來處理:

  • 強寧靜:安全標籤在系統運作期間永不改變。
  • 弱寧靜:標籤永不以違反既定安全政策的方式改變。

為什麼要弱寧靜?

在真實系統中,我們常想遵守最小權限原則,即使行程擁有者有「最高機密」權限,也讓行程從無權限層級開始。如果他們接著存取了一封密件郵件,他們的工作階段就自動被升級到「密件」;一般而言,行程每次存取更高層級的資料就被升級一次(高水位原則)。

所以一個讀過「機密」與「密碼」檔案的行程,此後會建立標為「機密 密碼」的檔案,包括它對其他檔案所做的暫存副本。如果它接著讀了一個標為「機密 核子」的檔案,那麼此後它建立的所有檔案都會被標為「機密 密碼 核子」,而它將無法寫入任何標為「機密 密碼」的暫存檔。

這對應用程式的影響,是多層級安全的嚴重複雜性之一:多數應用軟體必須被改寫(或至少修改)才能在 MLS 平台上執行。

安全等級的即時改變意味著資源存取權可能隨時被撤銷,包括在交易進行到一半的時候。而由於撤銷問題在現代作業系統中一般是無解的(至少無完整解),應用程式只好自己想辦法應付。

除非你投入一些細心與努力,否則你很容易發現:要嘛一切最後都跑進最高的區隔,要嘛系統碎裂成數千個彼此完全不通訊的小區隔。

BLP 的另一個問題(其實是所有強制存取控制系統的問題)是:把使用者與行程分開是簡單的部分;難的部分是當需要某種受控互動時。

多數真實應用需要某種能打破安全政策的可信主體(trusted subject)。經典例子是一個可信的文書處理器,幫助情報分析師在把一份最高機密文件編輯成機密時把內容洗乾淨。

BLP 對「系統該如何保護這類應用」保持沉默。 於是它成為 TCB 的一部分——但卻是無法用純粹基於 BLP 的模型加以驗證的那一部分。

MLS 政策的演化#

多層級安全政策在實務界與研究界平行演化。

從 ADEPT-50 到 SELinux:MLS 的家族樹

第一個多層級安全政策是 1967–8 年為 ADEPT-50 寫的一個高水位版本,那是為 IBM S/360 大型主機開發的強制存取控制系統。它使用「等級、區隔、群組」的三元組,群組是檔案、使用者、終端機與作業。由於主體是程式(而非行程),它易受特洛伊木馬攻陷。 儘管如此,它為 BLP 奠下基礎,也帶出了現今 IBM S/390 大型主機的硬體安全架構。

下一大步是 Multics,1965 年作為 MIT 專案開始,後來發展成 Honeywell 的產品;它成了「可信系統」的模板與啟發性範例。 Paul Karger 與 Roger Schell 對它所做的評估影響極大,並且是「惡意程式可以藏在編譯器裡」這個想法首次出現之處——這導致了十年後 Ken Thompson 那篇著名的〈Reflections on Trusting Trust〉。

1980 年代起湧入多層級安全的研究經費,導致若干替代形式化:

  • 不干擾(Noninterference)(Goguen 與 Meseguer, 1982):在具此性質的系統中,High 的行動對 Low 能看到什麼毫無影響。
  • 不可推導(Nondeducibility)(Sutherland, 1986):較不嚴格,用來建模「區網上同時有 Low 與 High 機器,而 High 機器加密其區網流量」這類應用。結果證明它太弱,因為沒有什麼能阻止 Low 以 99% 的確定性對 High 的輸入做推論。
  • 其他理論模型包括一般化不干擾限制性Harrison-Ruzzo-Ullman 模型處理「如何應付檔案的建立與刪除」(BLP 對此沉默);而**區隔模式工作站(CMW)**政策則試圖用浮動標籤來建模資訊分級。

這波創新中對現代系統影響最大的模型,大概是型別強制(TE)模型(Boebert 與 Kain),後被 Lee Badger 等人擴展為域與型別強制(DTE)。它把主體指派到域、把物件指派到型別,並用矩陣定義允許的域-域與域-型別互動。

DTE 引入了組態語言(DTEL),以及基於路徑名的隱式型別化。DTE 比 BLP 更一般,因為它開始同時處理完整性與機密性的顧慮。

早期用途之一是強制執行可信管線(trusted pipelines):把一組行程限制在管線中,使每個行程只能與前一階段和後一階段對話。這可以用來組裝除非至少兩個階段被攻陷、否則無法繞過的守衛與防火牆。

型別強制機制能意識到程式碼與資料的區別,而權限可以綁到程式碼上;因此寧靜問題可以在執行時處理,而非在資料被讀取時處理。這讓事情容易處理得多。

TE/DTE 更大彈性與表達力的代價是:由於狀態爆炸,要實作 BLP 這類政策不總是直截了當;寫安全政策時你必須考慮不同型別之間所有可能的互動。

可以用其他機制管理政策複雜度,例如先跑一個原型觀察什麼算正常行為,然後打開 DTE 並阻擋迄今未見的所有資訊流。但這對「你推導出的政策是不是對的」並沒有給出多少保證。

**1992 年,基於角色的存取控制(RBAC)**由 Ferraiolo 與 Kuhn 引入以管理政策複雜度。它形式化了主要附著於角色(而非個別使用者或機器)的規則:先指定某角色持有者可執行的交易,再指定授予角色成員資格(包括委任)的機制。

角色(或群組)多年來一直是銀行這類組織實際用來管理存取控制的機制;RBAC 模型開始把它形式化。它可以做更細粒度的控制,例如對「作為教授的 Ross」「作為招生委員會成員的 Ross」與「讀私人郵件的 Ross」授予不同的存取權。

一個變體 ABAC 加上情境,於是你能區分「在實驗室工作站前的 Ross」與「在地球上某處用手機的 Ross」。Windows 自 Windows 8 起支援兩者。

Biba 模型:把 BLP 倒過來#

Windows 7 納入多層級完整性模型,復興了人們對 Ken Biba 1975 年所設計之安全模型的興趣——它只處理完整性、忽略機密性。

Biba 的觀察是:機密性與完整性在某種意義上是對偶概念——機密性是對「誰能讀一則訊息」的約束,而完整性是對「誰能寫或改它」的約束。

所以你可以把 BLP 倒過來,回收成一個完整性政策。

以具體應用為例:心電圖(ECG)這類電子醫療裝置可能有兩種分離的模式——校準使用。校準資料必須被保護不受損壞,所以一般使用者應能讀它但不能寫它;當一般使用者重置裝置時,它會失去當前的使用者狀態(記憶體中的病患資料),但校準必須保持不變。只有授權技師才能重做校準。

要建模這樣的系統,我們可以用一個多層級完整性政策,規則是:

  • 可以讀取較高層級的資料(使用者行程可讀校準資料);
  • 可以寫入較低層級(校準行程可寫入使用者行程中的緩衝區);
  • 但絕不可向下讀或向上寫,因為兩者都可能讓 High 完整性物件被 Low(即潛在不可靠)資料污染。

Biba 模型常以低水位原則表述,那是前述高水位原則的對偶:一個物件的完整性,是所有促成其創建之物件中最低的等級。

Biba 在真實系統中的應用與限制

這是第一個形式化的完整性模型,而數量驚人的真實系統以 Biba 的方式運作:

  • 鐵路的旅客資訊系統可能從號誌系統取得資訊,卻不該能影響它;
  • 電力公司的電力調度系統能看到安全系統的狀態,卻不能干預它們。
  • 攸關安全的系統社群談的是安全完整性等級,它與「安全機制失效的機率」以及「它被設計來提供的風險降低程度」有關。

Windows 自第 6 版(Vista)起,以完整性等級標記檔案物件,可以是 Low、Medium、High 或 System,並實作預設的 NoWriteUp 政策。關鍵檔案在 System,其他物件預設在 Medium——除了瀏覽器在 Low。所以用 IE 下載的東西可以讀 Windows 系統中的多數檔案,卻不能寫入它們。目標是限制惡意程式所能造成的損害。

例如真實系統通常需要能覆寫安全模型的可信主體,而 Biba 本身無法保護與限制它們(BLP 也不能)。舉例來說,汽車的安全氣囊位於比引擎較不關鍵的匯流排上,但當它引爆時,你假設有燃油起火的風險,於是把引擎關掉。

還有其他 Biba 也無法表達的真實完整性目標,例如可保證管線。就 Windows 而言,微軟甚至放棄了 NoReadDown 限制,也沒有真的用它的完整性模型去保護基礎系統不受使用者影響,因為那會需要更頻繁的使用者確認。

事實上,型別強制模型正是 Boebert 與 Kain 作為 Biba 之替代方案而引入的。Windows 沒有納入 TE 是件憾事。

MLS 系統的歷史實例#

SCOMP、橘皮書與資料二極體

**SCOMP(安全通訊處理器)**是 Multics 的衍生產品,1983 年推出,是一項不惜成本的實作——實現美國國防部認為自己想要的「多層級分級訊息處理」。它有形式驗證過的硬體與軟體,以及一個把事情保持簡單的極小核心。其作業系統 STOP 使用 Multics 的環系統,維持多達 32 個分離的區隔,並允許它們之間適當的單向資訊流。

SCOMP 被用於軍用郵件守衛這類應用——讓郵件能從 Low 傳到 High 但反之不行的防火牆。(一般而言,支援單向流的裝置稱為資料二極體(data diode)。)

這是第一套系統性的安全電腦系統標準,1985 年推出、2000 年 12 月退役。橘皮書的影響力不只在美國,也及於盟邦;英國、德國與加拿大等國都以它為基礎制定自己的國家標準,直到這些標準最終被納入 Common Criteria。

橘皮書允許系統在若干等級上被評估,A1 最高,往下經 B3、B2、B1 到 C2、C1。SCOMP 是第一個被評為 A1 的系統。

資料二極體:人們很快意識到,簡單的郵件守衛與加密盒子太受限,因為除了郵件之外還發展出更複雜的網路服務。第一代 MLS 機制對即時服務效率不彰。

美國海軍研究實驗室(NRL)因此開發了 Pump——一個單向資料傳輸裝置,允許安全的單向資訊流。

Pump 用緩衝與確認訊息的隨機時序等機制,限制可能的反向洩漏頻寬。

隨著硬體成本下降,這已成為首選選項。世界各地的軍事基地如今滿是 KVM 切換器(讓人們在 Low 與 High 系統之間切換鍵盤、螢幕與滑鼠)與資料二極體(用來連接 Low 與 High 網路)。

一個早期應用是後勤。 有些訊號情報設備是「最高機密」,而噴射燃料與鞋帶這類東西不是;但即使這麼簡單的商品,當其數量或移動可能洩漏戰術意圖時也可能變成「機密」。

管理這一切所需的系統可能很難建造;美英的 MLS 後勤專案最後都成了昂貴的災難。

英國皇家空軍的**後勤資訊技術系統(LITS)**是一個歷時十年(1989–99)、耗資 5 億英鎊的專案,要為 80 個基地提供單一的物資管理系統。它被設計成在兩個層級上運作:噴射燃料與鞋油用「限制級」,核彈這類特殊物資用「機密」。它起初被實作成兩個分離的資料庫系統,中間用 pump 連接以強制執行 MLS 性質。

這個專案成了「需求潛移導致成本失控」的經典故事。 其中一項改變是冷戰結束後分級規則的放寬。結果人們發現幾乎所有「機密」資訊現在都是靜態的(例如空投核彈的操作手冊,那些彈藥現在存放在戰略儲備而非空軍基地)。為了省錢,「機密」資訊現在被放在一張 CD 上,鎖在保險箱裡。

MLS 的另一個主要應用是電話監聽。

被調查的目標不該知道自己被監聽,所以第三方必須靜默——而當電話公司開始把監聽實作成靜默的電話會議時,會議費用必須算在監聽者頭上,而不是目標頭上。

現代需求是多層級的:不同層級的多個機關可能想監控某個目標,也想監控彼此——警方監聽毒販、反貪單位監看警方,依此類推。

消除隱蔽通道比看起來難;純 MLS 安全政策是不足的,因為嫌疑人可能試圖駭入或搞亂監聽設備,所以設備還必須能抵抗線上竄改。

在一起惡名昭彰的案件中,雅典奧運期間希臘總理與其資深同僚的手機被發現遭監聽:手機公司交換設備中的合法監聽功能被未授權軟體濫用,而被發現是因為竊聽者的修改導致某些簡訊未被送達。該電話公司被罰 7,600 萬歐元(近一億美元)。

軍用嵌入式系統的例子也很多:

  • 在潛艦上,速度、反應爐輸出與轉速都是最高機密,因為這三項量測的歷史會揭露該艦的性能——而那是連美英都不共享的少數資訊之一。工程上更複雜的是,這些儀器在艦艇入港時不該是最高機密,否則會使維護變複雜。
  • 至於空戰,某些美國雷達不會顯示性能被分級之美國飛機的速度,除非操作員有適當權限。 當你讀到 F-16 飛行員看到某個「速度在雷達上完全說不通」之瘋狂快速 UFO 的故事時,你可以把二和二加起來。

MAC:從 MLS 到 IFC 與完整性#

本書第一版中,作者注意到一個趨勢:用強制存取控制來防止竄改並提供即時效能保證,並冒險說「也許多層級系統真正的未來不在機密性,而在完整性。」

  • Windows:所有行程都有、所有可保護物件(含目錄、檔案與登錄鍵)都可以有完整性等級標籤。檔案物件預設標為 Medium,而 IE(以及用它下載的一切)標為 Low。因此需要使用者動作才能升級下載的內容,讓它能修改既有檔案。

    用 Windows 也能實作粗糙的 BLP 政策,因為你也可以設定 NoReadUp 與 NoExecuteUp 政策。這些不是預設安裝的;微軟擔心惡意程式會把自己裝進系統然後隱藏起來。把瀏覽器保持在 Low 讓安裝更難,而允許所有行程(即使是 Low 的)檢視系統其餘部分則讓隱藏更難。

    但這種「只管完整性」的 MAC 取徑意味著:跑在 Low 的惡意程式仍能偷走你所有的資料;所以有些使用者也許該為敏感目錄設定 NoReadUp。

  • SELinux:情況與 Windows 有些類似,強制存取控制機制的直接目標同樣是限制攻陷的效果。它由 NSA 實作,基於 Flask 安全架構——該架構把政策與執行機制分離。安全伺服器在核心中(為效能之故)做政策決定,並向核心其餘部分提供安全 API,把安全模型藏在後面。伺服器內部實作一個能表達 RBAC、TE 與 MLS 的通用約束引擎。

    在 2000 年代中期的典型 Linux 發行版中,它被用來分隔各種服務,於是接管你網頁伺服器的攻擊者,不會因此也取得你的 DNS 伺服器。 它被 Android 採用後,成為世界最流行作業系統的一部分。

  • 嵌入式系統:有許多已部署系統實作了某種 Biba 模型的變體。

    在電力公司中,典型有一個安全系統的層級結構,以最高安全完整性等級完全獨立運作;這些系統對電力調度這類運營系統可見,卻不能被它們影響;零售層級的計量系統可被計費系統觀察,卻不能被它影響。零售電表與調度系統中的變電站層級電表都把資訊餵進詐欺偵測,最後是能觀察一切卻對運作沒有直接影響的高階資訊系統。

    在汽車上,多數廠牌為動力系統與座艙設有分離的 CAN 匯流排,因為你不希望收音機上的惡意 app 能操作你的煞車(不過 2010 年安全研究者發現這種分隔完全不足)。

值得記住:簡單的完整性控制只是阻止惡意程式接管機器——它們並不阻止惡意程式感染一個 Low 區隔,並以它為跳板向別處擴散、或對其他機器發出指令。

會出什麼錯#

工程師從失敗的系統學到的比從成功的更多,而 MLS 系統在這方面是位有效的老師。 花在「以高度保證遵循一個簡單政策」上的數十億美元,釐清了資訊流控制的許多二階與三階後果。

可組合性#

考慮一個簡單裝置:它接受兩個 High 輸入 H₁ 與 H₂;把它們多工;用一次性密碼本(即隨機產生器)互斥或加密它們;把密碼本的另一份副本輸出到 H₃;並輸出密文——由於它是用一個提供完美保密性的密碼系統加密的,它被認為是 Low(輸出 L)。

然而如果允許回饋,那麼 H₃ 的輸出可以被餵回 H₂,結果是高輸入 H₁ 現在出現在低輸出 L 上。

時序不一致也能破壞兩個安全系統的組合。

一般而言,組合問題——如何把兩個以上的安全元件組合成一個安全系統——是困難的,即使在「證明關於理想元件之結果」這種相對乾淨的層次上。(簡單資訊流不可組合;不干擾與不可推導也不可組合。)

多數低層次問題出現在引入某種回饋時;沒有回饋的話,組合在若干形式模型下是可以達成的。然而在真實生活中回饋無所不在,而安全性質的組合還可能因介面議題、功能互動等而更難。例如一個系統可能以某種速率產生資料,對另一個系統形成阻斷服務攻擊。

級聯問題#

橘皮書引入一系列評估等級後,導致了關於「一個系統能在多少個等級上運作」的跨距限制規則。例如被評為 B3 的系統一般被允許處理「非機密、密件、機密」或「密件、機密、最高機密」的資訊;沒有任何系統被允許同時處理非機密與最高機密資料。

隱蔽通道#

跨距限制被強加於多層級系統的理由之一,來自一個著名且被廣泛研究的問題:隱蔽通道(covert channel)

隱蔽通道由 Lampson 在 1973 年首次指出,是一種並非為通訊而設計、卻能被濫用來讓資訊從 High 傳到 Low 的機制。

典型的隱蔽通道出現在「高行程能藉由影響某個共享資源來對低行程發訊號」時。

在現代多核心 CPU 中,它可以在時刻 tᵢ 提高自己所用 CPU 核心的時脈頻率,表示某個最高機密檔案的第 i 位元是 1;讓它退回則表示該位元是 0。這給出每秒數十位元的隱蔽通道容量。

自 2018 年起,CPU 設計者一直在與一系列利用 CPU 微架構的隱蔽通道搏鬥;它們有 Meltdown、Spectre 與 Foreshadow 這樣的名字,不只提供了 High 向 Low 發訊號的方式,也提供了 Low 繞過存取控制、讀取 High 記憶體的方式。

在一般作業系統中,開發者對機密性保護所能做到的最好一致水準,是把它限制在每秒 1 位元左右。

每秒一位元在「我們希望防止大型 TS/SCI 檔案(如衛星照片)從 TS/SCI 使用者洩漏到機密使用者」的環境中或許可以忍受。然而它對高價值密碼金鑰是潛在的致命威脅。這是軍方與銀行業「在專用硬體中做密碼運算」教條的理由之一。

惡意程式的威脅#

當 Fred Cohen 寫下第一篇關於電腦病毒的論文、並在 1983 年用一個病毒輕易穿透多層級安全系統時,國防電腦社群大為震驚。

在他的第一個實驗中,一個只花了八小時寫的檔案病毒,成功穿透了一個先前被認為是多層級安全的系統。

人們自 1960 年代就在思考惡意程式並做了各種緩解,但他們的焦點一直是特洛伊木馬。

惡意程式碼能被用來打破存取控制的方式有很多。如果參考監視器(或其他 TCB 元件)能被腐化,那麼惡意程式就能把整個系統交給攻擊者,例如發出一個未授權的權限。

為此,對所謂封閉安全環境(定義為「系統應用受到充分保護、不會被插入惡意邏輯」的環境)適用略寬鬆的規則,而這反過來給了廠商用 TPM 這類技術把 TCB 防篡改化的誘因。

但即使 TCB 保持完好,惡意程式仍能把自己從 Low 複製到 High(BLP 並不阻止這件事),並用隱蔽通道把資訊發訊號下來。

多重實體化#

另一個讓研究社群傷腦筋的問題是多重實體化(polyinstantiation)

假設我們的 High 使用者建立了一個叫 agents 的檔案,而我們的 Low 使用者現在也試著建立同名檔案。

  • 如果 MLS 作業系統禁止他,它就洩漏了資訊——也就是 High 有一個叫 agents 的檔案。
  • 但如果它允許他,它現在就有兩個同名的檔案。

我們常能靠命名慣例解決(例如給 Low 與 High 使用者不同的目錄)。但這個問題對資料庫仍然很難。

假設一位 High 使用者把一批機密貨物配給一艘船。系統不會把這件事透露給 Low 使用者,而後者可能以為船是空的,於是試圖再配一批貨、甚至更改它的目的地。

這裡美英做法分歧:

美國偏好的解法英國的解法
做法High 使用者在配置真實的 High 貨物時,同時配置一個 Low 掩護故事系統對試圖檢視或更動 High 紀錄的 Low 使用者,自動回覆「已分級」
機密層看到飛彈 → 伊朗飛彈 → 伊朗
限制級層看到已分級 → 已分級
非機密層看到引擎備品 → 賽普勒斯

缺點是每個人往往都需要最高的可得權限才能完成工作。(實務上掩護故事仍會被使用,以免把隱密任務的存在宣傳得超過必要。)

MLS 的實務問題#

  1. 它們的產量很小,而且往往依高標準的實體堅固度製造,使用由軍事採購官僚驅動的精細文件、測試與其他品管措施。

  2. MLS 系統有特異的管理工具與程序。 受過訓練的 Unix 管理員不能未經大量進一步訓練就接手一個 MLS 安裝;所以許多 MLS 系統安裝後其功能根本沒被使用。

  3. 許多應用必須被改寫、或至少大幅修改,才能在 MLS 作業系統下執行。

  4. 由於行程在看到新標籤時會自動被升級,它們使用的檔案也必須如此。 新檔案預設為任何可能輸入所屬的最高標籤。

    這一切導致慢性的過度分級傾向。當系統元件累積它們看過的所有標籤時尤其成問題,導致標籤爆炸——它們取得如此一堆標籤,以致沒有任何單一主體還能存取它們。

    於是它們被放進可信計算基礎,而 TCB 最後含有相當大一部分的作業系統(加上工具程式、視窗系統軟體、以及資料庫軟體這類中介軟體)。這種「TCB 膨脹」持續推高評估成本並降低保證。

  5. 資料的分級可能變得複雜:

    • 衝突前夕,食物這類「無害」物資的位置可能洩漏戰術意圖,因而可能突然被升級
    • 分級不總是單調的。分級為「密件」的設備很容易含有分級為「機密」的元件;反過來,很難在一個「最高機密」資料庫中對機密資訊授予「機密」層級的存取權;
    • 資訊可能需要被降級。情報分析師可能需要把一張 TS/SCI 的衛星照片貼進給前線指揮官的「機密」評估中。萬一有病毒把資訊隱蔽地藏在影像中,這可能涉及特殊過濾器、影像的有損壓縮等等;一個選項是「列印再傳真」機制,把文件變成點陣圖並記錄下來以供追溯;
    • 我們可能得擔心攻擊者可取得的資訊量。例如我們也許樂於解密任何單張衛星照片,但解密整批照片會揭露我們的監視能力與情報優先順序的歷史
    • 對非機密資料執行之非機密程式的輸出可能是機密的,例如若標準資料探勘技術用於某個線上論壇後拋出一份恐怖分子嫌犯名單。
  6. MLS 系統雖能防止不想要的事(如資訊洩漏),也防止了想要的事(如建立一個跨機關所有最高機密區隔資料運作的搜尋引擎)。

  7. 偏執的政府保密是慢性負擔。 已故的 Moynihan 參議員寫過一份批判性研究,探討其真實目的與它在美國外交與軍事事務上的巨大成本。

    例如杜魯門總統從未被告知 Venona 解密的事,因為那些材料被認為是「陸軍財產」。用他的話說:

    「部門與機關囤積資訊,而政府變成一種市場。秘密成為組織資產,除非用來交換另一個組織的資產,否則絕不分享。

    更晚近的例子包括:阿富汗戰爭中對無人機使用未加密通訊(因為武裝部隊擔心一旦把 NSA 官僚體系扯進來,無人機就沒法用了);以及新冠危機期間英國政府內閣會議使用惡名昭彰不安全的 Zoom 視訊會議系統(政府的加密視訊會議終端機是機密的,所以部長們不准把它們帶回家)。

    這讓人想起一位受夠了的英國將軍的俏皮話:「侏羅紀公園和國防部有什麼差別?一個是滿是恐龍的主題樂園,另一個是電影!」

Mitre/JASON 的內部戰略批判與 MLS 的退場

Mitre 的 JASON 計畫在 2004 年對美國分級制度的一份報告結論是:它已不再適用於其目的。

有許多有趣的理由,包括生產者社群與消費者社群對風險/效益的計算大不相同;分級後來被發行通路而非實際風險所主導。攻擊的相對容易,導致政府系統過於保守與規避風險。

報告注意到許多反常結果:例如伊拉克的 Predator 無人機影像是非機密的,且有一段時間是明文傳輸的——因為陸軍擔心加密會把 NSA 官僚體系捲入金鑰管理,妨礙作戰。

Mitre 建議改為:為特定目的設立彈性區隔(尤其是把易逝的資訊送到戰術區隔時);聰明地運用權利管理與虛擬化這類技術;並用聚焦於交易風險的制度取代對已審查個人的終身信任。

本書第二版以來的一大改變是:國防部龐大的 MLS 研究計畫消失了,MLS 設備不再在政府系統市場上被積極推廣,而系統已停滯十年。

因此已部署的 MLS 系統傾向是不同層級之間的防火牆或郵件守衛,並常被以新縮寫 MILS(multiple independent levels of security)稱呼。真正的分離在網路層次:非機密網路、用基本標準設備在加密後處理機密資料的 SIPRNet,以及處理最高機密材料、其系統保存在 SCIF(為防電子竊聽而屏蔽的房間)中的 JWICS

偶爾有一些可怕的變通做法,例如讓 High 的人檢視 Low 網站的「向下瀏覽」系統;他們被允許點按鈕與連結來導航,就是不能輸入任何文字。這類醜陋的 hack 顯然有被濫用的潛力;最好的情況下,它們能幫助誠實的人避免粗心的錯誤。

小結#

強制存取控制起初是為軍事應用而發展的,至今仍用於特化的防火牆(守衛與資料二極體)。

MAC 機制自 1970 年代中期以來一直是電腦安全研究的主要課題,而試圖把它們用於軍事多層級安全所學到的教訓,構成了許多安全評估方案的基礎。

實務工作者理解它們的優點與限制很重要,這樣你才能在適當時援引研究文獻,並在不適當時避免被拖進過度設計。

研究問題#

Earl Boebert 在 NSA 推出 SELinux 後於 2001 年勾勒出一個長期挑戰:把強制存取控制機制調適到攸關安全的系統上(見本章開頭引文)。

作為建造高保證專用裝置、限制錯誤與失效後果的工具,型別強制與基於角色的存取控制這類機制,在安全世界之外應該也很有用。

我們會在物聯網中看到它們被廣泛使用嗎? 我們提過汽車與電力配送這類應用中的 Biba 式機制;SELinux、Windows 與 Android 這類產品中的 MAC 機制,能讓設計者鎖住資訊流、降低未預期互動的可能性嗎?

  • NSA 仍在資助 MLS 研究(現在冠以 IFC 之名),儘管規模低於過去。在現代智慧手機上把它做對很難:除了現代作業系統本身更高的內在複雜度,手機還有大量旁通道,而其 app 往往只有在與雲端服務通訊時才有用——真正的重活得在那裡完成。

  • 另一組研究議題圍繞著實際的軍事作業安全,那裡的現實遠遠落後政策。

    現實中的軍事 OPSEC 有多糟

    參與近期衝突的所有武裝部隊(包括在伊拉克與阿富汗的美英部隊)都遇到過與個人手機相關的安全問題,叛亂分子在某些案例中追溯到他們在家鄉的家人並以威脅騷擾他們。

    英國皇家海軍在 2009 年試圖禁用手機,但太多水兵離職了。

    紀律傾向聚焦在立即的作戰威脅上,例如當一名水兵在拆除水雷時被看到在用 Snapchat——那裡的問題是「在水雷附近使用無線電的風險」!

    不同海軍嘗試了不同做法:挪威人有自己專屬的水兵網路,美國正在試驗具 MLS 功能的手機。但北約演習已顯示,一支海軍要駭入另一支的導航系統簡單得令人震驚。 而即使是以色列人,也遇過士兵在西岸與戈蘭高地使用手機的問題。