可信計算基礎(trusted computing base)
想像一整家銀行的安全,繫於少數幾樣東西:金庫的門、握有鑰匙的警衛,以及他們所遵循的規則。若這幾樣全都健全,銀行就安全;若其中任何一樣腐敗或損壞,別處再怎麼謹慎也救不了。在電腦裡,那個小而至關重要的核心,就是可信計算基礎,TCB:一組硬體、韌體與軟體元件,它們「絕對必須正確運作」,系統的安全才能成立。
具體來說,TCB 通常包含 CPU 的保護硬體(那些環與記憶體管理單元)、開機韌體、作業系統核心,以及少數幾個強制安全政策的特權程式。其定義性的性質並不是「這些元件因其美德而值得信賴」,而是「我們被迫去信賴它們」——TCB 中任何元件的瑕疵都能擊潰安全,無論它之外的一切多麼謹慎。TCB 之中坐著一個特別的觀念,參考監視器:那個對「每一次對每一個受保護物件的存取」都加以居間裁決、依政策檢查的元件。參考監視器要能盡責,必須具備三件事——永遠被呼叫(沒有任何存取能繞過它,即「完整中介」這個性質)、防竄改(攻擊者無法停用或修改它),以及小到足以被驗證(好讓我們真能說服自己它是對的)。核心的權限檢查,就是真實作業系統裡每天運作的參考監視器。
TCB 是安全裡最具釐清力的觀念之一,因為它把心力聚焦在要緊之處,並導出一條鋒利的設計規則:把 TCB 盡可能做小。TCB 內的每一行程式碼,都是「必須正確」的程式碼,所以它愈大,單一一個臭蟲能粉碎整個系統安全的地方就愈多。這正是微核心、以及像 seL4 這種小型已驗證核心背後的論點——把大部分程式碼推出特權核心之外,它們把 TCB 縮小到「一個有望做對、甚至能形式化證明為對」的程度。誠實的現實是:在主流作業系統上,TCB 龐大無比(一個數百萬行的單核心,加上數不清的驅動程式),這令人清醒:它意味著有「非常多」地方,一個失誤就可能毀掉一切,這也是為什麼「減少特權程式碼」是一個反覆出現的安全目標。
當行程呼叫 open("/etc/shadow", O_RDONLY),核心的權限檢查——TCB 的一部分,扮演參考監視器——會在回傳描述符之前查核呼叫者的權限。因為那道檢查永遠被呼叫、且在受保護的核心中執行,一般行程無法繞過它。然而,那道檢查裡的一個臭蟲,將是影響每一個檔案的 TCB 瑕疵。
參考監視器必須永遠被呼叫、防竄改,且小到足以驗證。
「可信」不等於「值得信賴」——它意味著系統別無選擇、只能依賴它。這正是為什麼目標是把 TCB 做小:它內部的每個元件,都是一個「單一臭蟲就能擊潰全部安全」的地方。