安全開機(secure boot)
假設你蓋了全世界最安全的房子——但每晚你睡著時,有人能把你的大門鎖換成一個讓他們進得來的假鎖。你白天所有的安全,在你還沒醒來前就被瓦解了。電腦在開機時面對的正是這個:若攻擊者能竄改「開機通電時最先執行的那段程式碼」,那麼之後載入的每一道防禦,都是建立在謊言之上。安全開機就是那個機制:在啟動的每一步,先檢查下一塊軟體是真實、未經修改的,才把控制權交給它。
它以一條信任鏈運作,每一環驗證下一環。機器通電時,韌體(UEFI)從一個小而受信任的根、以及一組由製造商燒入的密碼學金鑰開始。在它執行開機載入器之前,它拿那些受信任的金鑰去檢查開機載入器的數位簽章——若簽章有效,代表開機載入器由受信任的一方所產製、且未被更動,於是被允許執行;若否,開機就停止。開機載入器接著在啟動作業系統核心之前驗證它的簽章,而核心又能在載入驅動程式與模組之前驗證它們。於是信任從一個受硬體保護的根,一環一環往外延伸,而被竄改過的程式碼——譬如感染了開機載入器的後門程式——會通不過它的簽章檢查而被拒絕。一個相關的點子,測量式開機,並不阻擋不受信任的程式碼,而是把每個階段的密碼學測量值(一個雜湊)記錄進一個防竄改的晶片(TPM),使系統日後能精確證明它開機時跑了哪些軟體。
安全開機之所以重要,是因為它堵住了最深的一種攻擊:在作業系統之前、因而在任何防毒或核心防禦存在之前就載入的惡意軟體,它能完美藏身、並顛覆其上的一切(即所謂的 bootkit)。藉由從最初一條指令就建立信任,安全開機讓可信計算基礎從通電那一刻起就有意義。不過誠實的提醒是真切的。安全開機保證的是「程式碼由受信任的金鑰簽署」——它並不保證程式碼沒有臭蟲、甚至無害,只保證它來自持有受信任金鑰的某人,所以一個「已簽署但有漏洞」的開機載入器仍是個洞。誰掌控那些金鑰是個實在的顧慮,因為它觸及使用者執行自己軟體的能力(例如,替代的作業系統)。而且安全開機保護的是啟動鏈;對於「系統開起來、跑起來之後」才發動的攻擊,它無能為力。
一個 bootkit 改寫了開機載入器,好在作業系統之前載入並藏住自己。下次通電時,UEFI 拿製造商的受信任金鑰檢查開機載入器的簽章;被竄改的開機載入器不再符合任何有效簽章,於是韌體拒絕執行它、停機(或退回到一個復原映像)。這個感染根本沒機會載入。
每個階段在交出控制權之前,先驗證下一階段的簽章。
安全開機證明的是程式碼由受信任的金鑰簽署——而非它沒有臭蟲、甚至無害。一個「已簽署但有漏洞」的開機載入器仍是個洞;而且它只保護啟動鏈,對系統跑起來之後的攻擊毫無作用。