「以人性的曲木,從未造出任何筆直之物。」——康德(Immanuel Kant)
「這個世界不論線上或線下都不會完美;所以別為線上世界設下不可能達到的高標準。」——戴森(Esther Dyson)
安全工程是什麼#
安全工程(security engineering)談的是:建造出在惡意、錯誤與意外(malice, error, or mischance)之下仍能保持可靠的系統。 作為一門學科,它聚焦於設計、實作、測試完整系統,並在環境演變時調適既有系統所需的工具、流程與方法。
它需要跨領域的專業:
- 密碼學、電腦安全、硬體防篡改(tamper-resistance)
- 經濟學、應用心理學、組織與法律
- 系統工程技能:商業流程分析、軟體工程、評估與測試
系統工程技能重要,但不夠——因為它只處理錯誤與意外,不處理惡意。
安全工程師還需要**對抗性思維(adversarial thinking)**的功力,就像西洋棋手:你得研究過大量成功的攻擊,從開局、中盤發展一路到結果。
許多系統有關鍵的保證需求,失效的後果包括:危及人命與環境(核安與控制系統)、重創主要經濟基礎設施(提款機與線上支付)、危害個人隱私(醫療紀錄系統)、瓦解整個產業的可行性(預付式公用事業電表)、以及助長犯罪(防盜與汽車警報器)。隨著軟體無所不在,資安與安全性(safety)越來越交纏在一起。甚至「系統看起來比實際上更脆弱」這種認知本身,就有真實的社會成本。
一個常見但錯誤的對比#
傳統看法是:軟體工程確保某些事會發生(「John 可以讀這個檔案」),資安則確保某些事不會發生(「中國政府不能讀這個檔案」)。
現實遠比這複雜。不同系統的安全需求差異極大,你通常需要使用者認證、交易完整性與問責、容錯、訊息保密與隱蔽性的某種組合。
許多系統失敗,是因為設計者保護了錯的東西,或者用錯的方式保護對的東西。
一個思考框架#
要建造真正可靠的系統,需要四件事湊在一起:
- 政策(policy):你應該達成什麼。
- 機制(mechanism):你用來實作政策的密碼、存取控制、硬體防篡改等機具。
- 保證(assurance):你能對每個機制寄予多少信賴,以及它們協同運作得多好。
- 誘因(incentive):守護與維護系統的人把工作做好的動機,以及攻擊者擊敗你的政策的動機。
這四者互相作用(原書圖 1.1「安全工程分析框架」以四個角落呈現此四要素)。
用 911 來拆解這四層#
- 政策失敗,不是機制失敗:劫機者把刀帶過機場安檢,是因為當時三英吋以下的刀是被允許的;安檢人員把槍和爆裂物擋下來的工作做得沒錯。政策後來改得很快:先禁所有刀,再禁多數武器(球棒現在禁,威士忌瓶子可以),細節上反覆搖擺(丁烷打火機先禁後又放行)。
- 機制很弱:複合材料刀具、不含氮的爆裂物之類的東西擋不住。
- 保證一向很差:每個月數以噸計無害的旅客物品被丟進垃圾桶,而真正通過安檢的武器(不論是意外還是測試用途)被發現沒收的不到一半。
美國運輸安全管理局(TSA)在效果平平的旅客安檢上花了數十億美元,而花一億美元強化駕駛艙門就移除了大部分風險。航空駕駛員安全聯盟主席指出:多數地勤人員不受安檢,過夜停放的飛機幾乎無人看守;由於多數客機沒有門鎖,壞人推個梯子上去放炸彈沒什麼能阻止他——若他有飛行技術和一點膽識,甚至可以提交飛行計畫然後把飛機開走。但安檢員工與看守飛機就是不受重視。
結果就是施奈爾(Bruce Schneier)所說的「安全劇場(security theatre)」——設計來產生安全感而非安全的措施。多數參與者都有誇大恐怖主義威脅的誘因:政客要「靠恐懼拉抬選票」(歐巴馬語)、記者要多賣報紙、廠商要多賣設備、政府官員要擴張自己的地盤、資安學者要拿研究經費。
而我們現在知道:社會韌性預算中,本應有更大比例花在防範大流行疾病上。它高居英國風險登記表首位,但恐怖主義在政治上更性感。把優先順序排得比較理性的國家,得到了好得多的結果。
為什麼這本書滿是案例史#
安全工程師必須能把風險與威脅放進脈絡、對可能出錯之處做出實際評估,並給客戶好建議。這取決於廣泛理解「各種系統歷來出過什麼錯、哪類攻擊奏效、後果為何、又是如何被止住的(如果值得止住的話)」。
歷史還有另一層重要性:歷史導致複雜性,而複雜性導致大量失敗。 懂得現代資訊安全的歷史,才能理解它的複雜性,並在其中航行得更好。
範例一:一家銀行#
銀行運作著大量攸關安全的電腦系統:
- 核心記帳系統——保存客戶帳戶主檔與記錄進出交易的多本日記帳。這裡的主要威脅是銀行自己的員工:每年約有百分之一的分行員工被解僱,多半因為小額不誠實(平均竊取金額只有幾千美元)。傳統防禦來自演化數百年的簿記程序:每一筆借方必須有對應的貸方,因此錢只能在銀行內移動,不能被創造或銷毀;大額轉帳通常需要兩個人授權;另有偵測異常交易量或模式的警報;員工被要求定期休假且期間不得存取銀行系統。
- 自動櫃員機(ATM)——用卡片加個人識別碼(PIN)認證交易、同時防範內外攻擊,比看起來難得多。各國都爆發過多次「幽靈提款」,因為地方歹徒(或銀行員工)找到並利用了系統漏洞。ATM 也是密碼學第一個大規模商業應用,促成了多項密碼標準;其機制後來擴展到商店的銷售點終端(卡片支付已大致取代現金),並被改用於預付式公用事業電表等應用。
- 網站與手機 app——多數客戶現在在線上而非分行處理日常業務。2005 年起,銀行網站遭受釣魚(phishing)重擊:客戶被引誘到假網站輸入密碼。1990 年代設計的標準安全機制,在罪犯改為攻擊客戶而非銀行之後就失效了,於是許多銀行改用簡訊傳送認證碼——而歹徒的反制是跑去手機行冒充你,買一支接管你門號的新手機。這場軍備競賽混合了認證、可用性、心理學、營運與經濟學。
- 高價值訊息系統——用來在銀行間移動大筆金錢、交易證券、開立信用狀與保證函。攻擊這種系統是高科技罪犯的夢想;據聞北韓政府已靠攻擊銀行竊得數千萬美元。防禦是簿記控制、存取控制與密碼學的混合。
- 分行本身——巨大、堅實、繁榮的外觀讓客戶安心,但那道石造門面是劇場而非現實。你帶槍走進去,行員會把看得到的現金都給你;夜裡破門而入,用砂輪機幾分鐘就能切開保險庫。真正有效的控制在警報系統:連到保全公司的控制中心,由人員透過影像查看並在必要時報警。密碼學用來防止竊賊操弄通訊、讓警報在出事時仍顯示「一切正常」。
直到 2000 年代初,銀行都是許多電腦安全產品最主要的民間市場,因此對安全標準有巨大影響力。
範例二:一座軍事基地#
軍事系統是二十世紀另一個技術驅動者——1980 年代起政府資助的電腦安全學術研究,大多由它推動。同樣不是一個應用,而是很多個:
- 軍事通訊推動了密碼學的發展,可回溯到古埃及與美索不達米亞。但光把訊息加密往往不夠:看到用他人金鑰加密之流量的敵人,可以直接定位並攻擊發射器。低攔截機率(low-probability-of-intercept, LPI)無線鏈路是解法之一,其技巧如今已被藍牙等日常通訊採用。
- 電子戰系統:從 1940 年代起,各國政府投入大量金錢。「干擾敵方雷達、同時避免自己被干擾」的軍備競賽,發展出許多精巧的欺敵伎倆、反制與反反制——其深度、微妙與策略廣度至今在別處都找不到。早在勒索者盯上銀行、博彩與遊戲網站之前,偽冒(spoofing)與阻斷服務攻擊在這裡就是日常。
- 機密資訊的保管:情報來源與未來作戰計畫通常標為「最高機密(Top Secret)」並在獨立系統上處理,還可能進一步限制在**區隔(compartment)**中,讓最敏感的資訊只有少數人知道。多年來人們嘗試強制執行資訊流規則——可以把檔案從「機密」的補給系統複製到「最高機密」的指揮系統,反之不行。管理多個具資訊流限制的系統是難題,而投入自動化軍事安全的數十億美元,協助發展出你今天手機與筆電裡的存取控制技術。
- 核武保護催生了大量精采的安全技術:從可證明安全的認證系統、光纖警報感測器,到用生物特徵辨識人的方法——包括如今用來識別全體印度公民的虹膜紋路。
軍方直到不久前,還是少數需要「軟體維護數十年」的客戶之一。現在軟體與網路連線正進入汽車這類攸關安全的消費品,軟體可持續性成了廣泛得多的問題。
2019 年歐盟立法要求:銷售含數位元件的商品,就必須維護那些元件兩年,或在客戶有合理期待時更久——這對汽車與白色家電意味著十年。如果你為一台會販售七年的汽車或冰箱寫軟體,你將必須維護它將近二十年。你該用什麼工具?
範例三:一間醫院#
醫院有若干有趣的保護需求,多半和病人安全與隱私有關:
安全性可用性(safety usability):醫療設備的可用性遠非已解決的問題。可用性造成的安全失效,估計奪走的性命與交通事故相當——例如美國一年數萬人、英國一年數千人。單一最大問題出在輸液幫浦:一家典型醫院可能有六種廠牌,控制介面各不相同,使致命錯誤更容易發生。
安全性可用性與資安互相作用:既不安全又被發現可被入侵的裝置,被主管機關下令召回的機率高得多——因為監理者知道,一旦敵意行動成為可能,大眾對風險的胃口就會降低。所以當越來越多醫療裝置不只取得軟體、還取得無線通訊能力,資安上的敏感反而可能帶來更好的安全性。
病歷系統不該讓所有員工看見每個病人的紀錄,否則隱私侵害可以預期。本書第二版之後,歐洲法院已裁定病人有權將其個人健康資訊限制在參與其照護的臨床人員範圍內。這意味著系統必須實作像「護理師可查看過去 90 天內曾在其科別受照護之任何病人的紀錄」這類規則——比看起來難。(美國 HIPAA 的合規標準較寬鬆,但仍是資安投資的驅動力。)
病歷匿名化供研究使用很難做好。單純加密病人姓名並不足夠:一個像「列出所有 1953 年出生、於 2003 年 10 月 19 日因心房顫動就診的男性」的查詢,就足以鎖定當天因心律不整緊急送醫的前首相布萊爾(Tony Blair)。判斷哪些資料能被有效匿名化很難,而且隨著社會與情境資料越來越多(更別提遠近親屬的基因資料),這還是個移動中的標靶。
新技術帶來理解不足的風險。醫院管理者懂得為停電準備備援程序——即使市電與自來水中斷,醫院也應能處理傷患。
2017 年 5 月,英國數家醫院的機器感染 WannaCry 惡意程式後關閉網路以限制擴散,接著發現急診室也開不下去了——因為 X 光片不再裝在信封裡從 X 光機送到手術房,而是經由遠方城鎮的一台伺服器傳送。於是網路故障能讓醫師無法動刀,而停電不會。他們有備用發電機,卻沒有備用網路。
雲端服務可以讓平均可靠度更高,但失效會更大、更複雜,而且彼此相關。新冠疫情浮現的另一個議題是配件控制(accessory control):有些醫療裝置會認證自己的備用零件,就像印表機認證墨水匣。廠商宣稱這是為了安全,實際上是為了把備品賣貴一點——但它引入了脆弱性:供應鏈一中斷,東西就難修得多。
醫療系統安全比銀行 IT 或軍用系統都年輕,但由於在所有已開發國家中,醫療佔 GNP 的比例都高於這兩者,其重要性正在成長。在有強制通報制度的國家,它也一貫是隱私外洩的最大來源。
範例四:一個家庭#
你可能不覺得一般家庭在運作什麼安全系統。停下來想想:
你已經在用前面描述過的系統:用網路銀行繳費、線上向診所領重複處方;若你是糖尿病患者,胰島素幫浦可能與床邊的基座通訊;家用防盜警報器可能每隔幾分鐘就送出加密的「一切正常」訊號給保全公司,而不是出事時吵醒整個社區。
汽車電子防盜器(immobilizer)。2015 年前的車款:你按鑰匙上的按鈕,送出加密的解鎖指令。較新的車款:不必按任何鈕,鑰匙在口袋裡就行,車子送出加密的挑戰、等待正確回應。
取消按鈕這件事帶來的後果是:如果你把鑰匙放在大門附近,竊賊可以用**無線中繼(radio relay)**偷走你的車。這項技術導入後,汽車失竊率暴增。
手機用與車門鎖、防盜器類似的密碼式挑戰-回應協定向網路認證自己,但警方可以用偽基地台竊聽(歐洲稱 IMSI-catcher,美國稱 Stingray)。而且許多電信商對「聲稱手機被偷的人」發售新 SIM 卡的態度相當寬鬆,於是歹徒可能竊取你的門號、進而洗劫你的銀行帳戶。
預付式電表。超過 100 個國家的家庭可取得電力與瓦斯的預付表,用從 ATM 或線上服務購買的 20 位數代碼加值。它甚至能離網運作:在肯亞的村莊,付不起 200 美元買太陽能板的人,可以每週 2 美元取得一片,再用手機買代碼解鎖它產生的電力。
家作為實體安全與隱蔽的庇護所——這件事正在多方面改變。竊賊擔心的不是鎖,而是屋內有人,所以警報與監控系統有幫助;但監控也正變得無所不在:許多家庭買了 Alexa、Google Home 這類會聽人說話的系統。隨著語音與手勢介面普及,各種小裝置都有了麥克風與攝影機,而語音處理通常在雲端進行以節省電力。
2015 年,歐巴馬的科技顧問委員會就預測:不久之後,地球上每個有人居住的空間都會有麥克風,且連向少數幾家雲端服務供應商。(美國與歐洲對隱私法該如何處理這件事,看法相當不同。)
不論如何,你家的安全,可能會變成取決於你幾乎無法控制的遠端系統。
未來幾年這類系統的數量會快速增加,而依過往經驗,其中許多會設計得很糟。例如 2019 年歐洲禁售一款兒童手錶:它以未加密的方式與廠商雲端服務通訊,竊聽者可以下載任何孩童的位置歷史、並讓其手錶撥打世界上任何號碼。發現後,歐盟下令立即召回所有手錶。
要設計出安全的系統,工程師必須知道有哪些系統、它們如何運作,以及至少同等重要的——它們過去如何失敗。
土木工程師從那一座塌掉的橋學到的,遠多於從一百座沒塌的橋;安全工程完全一樣。
定義:把詞彙釘清楚#
安全工程的許多術語很直白,但有些會誤導、甚至有爭議。
什麼是「系統」#
實務上這個詞可以指:
- 一個產品或元件(密碼協定、智慧卡、手機/筆電/伺服器的硬體);
- 上述加上作業系統、通訊與其他基礎設施;
- 上述加上一或多個應用(銀行 app、健康 app、媒體播放器、瀏覽器、會計/薪資套裝軟體,含用戶端與雲端元件);
- 上述任一或全部,加上 IT 人員;
- 再加上內部使用者與管理層;
- 再加上客戶與其他外部使用者。
我們會遇到許多系統,因為硬體安全就被宣傳甚至認證為安全,卻在跑某個特定應用、或被以設計者未預期的方式使用時嚴重崩潰。忽略人的成分、從而輕忽可用性議題,是資安失敗最大的成因之一。 本書一般採用第 6 種定義。
主體、人、主體者(principal)#
安全與密碼學文獻的慣例是用依序的字首字母(且性別交替)為協定中的參與者命名,於是有大量「Alice 向 Bob 認證自己」這樣的敘述。這讓文字好讀,卻犧牲了精確度:
- 我們是指 Alice 證明她的名字真的是 Alice,還是證明她握有某個憑證?
- 認證是由「人」Alice 做的,還是由代表她的智慧卡或軟體代理做的?
- 若是後者,我們確定那是 Alice,而不是被她借走卡片的 Carol、偷走她手機的 David、或入侵她筆電的 Eve?
書中的用法如下:
- 主體者/當事人(subject):處於任何角色的實體人,包括操作者、principal 或受害者。
- 人(person):實體人,或公司、政府這類法人。
- principal:參與安全系統的實體。可以是 subject、person、角色,或筆電、手機、智慧卡、讀卡機這類設備;也可以是通訊通道(依情境可能是通訊埠號或一把金鑰);還可以是其他 principal 的複合——群組(Alice 或 Bob)、連言(Alice 與 Bob 共同行動)、複合角色(Alice 以 Bob 的主管身分行動)、委任(Bob 在 Alice 不在時代理她)。
同一個 principal 也可能在多個抽象層次上被考慮:「Bob 在 Alice 不在時代理她」可能意味「代表 Bob 的智慧卡在代理 Alice」,甚至「Bob 在 Alice 不在時操作她的智慧卡」。
身分(identity) 的意義有爭議。需要嚴謹時,本書用它表示「兩個 principal 名稱之間的對應關係,表示它們指涉同一個人或設備」。例如,我們可能需要知道「Alice 以 Bob 的主管身分行動」中的 Bob,與「Bob 以 Charlie 的主管身分行動」以及「Bob 以分行經理身分與 David 共同簽署銀行匯票」中的 Bob 是同一人。identity 常被濫用為單純的「名字」,而「使用者身分」「公民身分證」這類用語更是把這種濫用固化了。
信任 vs. 可信賴#
本書採用 NSA 的定義:
- **被信任的(trusted)**系統或元件:其失效能夠打破安全政策。
- **可信賴的(trustworthy)**系統或元件:不會失效。
一個例子點出差別:若有 NSA 員工被目擊在巴爾的摩華盛頓國際機場的廁所隔間裡把金鑰材料賣給中國外交官(假設這不是被授權的行動),我們可以說他「被信任但不可信賴」。
信任還有很多別的定義。企業界的「被信任的系統」可能是「在我任內被駭也不會害我丟工作的系統」,甚至是「我們保得了險的系統」。但本書若要指「被核准的系統」「可保險的系統」「已投保的系統」,會直接這樣說。
秘密性、保密義務、隱私#
這三個詞重疊但不相同。若鄰居把共用圍籬邊的常春藤剪掉,害他的孩子能看進我的院子逗我的狗,被侵犯的不是我的 confidentiality;而對前雇主事務保持緘默的義務,是保密義務而非隱私。
- 秘密性(secrecy):工程術語,指用來限制能存取資訊之 principal 數量的機制所產生的效果,例如密碼學或電腦存取控制。
- 保密義務(confidentiality):在你知悉他人或組織的秘密時,保護它的義務。
- 隱私(privacy):保護你個人資訊的能力/權利,並延伸到防止他人侵入你個人空間的能力/權利(確切定義各國不同)。隱私可延伸到家庭,但不適用於公司這類法人。
例如:醫院病人有隱私權,而為維護此權利,醫師、護理師與其他員工對病人負有保密義務。醫院對其商業往來沒有隱私權,但知悉這些往來的員工可能負有保密義務(除非他們援引吹哨權以揭露不法)。
一句話記住:隱私是為個人利益的秘密性,保密義務是為組織利益的秘密性。
還有一層複雜:往往光保護資料(訊息內容)不夠,還必須保護中繼資料(metadata),例如「誰跟誰講過話」的紀錄。許多國家有法律規定性病治療須保密,但若徵信社能觀察到你正與某性病診所交換加密訊息,他就能推論你在那裡就診。英國一個關鍵隱私案件正是建立在這種事實上:一名模特兒控告刊登她離開「戒毒匿名會」聚會照片的小報並勝訴。
所以匿名性(anonymity)在隱私(或保密)中可能與秘密性一樣重要。但匿名很難:你很難獨自匿名,通常需要一群人可以躲。而且我們的法典並非為支持匿名而設計——警方要向電信公司取得「誰打給誰」的通聯明細,遠比取得實際監聽容易(而且往往更有用)。
真實性與完整性#
在安全協定的學術文獻中,真實性(authenticity)= 完整性 + 新鮮性(freshness):你確立了自己正在與一個真正的 principal 對話,而不是舊訊息的重放。銀行協定裡有類似概念:若當地銀行法規定支票六個月後失效,一張七個月未兌現的支票具有完整性(假設未被竄改)但已無效。
也有奇怪的邊界案例:刑案現場人員會把一張偽造支票放進證物袋來保存它的完整性——在新脈絡下,完整性的意義已從「簽名」擴大到「包含指紋在內的一切」。
什麼是「hack」#
本書沿用施奈爾的定義:hack 是系統規則所允許、但為設計者所未預期且不樂見的事。
稅務律師研讀稅法找出漏洞、發展成避稅策略;黑帽研讀程式碼找出漏洞、發展成 exploit——兩者完全同構。Hack 的對象不只是稅制與電腦系統,也包括市場經濟、我們選舉領袖的制度,甚至我們的認知系統。
它還可以發生在多個層次:律師可以 hack 稅法,或往上一層 hack 立法機關、甚至媒體。同樣地,你可以在數學上找加密演算法的弱點來 hack 一個密碼系統,或往下一層量測實作裝置的耗電量以推算金鑰,或往上一層騙裝置的保管人在不該用的時候使用它。
在更廣的脈絡中,hacking 有時是重要創新的來源。若一個 hack 流行起來,規則可能被改掉以阻止它——但它也可能被常態化(例子從圖書館、冗長辯論(filibuster)到搜尋引擎與社群媒體)。
漏洞、失效、政策、標的#
- 漏洞(vulnerability):系統或其環境的一種性質,在配合內部或外部威脅時,可導致安全失效(security failure),也就是違反系統安全政策。
- 安全政策(security policy):對系統保護策略的簡潔陳述。例如:「每筆交易中借貸總額相等,且所有超過 100 萬美元的交易必須由兩位經理授權」。
- 安全標的(security target):更詳細的規格,載明安全政策將如何在特定產品中被實作——加密與數位簽章機制、存取控制、稽核日誌等——並作為評估工程師是否做好本分的量尺。
- 保護剖繪(protection profile):介於兩者之間,像安全標的,但寫得足夠與裝置無關,以便在不同產品、或同一產品的不同版本之間做比較評估。
與 safety 世界的術語對照#
由於我們將在越來越多應用中必須同時做資安與安全性工程,把兩套術語並排記住很有用:
- 關鍵系統/元件(critical system/component):在給定危害(hazard)——一組內部條件或外部情境——時,其失效可能導致事故。
- 危險(danger):危害導致事故的機率。
- 風險(risk):事故的整體機率,即危害等級結合危險與潛伏期(危害暴露量與持續時間)。
- 不確定性(uncertainty):風險無法量化之處。
- 安全性(safety):免於事故。
- 安全政策(safety policy):簡潔陳述風險將如何被壓在可接受門檻之下(可以簡短如「別把炸藥和雷管放在同一輛卡車上」,也可以複雜如醫療與航空所用的政策)。再下一層,特定元件(飛機、飛機引擎,甚至引擎控制軟體)可能需要提出安全論證(safety case)。
小結#
「安全」是個嚴重超載的詞,對不同的人往往意味著彼此不相容的東西。對公司而言,它可能意味著監看所有員工的郵件與瀏覽紀錄;對員工而言,它可能意味著能在不被監看的情況下使用郵件與網路。
隨著時間推移,掌握系統設計權的人越來越常用安全機制,去取得對使用者的商業優勢。我們可以預期衝突、混淆與語言的欺騙性使用只會增加。
這讓人想起卡洛爾(Lewis Carroll)的一段文字:
「當我使用一個詞,」蛋頭先生用相當輕蔑的語氣說,「它的意思就是我選擇它要有的意思——不多也不少。」「問題是,」愛麗絲說,「你能不能讓詞語有這麼多不同的意思。」「問題是,」蛋頭先生說,「誰是主人——就這樣而已。」
安全工程師必須對詞語在不同應用中獲得的不同意涵保持敏感,並且有能力把安全政策與安全標的形式化。這有時對想矇混過關的客戶不方便;但一般而言,穩健的安全設計要求保護目標被明確說出來。