「聰明所帶來的後果,是不可能預見的。」——史特拉齊(Christopher Strachey)

「如果它可證明安全,它大概就不安全。」——克努森(Lars Knudsen)

協定是安全工程的核心主題#

密碼只是一個更一般概念的例子:安全協定(security protocol)。如果安全工程有一個核心主題,那大概就是安全協定的研究。

協定規定了主體(principals)建立信任關係所使用的步驟。它們是密碼學與存取控制交會之處;是我們用來把人類使用者連上遠端機器、同步安全脈絡、以及規範支付這類關鍵應用的工具。

一個典型的安全系統包含若干主體——人、公司、手機、電腦、讀卡機——它們透過各種通道通訊:光纖、wifi、行動網路、藍牙、紅外線,以及把資料承載在銀行卡與交通票券這類實體裝置上。安全協定就是治理這些通訊的規則,設計來讓系統在惡意行為(電話上說謊、敵對政府干擾無線電、偽造者竄改車票資料)之下仍能存活。

防範所有可能的攻擊往往太貴,所以協定設計會對威脅做出假設。例如當我們要使用者把密碼輸入機器時,我們隱含假設她能把它輸入正確的機器。在職場硬體連線終端機的舊時代,這假設是合理的;如今人們透過網際網路登入網站,它就遠沒那麼理所當然了。

所以評估一個協定涉及兩個問題:第一,威脅模型現實嗎?第二,協定應付得了它嗎?

協定可以非常簡單(例如刷識別證進大樓),常涉及互動,而且不一定是技術性的

我們在餐廳點一瓶好酒時,標準協定是:侍酒師遞上酒單(讓我們看到價格但客人看不到);他拿來酒瓶,讓我們檢查標籤、封條與溫度;他當場開瓶讓我們試飲;然後才倒酒。

這套流程演化出了一些隱私(客人不知道價格)、一些完整性(我們確定拿到對的酒、而且沒被廉價劣酒灌回去),以及不可否認性(我們事後不能抱怨酒壞了)。

這類傳統協定往往歷經數十年甚至數百年演化,同時滿足社會期待與技術威脅。

在技術端,協定複雜得多,而且不一定越變越好

  • 汽車業從金屬鑰匙轉向按鈕式電子鑰匙後,竊盜下降,因為新鑰匙較難複製。但轉向無鑰匙進入後,汽車犯罪又上升——壞人想出如何打造中繼裝置,讓鑰匙看起來比實際更靠近車子。
  • 從磁條卡轉向晶片卡也很棘手。歐洲在 2000 年代末完成,美國到 2010 年代末才跟上。歐洲發卡的詐欺數字在轉換後數年反而上升:歐洲卡片的複製品被拿到美國的磁條提款機使用,因為兩套系統的保護機制不太咬合。而且還有一個協定失敗,讓小偷即使不知道 PIN 也能在商店使用被竊的晶片卡——銀行花了數年才修好。

密碼被竊聽的風險#

遙控鑰匙進入(remote key entry)是很好的起點。早期系統(開車庫門的遙控器、1990 年代中期以前製造的汽車)只是廣播一組序號

殺死它們的攻擊是「抓取器(grabber)」——一種能錄下代碼稍後重播的裝置。第一批抓取器約在 1995 年上市;竊賊在停車場或目標住家外埋伏,錄下鎖車訊號,等車主離開後再重播。

反制與再反制的軌跡:

反制為何失敗
鎖與解鎖用不同代碼竊賊可以在你家外埋伏,錄下你早上開車前的解鎖碼,晚上再回來
16 位元密碼太短。偶爾有人會誤開別人的車,甚至替一輛車主不知道自己有警報器的車設定警報。1990 年代中期出現能逐一試遍所有代碼的裝置——平均約 2^15 次找到,每秒十次不到一小時。在有一百輛車在範圍內的停車場作業,不到一分鐘就會有一輛車閃燈迎接你
把密碼從 16 位元加倍到 32 位元(「超過 40 億組代碼」)這只顯示廠商沒真正理解問題:每輛車仍然只有一兩組代碼,抓取器照樣有效

對汽車而言,這可能意味著所有經銷商員工,或許還有州監理機關。有些防盜警報器也用序號當主控密碼,而這裡更糟:銀行買防盜警報器時,序號可能出現在訂單、送貨單與發票上。而銀行不喜歡派人拿現金去買東西。

簡單密碼有時是恰當的技術。作者當地游泳池的月票就只有一個條碼;他確信自己能做出過得去的偽造品,但既然閘門管理員認得「常客」,就沒必要用更貴的東西。

但對線上的東西,靜態密碼很危險——Mirai 殭屍網路正是靠招募帶有無法更改之密碼的 wifi 監視攝影機起家的。而對人們想偷的東西(如汽車),我們也需要更好的東西。

誰在那裡?——簡單認證#

一個簡單的現代認證裝置,是某些多層停車場發給訂戶用來升起柵欄的代幣。它只有一個按鈕;按下時,它先傳送自己的序號,然後送出一個認證區塊——同一序號後接一個隨機數,全部用該裝置專屬的金鑰加密。

{X}K 表示訊息 X 用金鑰 K 加密,代幣 T 與車庫 G 之間的協定可寫成:

T → G :  T, {T, N}KT

這是標準的協定表示法,讓我們慢慢看:

  • 代幣 T 送一則訊息給車庫 G,內容是它的名字 T,後接 T 與 N 串接後的加密值。
  • N 代表 nonce(number used once,「只用一次的數」)。
  • 大括號內的一切都被加密,而加密把 T 與 N 綁在一起,同時遮蔽它們的值。
  • nonce 的目的是向接收者保證訊息是新鮮的(fresh),也就是它不是舊訊息的重播。

驗證很簡單:車庫讀出 T,取得對應的金鑰 KT,解密訊息其餘部分,檢查 nonce N 未曾出現過,最後檢查明文中含有 T。

許多人搞混的原因有二:

  1. 冒號左邊的 T 標示的是一個主體(代表訂戶的代幣),而右邊的 T 指的是代幣的名稱(也就是唯一裝置編號)。
  2. 一旦我們開始討論對協定的攻擊,可能會發現原本要給某主體的訊息被別人攔截並重播。所以你可以把冒號左邊的 T → G 想成「協定設計者心裡想的是什麼」的提示。

nonce 可以是任何能保證訊息新鮮性的東西:隨機數、計數器、從第三方收到的隨機挑戰,甚至是時戳。它們之間有微妙差異,例如對各類重播攻擊的抵抗程度、以及增加系統成本與複雜度的方式。

在極低成本的系統中,隨機數與計數器佔優勢,因為只做單向通訊比較便宜,而廉價裝置通常沒有時鐘。

金鑰分化#

這類裝置的金鑰管理可以非常簡單。在典型的車庫代幣產品中,每個代幣的金鑰就是它的唯一裝置編號、用車庫知道的全域主金鑰 KM 加密:

KT = {T}KM

這稱為**金鑰分化(key diversification)**或金鑰衍生(key derivation),是實作存取代幣的常見方式,智慧卡也廣泛使用。

要完全攻破系統、取出能讓他冒充任何使用者的主金鑰,攻擊者必須攻陷車庫的中央伺服器(該伺服器可能把這把金鑰保護在防篡改智慧卡或硬體安全模組中)。

但仍有出錯空間。常見的失敗模式是序號(不論是唯一裝置編號還是協定計數器)不夠長,於是偶爾有人發現自己的遙控器也能開停車場裡的另一輛車。

協定漏洞往往比密碼弱點更致命#

一個來自預付式公用事業電表的例子:英國超過一百萬戶、開發中國家超過四億戶有接受加密代幣的電表或瓦斯表——住戶買一個魔術數字輸入電表,電表就發放購買的能源量。

南非廣泛使用的一款早期電表只檢查 nonce 與上一個不同。於是客戶可以買兩張低面額電力票,然後一張接一張反覆輸入,無限地替電表充值:給定兩個有效代碼 A 與 B,序列 ABABAB… 全部被視為有效。

隨機數還是計數器?#

這個問題沒有看起來那麼容易。

若用隨機數,鎖必須記住大量過去的代碼。

  • 代客攻擊(valet attack):擁有短暫接觸權的人(如代客泊車員)錄下一些存取碼,稍後重播來偷你的車。
  • 有人可能租一輛車、錄下足夠的解鎖碼,稍後再回租車場把它偷走。
  • 提供足夠的非揮發性記憶體來記住數千個舊代碼,可能讓你的鎖貴上幾美分。

若用計數器,問題是同步。金鑰可能被用於多把鎖,也可能被意外反覆啟動(作者曾把一個實驗用代幣帶回家,被自家的狗啃了)。所以你需要在計數器被遞增數百甚至數千次之後仍能復原的方法。

一款常見產品使用 16 位元計數器,當解密出的計數器值是「上一個有效代碼加不超過 16」時允許存取。為了應付代幣在別處被用了超過 16 次(或被寵物啃過)的情況,只要計數器值自上次有效代碼以來被遞增了 17 到 32,767 次,鎖就會在第二次按壓時開啟(計數器會繞回,所以 0 是 65,535 的後繼)。

這在許多應用中沒問題,但能取得六個精心挑選之存取碼的小偷——比方說值為 0、1、20,000、20,001、40,000、40,001——就能完全攻破系統。

你的應用裡,你會擔心這件事嗎?

設計一個簡單的代幣認證機制都沒有看起來那麼容易,而如果你假設自己的產品只會吸引低階對手,這個假設可能隨時間失效

附帶一提:安全不總是好事#

配件控制就是例子。許多印表機公司在印表機中嵌入認證機制,確保使用原廠碳粉匣;若裝入競爭者產品,印表機可能悄悄從 1200 dpi 降到 300 dpi,或乾脆拒絕工作。從科學儀器到遊戲主機,各行各業都在參一腳。

這些密碼機制 1990 年代起步時相當粗淺,因為廠商認為任何工業規模繞過它們的競爭者都可以依著作權法被告甚至坐牢。但後來一位法官認定:廠商有權僱用能找到的最強密碼學家把客戶鎖住,而競爭者也有權僱用能找到的最強密碼分析家把他們解放出來、去別處買配件。

其效果可能違背公共政策。一個例子是手機鎖網,導致每年數億支手機進入垃圾掩埋場,連同有毒重金屬與已內含的碳成本。

挑戰與回應#

自 1995 年起,所有在歐洲銷售的汽車都必須有「密碼賦能的防盜器」;到 2010 年,多數車也有遙控解鎖(不過多數仍保留金屬備用鑰匙,好讓你在鑰匙圈電池沒電時仍進得去)。

引擎防盜器(immobiliser)較難用物理手段繞過,並用兩趟挑戰-回應協定授權引擎啟動:

E → T :  N
T → E :  T, {T, N}K

其中 E 是引擎控制器、T 是車鑰匙裡的應答器、K 是兩者共享的密碼金鑰、N 是隨機挑戰。

應答器通常是一顆由入射無線電訊號供電的獨立 RFID 晶片,所以即使電池沒電也持續運作。頻率很低(125 kHz),讓車子能直接為應答器供電,這個交換對嘈雜的射頻環境也相對免疫。

這在理論上很健全。但安全機制的實作往往在最初兩三次嘗試時就失敗。

五個防盜器晶片的淪陷史

1. TI 的 DST 應答器晶片(至少兩家大車廠使用,也是 SpeedPass 收費系統的基礎):Bono 等人 2005 年發現它使用 40 位元金鑰的區塊密碼,只要兩個回應就能暴力算出。這是美國密碼出口管制的副作用之一。

2. DST80(2010 年起被福特、豐田、現代採用):2020 年被 Wouters 等人攻破。除了對晶片的旁通道攻擊,還有嚴重的金鑰管理實作問題——現代的金鑰只有 24 位元的熵,而豐田的金鑰是從攻擊者可讀取的裝置序號衍生的。(特斯拉同樣脆弱,但不像那些老公司,它能用軟體升級修好。)

3. Keeloq(車庫門遙控器與部分車廠使用):2007 年 Eli Biham 等人發現,只要接觸代幣一小時就能收集到足夠資料回復金鑰。更糟的是,某些車型還有協定臭蟲:金鑰分化用的是互斥或(KT = T ⊕ KM)。所以你可以租一輛你想偷的車型,然後算出該車型任何其他車的金鑰。

4. Philips Hitag 2(2007 年被公開):同樣有 48 位元秘密金鑰,但密碼也很弱。隨著各方密碼分析家的攻擊,取出金鑰所需時間從數天降到數小時再降到數分鐘。到 2016 年,攻擊只需 8 次認證嘗試與筆電上一分鐘的計算,對所有法國與義大利車廠、以及日產、三菱、雪佛蘭的車都有效。

5. Megamos Crypto(福斯等使用):2008 年起市面上出現含 Megamos 密碼的汽車鎖匠工具,被伯明罕與奈梅亨的研究者逆向工程破解。它雖有 96 位元秘密金鑰,有效金鑰長度只有 49 位元,與 Hitag 2 差不多。

福斯在倫敦高等法院取得禁制令,阻止他們在 Usenix 2013 發表成果,主張商業機密被侵犯。研究者抗辯,主張是那家鎖匠工具供應商洩漏了秘密。兩年爭訟後,本案在雙方均不承認責任的情況下和解。

更仔細的研究隨後拋出更多問題:還有一個協定攻擊——對手可以一個接一個改寫 96 位元金鑰中的每個 16 位元字,一次搜尋 16 位元,把攻擊所需時間從數天降到數分鐘。

金鑰管理全面性地糟糕:福斯的多個實作沒有跨車輛與應答器分化金鑰,而是對一次數百萬輛車使用一把固定的全域主金鑰。2009 年前用 AUT64 密碼產生裝置金鑰,之後改用較強的 XTEA——但仍繼續使用全域主金鑰,這些金鑰在福斯-奧迪集團 2016 年前的 23 個車款中被找到。

如果鎖匠公司已經想出怎麼複製它,你家附近的修車廠會用幾塊錢賣你一把。作者妻子 2005 年的 Lexus 有前任車主買的備用鑰匙。但當他們弄丟 2012 年賓士的一把鑰匙時,必須跑到原廠經銷商、付超過 200 英鎊、出示護照與行車執照、讓技師拍下底盤上的車輛識別號碼、把一切寄給賓士,然後等一個星期。

第 3 章談過密碼系統設計最難的部分,是如何在復原機制本身不變成漏洞或麻煩的前提下從淪陷中復原。這裡完全一樣!

最糟的還在後頭:被動無鑰匙進入#

挑戰-回應看起來太好了,於是車廠開始只在儀表板上放一個啟動按鈕、不用金屬鑰匙。然後他們提高無線電頻率以延長距離,讓它不只在駕駛已坐進車內時做短距離認證,還當作無鑰匙進入機制。

行銷說詞是:只要你把鑰匙放在口袋或手提包裡就不用擔心;你走近車子它就解鎖、走遠就上鎖、碰到控制項就自動發動。有什麼不好?

竊賊帶一個中繼器悄悄靠近你家前門,另一個留在你車旁。如果你把鑰匙放在玄關桌上,車門就開了,他就開走了。即使車子被防盜器鎖住,他還是能偷走你的東西。

在多年的汽車竊盜下降之後,統計數字在 2017 年暴增:英國失竊車輛增加 56%,2018 年再增加 9%。

(公允地說,這不全然是中繼攻擊所致:高價值失竊案中約有一半似乎涉及把偷車工具組接到手套箱下的車載診斷埠。而車內 CAN 匯流排使用的認證協定,在許多方面同樣脆弱;更新這些協定將耗時多年,因為業界投資龐大。)

但它後來反噬了,因為政客先進來搞、然後是行銷人員。 政客說如果允許人們使用他們破解不了的密碼學,即使是用來防止偷車,也會對執法造成災難。接著防盜器廠商的行銷人員想要專有演算法以鎖住車廠,而車廠自己的行銷人員想要被動無鑰匙進入,因為那看起來很酷。

我們能做什麼?

  • 至少有兩家車廠在鑰匙圈裡放了加速度計,鑰匙不動時就不作用。(作者一位朋友抱著孩子進屋時把鑰匙留在座椅上,結果被鎖在外面。)
  • 當地警方建議使用老式的金屬方向盤鎖;作者的住戶協會建議把鑰匙放在餅乾盒裡。
  • 作者自己買了這種車,但發現無鑰匙進入實在太不穩定——他妻子曾在超市停車場因為它完全失效而被困住。於是他們把車退回,換了一輛有正經按鈕式遙控鎖的二手車。

現在 NXP、Atmel 與 TI 都有使用 AES 的晶片,其中 Atmel 是開源、協定堆疊也開放的

光靠密碼學無法修好中繼攻擊。正確的修法是一種新的無線電協定,基於具內建測距能力的超寬頻(UWB)——它能在 150 公尺範圍內以 10 公分的精度量測鑰匙圈到車子的距離。新的 802.15.4z 增強脈衝無線電第一顆晶片在 2019 年問世,2020 年起隨車出貨。這類晶片有潛力同時取代藍牙與 NFC 協定,但它們未必彼此相容:有一個設計開放的低速脈衝(LRP)模式,以及一個部分專有的高速脈衝(HRP)變體。如果要作者給汽車新創建議,他會從 LRP 出發。

鎖不是挑戰-回應協定的唯一應用。在 **HTTP 摘要認證(Digest Authentication)**中,網頁伺服器對共享密碼的客戶端或代理送出 nonce 作為挑戰;回應是 nonce、密碼與所請求 URI 的雜湊。這提供了一種不受密碼窺探影響的機制,例如被用來認證 VoIP 電話協定 SIP 的客戶端與伺服器。

它比明文傳送密碼好得多,但和無鑰匙進入一樣受中間人攻擊之苦(受益者似乎主要是情報機關)。

雙因子認證#

挑戰-回應最顯眼的用途大概是雙因子認證。許多組織發給員工密碼產生器以登入企業電腦系統,許多銀行也發類似裝置給客戶。

它們看起來像小計算機(有些真的能當計算機用),但主要功能如下:

  1. 你想登入時,畫面呈現一個大約七位數的隨機 nonce。
  2. 你把它連同大約四位數的 PIN 一起鍵入密碼產生器。
  3. 裝置用與企業安全伺服器共享的秘密金鑰加密這十一位數字,顯示結果的前七位。
  4. 你把這七位數當作密碼輸入。

形式化表示(S 為伺服器、P 為密碼產生器、U 為使用者、N 為 nonce):

S → U :  N
U → P :  N, PIN
P → U :  {N, PIN}K
U → S :  {N, PIN}K

(原書圖 4.1 以圖示呈現此流程。)

這些裝置從 1980 年代初出現,先在電信公司流行,1990 年代進入銀行供員工使用。也有沒有鍵盤的簡化版,只靠加密一個計數器或時鐘來產生新的存取碼。

而且它們有效:美國國防部 2007 年宣布,基於國防部通用門禁卡的認證系統在前一年把網路入侵減少了 46%

作者的一家銀行給他一台小計算機,每次登入產生新代碼,也允許他用收款人帳號的末四位取代挑戰來認證新的收款人;另一家銀行使用 CAP(Chip Authentication Program)——一台可以插入銀行卡來做密碼運算的計算機。

MIG 中間人攻擊#

挑戰-回應認證協定最早的使用,大概是軍事上的**敵我識別(IFF)**系統。

1930、40 年代戰機速度不斷提升,加上噴射引擎、雷達與火箭的發明,讓防空部隊越來越難分辨自己人與敵人的飛機。這帶來誤擊友軍的風險,並推動自動化系統的發展——二戰時首度部署,讓被雷達照射的飛機能廣播一個識別號碼以示友善意圖。1952 年這套系統被採用來向航管識別民航機;由於擔心廣泛使用後失去安全性,美國空軍啟動了把密碼保護納入系統的研究計畫。

現今典型的防空系統會隨雷達訊號送出隨機挑戰,友軍飛機以正確回應識別自己。

「MIG 中間人」的故事(以及對它的異議)

作者從一位南非空軍軍官那裡聽到以下故事。第一版出版後這個故事曾被質疑(見下),但類似的把戲自二戰以來確實在其他電子戰系統上上演過。

1980 年代末,南非部隊在納米比亞北部與安哥拉南部作戰。他們的目標是讓納米比亞維持白人統治,並在安哥拉扶植一個客戶政府(UNITA)。由於南非國防軍主要由來自少數白人人口的徵兵構成,限制傷亡很重要,所以多數南非士兵留在納米比亞執行警戒任務,而北方的戰鬥由 UNITA 部隊進行。南非空軍的角色有二:轟炸安哥拉境內目標以提供 UNITA 戰術支援;以及確保安哥拉人與其古巴盟友不會在納米比亞回敬同樣的事。

突然間,古巴人突破了南非的防空網,對納米比亞北部一處南非營地進行轟炸,炸死若干白人徵召兵。 空優已失的證明,幫助普利托利亞政府決定把納米比亞交給起義者——這本身是數年後南非邁向多數統治道路上的一大步。這次突襲也可能是蘇聯集團部隊最後一次成功的軍事行動。

古巴人是怎麼辦到的?

數架 MIG 在安哥拉南部、剛好在南非防空帶以北徘徊,直到一批南非空軍的 Impala 轟炸機空襲安哥拉境內某目標。然後 MIG 急轉,公然飛過南非防空網——後者發出 IFF 挑戰。

MIG 把挑戰中繼給安哥拉防空砲兵陣地,後者把它發射給一架南非轟炸機;回應被中繼回 MIG,MIG 再轉發出去,於是被放行通過。(原書圖 4.2 圖示此攻擊。)

據該線人說,這件事震撼了普利托利亞的參謀本部:不只在戰鬥上輸給黑人對手,還在智計上被超越,與他們此前抱持的世界觀不相容。

然而其他人告訴作者,「MIG 中間人」式的把戲在韓戰、越戰與多次中東衝突中相當重要。

無論如何,這個故事給了我們中間人攻擊的又一個例證。針對汽車的中繼攻擊是另一個。

它對密碼計算機也有效:釣魚網站邀請目標登入,同時對銀行開啟一個登入工作階段。銀行送出挑戰;釣魚者把它中繼給目標,目標用裝置回應;釣魚者把回應中繼給銀行,於是銀行把釣魚者當成目標接受了。

阻止中間人攻擊比看起來難,可能涉及多層防禦。銀行通常會檢查:已知的機器、密碼、第二因子(如 CAP 讀卡機的認證碼),以及對交易的風險評估。對高風險交易(例如新增收款人),作者的兩家銀行都要求他對收款人帳號計算認證碼——但為了可用性,它們只認證末四位數字

如果一筆付款要花兩分鐘、輸入數十個數字,很多客戶會打錯、放棄,然後不是打客服就是嫌煩改用別家銀行。

而且壞人可能能利用任何後備機制,例如騙客戶打到某個電話號碼,在客戶與客服中心之間跑中間人攻擊。

我們將在從網際網路安全協定到藍牙的各種應用中一再遇到這類攻擊。它甚至適用於遊戲。數學家 John Conway 曾說:要對通信西洋棋的大師至少下成和局很容易——同時跟兩位大師下,一邊執白一邊執黑,然後把棋步在兩人之間中繼就行了!

反射攻擊#

當兩個主體必須互相識別時,會出現更多有趣的問題。

假設一套設計來防止防空砲手誤擊友機的挑戰-回應 IFF 系統,也必須部署在戰鬥轟炸機上。再假設空軍只是把防空砲兵用的挑戰單元裝進每架飛機,接到射控雷達上。

那麼當一架戰鬥機挑戰敵方轟炸機時,轟炸機可以把挑戰反射回去給該戰鬥機的僚機,取得正確回應,然後把它當成自己的回應送回:

F  → B  :  N
B  → F' :  N
F' → B  :  {N}K
B  → F  :  {N}K

有幾種方式可以阻止這件事,例如在交換中納入雙方的名字。上例中,我們可以要求友方轟炸機對挑戰 F → B : N 以如下形式回應:

B → F :  {B, N}K

如此一來,來自僚機 F′ 的反射回應 {F', N}K 就能被偵測出來。

信任假設的微妙#

這說明了認證所依據之信任假設的微妙。如果你送出挑戰 N,並在 20 毫秒內收到回應 {N}K

  • 光在 20 毫秒內能走略少於 3,730 英里,所以你知道在 2,000 英里內有某個持有金鑰 K 的東西
  • 但你只知道這麼多。 如果你能確定該回應不是用你自己的設備計算的,你現在知道 2,000 英里內有別人持有金鑰 K。
  • 如果你進一步假設所有 K 的副本都安全地保存在可信賴地正確運作的設備中,而你看到 {B, N}K,那麼你或許有理由推論呼號 B 的飛機在 2,000 英里內

一個沒被預期到的問題:挑戰本身#

到這裡你或許認為我們已經理解 IFF 的所有協定設計面向。但我們遺漏了最重要的問題之一——早期 IFF 系統的設計者沒有預料到的那個

盟軍是吃了苦頭才學到這點:1944 年 1 月,Enigma 訊息的解密顯示德軍正藉由詢問英美轟炸機的 IFF,在兩倍於正常雷達距離處標定它們。

所以更現代的系統連挑戰本身也要認證。例如北約的 mode XII 有 32 位元的加密挑戰,而且每次詢問訊號都產生不同的有效挑戰(通常每秒 250 次)。理論上不再需要在敵方領土上空關機,但實務上能錄下有效挑戰的敵人可以把它們重播作為攻擊的一部分。mode XII 靠指向性與飛行時間讓中繼變得困難。

一個能防範某種攻擊(被自己人擊落)、卻增加對更可能之攻擊(被敵人擊落)之暴露的協定,可能幫不上忙。事實上,這個「虛假挑戰」問題在二戰時嚴重到有專家主張乾脆廢掉 IFF——與其冒著數百架轟炸機編隊中有一位飛行員無視命令、在敵方領土上空還開著 IFF 的風險。

操弄訊息#

前面看到的中間人攻擊,多是反射或偽冒用來認證參與者的資訊。但還有更複雜的攻擊:攻擊者不只冒充某人,還操弄訊息內容

  • 我們已見過只記得上一張票的預付電表:可以靠一張接一張複製兩張票的代碼(ABABAB…)無限充值。
  • 不誠實的計程車司機在連接計程表與變速箱感測器的纜線中插入脈衝產生器。感測器在傳動軸轉動時送出脈衝,讓計程表算出行駛距離;盜版裝置能插入額外脈衝,讓計程車看起來走得更遠。
  • 想開得比法規更快或更遠的卡車司機可以用類似裝置丟掉一些脈衝,讓自己看起來開得比較慢、或根本沒開。

除了監控系統,控制系統往往也需要對訊息操弄攻擊強化。

用於國際電話與資料流量的 Intelsat 衛星有防止指令被接受兩次的機制——否則攻擊者可以重播控制流量,反覆下令執行同一個機動動作,直到衛星燃料耗盡。

環境改變#

協定失敗的常見原因是環境改變了,使設計假設不再成立,而安全協定應付不了新的威脅。

案例:荷蘭與英國的加油站側錄疫情

1993 年荷蘭爆發「幽靈提款」疫情;媒體上爭議不斷,銀行宣稱系統安全,而許多人投書報紙宣稱被騙。

最後銀行注意到許多受害者都曾在烏特勒支附近某加油站使用銀行卡。 該站被監視,一名員工被捕。原來他在讀卡機與控制它的 PC 之間的線路上裝了竊聽器;竊聽器記錄卡片磁條資料,而他用眼睛記下 PIN

完全相同的詐欺在英國於 2000 年代中期轉向「晶片與 PIN」智慧卡之後再度發生:一個幫派竊聽了大概 200 個加油站,從線路上蒐集卡片資料、用監視攝影機觀察 PIN,然後製作數千張磁條複製卡,拿到 ATM 仍使用磁條技術的國家使用。在作者當地的加油站,超過 200 名客戶突然發現自己的卡片在泰國的 ATM 被使用。

為什麼系統設計得這麼糟,而且這個設計錯誤跨越一次重大技術轉換、持續了十多年?

1980 年代初 IBM、VISA 等組織制定磁條卡與 PIN 管理標準時,工程師做了兩個假設:

  1. 磁條的內容(卡號、版本號與到期日)不是秘密,而 PIN 才是。(當時用的類比是:磁條是你的名字,PIN 是你的密碼。)
  2. 銀行卡設備只會在可信環境中操作,例如實體堅固的提款機中,或由櫃員在櫃台操作。

所以「顯然」只需要加密 PIN 從 PIN 鍵盤到伺服器這一段;磁條資料可以從讀卡機明文送出。

但這兩個假設到 1993 年都已改變:

  • 1980 年代末(主要在遠東)的卡片偽造疫情,驅使銀行在磁條上引入認證碼。
  • 銀行卡產業的商業成功,讓許多國家的銀行把簽帳卡的使用從 ATM 擴展到各式商店的終端機。

這兩項環境變化的組合,摧毀了原始系統架構背後的假設。

原本是「把磁條上沒有安全資料的卡片放進可信的機器」,現在變成「把帶有明文安全資料的卡片放進不可信的機器」。

這些變化來得如此漸進、跨越如此長的時間,以致整個產業沒看到問題正在逼近。

選定協定攻擊#

熱衷推動身分證的政府,試圖讓它被用於許多其他交易;有些想要一張卡同時用於身分、銀行甚至交通票務。新加坡甚至實驗過一張兼作軍人身分證的銀行卡。

這引入了有趣的新風險:如果一位海軍艦長在一頓豐盛晚餐後想從 ATM 提點現金卻忘了 PIN,他是不是要等到週一早上銀行開門把卡還他,才能把船開出海?

有些公司在推可用於廣泛交易的多功能認證裝置,好省去你隨身攜帶數十張卡片與鑰匙。對未來更現實的看法或許是:人們的手機將被用於多數私部門的認證功能。

但這同樣沒有看起來那麼簡單。選定協定攻擊(Chosen Protocol Attack)的想法是:給定一個目標協定,你設計一個新協定去攻擊它——只要能誘使使用者重複使用同一個代幣或密碼金鑰。

「黑手黨中間人」攻擊:色情網站與金幣

那麼黑手黨會如何設計一個協定來攻擊銀行交易的認證?

過去人們造訪色情網站時常被要求「年齡證明」,通常涉及提供信用卡號(給網站本身或給年齡查核服務)。如果手機被用來認證一切,色情網站自然會要求客戶認證一個隨機挑戰作為年齡證明。

於是色情網站可以發動「黑手黨中間人」攻擊:

  1. 他們等到一位毫無戒心的客戶造訪其網站。
  2. 同時他們向一位金幣商訂購可轉售的商品(例如金幣),扮演金幣商客戶的角色。
  3. 金幣商送來待認證的交易資料時,他們透過色情網站把它中繼給等待中的客戶
  4. 那位可憐人按了 OK,黑手黨拿到金幣。
  5. 月底數千人突然抱怨卡片上的巨額扣款時,色情網站已經連同金幣一起消失了。

(原書圖 4.3 圖示此攻擊:客戶端顯示「圖片 143!用簽署 X 證明您的年齡」,而另一端是「購買 10 枚金幣/簽署 X」,中間是黑手黨色情網站,最右是銀行。)

1990 年代這類漏洞曾進入國際標準:數位簽章與認證的標準可以像這樣背靠背串起來。 此後已證明許多協定本身雖然安全,卻能在使用者被誘使於其他應用中重複使用同一把金鑰時被攻破。

這就是為什麼如果我們要用手機認證一切,把銀行 app 與色情 app 分開將非常重要——那是存取控制那一章的主題。

一般而言,在多個應用中使用同一把密碼金鑰(或其他認證機制)是危險的,而讓別人在你的機制之上啟動他們自己的應用安全,可能是徹底的愚蠢。

經典案例是銀行倚賴發簡訊給客戶當認證碼來做雙因子認證——壞人已學會用 SIM 交換詐欺攻擊那套系統。

金鑰管理#

我們討論過的安全協定例子,多半是關於認證某個主體的名字、或應用資料(例如驅動計程表的脈衝)。還有一類非常重要的認證協定:用來管理密碼金鑰的協定

復活小鴨#

在物聯網中,金鑰有時可以直接、實體地管理,靠本地設定與**首次使用即信任(trust-on-first-use, TOFU)**的政策。

  • 數位行車記錄器(tachograph):前面提過不誠實的計程車司機在變速箱感測器纜線上裝斷續器來灌里程;同樣的問題在行車記錄器(監控卡車司機工時與速度的裝置)上反向發生。1990 年代末行車記錄器數位化時,我們決定加密來自感測器的脈衝序列。但金鑰怎麼管理?解法是:每當一台新的行車記錄器在原廠重置後首次通電,它就信任第一把經由感測器纜線送來的金鑰。
  • Homeplug AV:家用電力線資料通訊的加密標準,廣泛用於區網延伸器。在預設的「就是能用(just-works)」模式下,新的 Homeplug 裝置信任它看到的第一把金鑰;如果你的新 wifi 延伸器跟鄰居的 wifi 配對了,你就按重置鈕再試一次。 也有「安全模式」——開瀏覽器連到網路管理節點、手動輸入印在裝置包裝上的密碼金鑰——但設計 Homeplug 協定時我們就意識到,多數人沒理由費那個事。

TOFU 也叫「復活小鴨(resurrecting duckling)」,出自作者與 Frank Stajano 在醫療裝置配對脈絡中的分析。

概念是:小鴨孵化時會對它看到的第一個會動會叫的東西產生銘印,即使那是農夫——農夫可能就此被一隻認定他是媽媽的鴨子跟著到處跑。如果這種錯誤銘印發生在電子裝置上,你需要一種方法殺掉它、再讓它復活成新生狀態——那正是區網延伸器上重置鈕的功能。

遠端金鑰管理#

更常見也更有趣的情況是遠端裝置的金鑰管理。基本技術從 1970 年代末發展出來以管理分散式電腦系統中的金鑰,提款機是早期應用。

金鑰分發協定的基本想法是:當兩個主體想通訊時,他們可以用一個可信第三方來引介彼此。 習慣上給它們人類的名字以免迷失在代數中,所以我們稱兩個通訊主體為 AliceBob,可信第三方為 Sam

Alice、Bob 與 Sam 很可能是跑在不同裝置上的程式。例如在讓車商為汽車配對備用鑰匙的協定中,Alice 可能是車、Bob 是鑰匙、Sam 是車廠。

一個簡單的認證協定可以這樣跑:

  1. Alice 先呼叫 Sam,要求一把與 Bob 通訊用的金鑰。
  2. Sam 回覆送給 Alice 一對憑證,各含一份金鑰副本:第一份加密成只有 Alice 能讀,第二份加密成只有 Bob 能讀。
  3. Alice 呼叫 Bob,出示第二份憑證作為自我介紹。兩人各自用與 Sam 共享的金鑰解開對應憑證,取得新金鑰。

由於重播攻擊是已知問題,為了讓 Bob 與 Alice 都能檢查憑證是新鮮的,Sam 可以在其中各放一個時戳

A → S :  A, B
S → A :  {A, B, KAB, T}KAS ,  {A, B, KAB, T}KBS
A → B :  {A, B, KAB, T}KBS ,  {M}KAB

Needham-Schroeder 協定#

許多事情可能出錯,這裡有一個著名的歷史例子。許多既有的金鑰分發協定衍生自 1978 年出現的 Needham-Schroeder 協定。它與上面的類似,但用 nonce 而非時戳:

訊息 1   A → S :  A, B, NA
訊息 2   S → A :  {NA, B, KAB, {KAB, A}KBS}KAS
訊息 3   A → B :  {KAB, A}KBS
訊息 4   B → A :  {NB}KAB
訊息 5   A → B :  {NB − 1}KAB

Alice 主動出擊,告訴 Sam:「我是 Alice,我想跟 Bob 說話,我的隨機 nonce 是 NA。」Sam 給她一把用他與她共享之金鑰加密的工作階段金鑰;該密文也含她的 nonce,讓她確認這不是重播。他也給她一份憑證好把這把金鑰帶給 Bob。她把它傳給 Bob,Bob 再做一次挑戰-回應以確認她在場且清醒。

在許多應用中這可能不重要,甚至有助於 Alice 快取金鑰以防伺服器故障。但如果某個對手(比方說 Charlie)曾拿到 Alice 的金鑰,他就能用它與許多其他主體建立工作階段金鑰。而如果 Alice 被開除了,那麼 Sam 最好有一份「所有曾拿到與她通訊之金鑰的人」的清單,以便通知他們不要再相信它。

換言之,撤銷是個問題:Sam 可能必須保存自己做過的一切的完整日誌,而除非主體名稱在未來某個固定時間到期,否則這些日誌會永遠成長下去。

將近四十年後,這個例子仍有爭議。

  • 簡化的看法是:Needham 與 Schroeder 就是搞錯了。
  • Pancho 與 Gollmann 主張的看法(作者頗有同感)是:這是假設變遷所引起的協定失敗。1978 年是個更和善溫柔的世界;當時電腦安全關心的是把「壞人」擋在外面,而今天我們預期「敵人」就在我們系統的使用者之中。Needham-Schroeder 論文假設所有主體都守規矩、所有攻擊都來自外部。在那些假設下,該協定仍然健全。

Kerberos#

Needham-Schroeder 協定最重要的實務衍生物是 Kerberos,一個源自 MIT 的分散式存取控制系統,現在是標準的網路認證工具之一,已成為 Windows 與 Linux 認證基本機制的一部分——尤其在機器透過區域網路共享資源時。

Kerberos 不是只有單一可信第三方,而是兩種

  • 認證伺服器(authentication servers):使用者向它登入。
  • 票證授予伺服器(ticket granting servers):給使用者票證以存取檔案等各種資源。

這使得存取管理可以規模化。例如在大學裡,學生可以透過所屬學院或宿舍管理,而檔案伺服器由各系管理;在公司裡,人事部門可以把使用者註冊到薪資系統,而各部門管理員管理伺服器與印表機這類資源。

首先 Alice 用密碼登入認證伺服器。她 PC 上的客戶端軟體從該伺服器取得一張用她密碼加密、含工作階段金鑰 KAS 的票證。假設她密碼打對了,她現在控制 KAS;要存取由票證授予伺服器 S 控制的資源 B,協定如下:

A → S :  A, B
S → A :  {TS, L, KAB, B, {TS, L, KAB, A}KBS}KAS
A → B :  {TS, L, KAB, A}KBS ,  {A, TA}KAB
B → A :  {TA + 1}KAB

翻成白話:Alice 向票證授予伺服器要求存取 B。若可行,就建立含適當金鑰 KAB 的票證 {TS, L, KAB, A}KBS 交給 Alice 使用。她也拿到一份她自己讀得懂的金鑰副本(用 KAS 加密)。她接著送一個時戳 TA 給該資源以驗證票證,資源則把時戳加一送回以確認自己還活著(這顯示它能正確解密票證並取出金鑰 KAB)。

Needham-Schroeder 的撤銷問題已藉由引入時戳(而非隨機 nonce)修好。但就像人生中多數事情一樣,安全上很少有免費的東西:現在有了新漏洞——我們各個客戶端與伺服器上的時鐘可能失去同步,甚至可能作為更複雜攻擊的一部分被蓄意去同步。

此外,Kerberos 是可信第三方(TTP)協定,因為 S 是被信任的:若警察帶著搜索票出現,他們可以讓 Sam 交出金鑰並讀取流量。

具此特性的協定在 1990 年代的「密碼戰爭」中受到偏愛。不涉及、或較少涉及對第三方信任的協定,一般使用公開金鑰密碼學。

OAuth 與 OpenID Connect#

與 Kerberos 相當類似的協定是 OAuth,一種允許安全委任的機制。

例如你用 Google 登入 Doodle,並允許 Doodle 更新你的 Google 行事曆:Doodle 網站把你重導到 Google,Google 讓你登入(或倚賴先前登入留下的主 cookie)並徵求你同意讓 Doodle 寫入你的行事曆,然後 Doodle 拿到一個存取該行事曆服務的權杖。

它是一個可在其中建構委任機制的複雜框架,同時有短期與長期存取權杖;細節與 cookie 及網頁重導的運作方式綁在一起,並為了讓伺服器能無狀態而最佳化,因此對現代網頁服務規模化良好。在上例中,你會想在 Google 端撤銷 Doodle 的存取權,所以幕後 Doodle 只拿到短命的存取權杖。

因為這種複雜性,OpenID Connect 是 OAuth 的一個「剖面(profile)」,把「唯一需要的服務是認證」這個情況的細節釘死。當你用 Google 或 Facebook 帳號登入報紙時,用的就是 OpenID Connect。

實務金鑰管理#

所以我們可以用 Kerberos 這類協定,在「每位使用者與充當金鑰分發中心的伺服器共享一或多把長期金鑰」的前提下,建立並管理使用者之間的工作金鑰。但可能有數萬名員工的加密密碼、加上大量裝置的金鑰——那是很多金鑰材料。它們要怎麼管理?

你必須坐下來思考:需要多少把金鑰、它們如何產生、需要服役多久、最終如何被銷毀。(更長的顧慮清單見美國聯邦資訊處理標準的金鑰管理規範。)

而且事情會隨應用演化而出錯:留出餘裕以支援明年的功能很重要。支援從安全失敗中復原也很重要。然而這兩件事都沒有標準做法。

公開金鑰密碼學可以稍微簡化金鑰管理任務。在銀行業,通常的答案是使用稱為**硬體安全模組(HSM)**的專用密碼處理器。但兩者都引入更多複雜性,以及更微妙的出錯方式。

設計保證#

我們看到的這些微妙困難、以及保護性質倚賴可能被誤解之微妙假設的種種方式,促使研究者對協定應用形式方法(formal methods)。這項工作原本的目標是判定協定是對是錯:要嘛被證明正確,要嘛展示出一個攻擊。我們常發現這個過程有助於釐清一個協定底下的假設。

驗證協定正確性有幾種不同取徑,最著名之一是信念邏輯(logic of belief),又稱 BAN 邏輯(以其發明者 Burrows、Abadi 與 Needham 命名)。它推理一個主體在看到某些訊息、時戳等之後可能合理相信什麼。其他研究者則應用 CSP 這類主流形式方法與 Isabelle 這類驗證工具。

形式方法可以是找出安全協定設計臭蟲的絕佳方式,因為它們迫使設計者把一切明確化,從而正面面對原本可能被含混帶過的困難設計選擇。但它們也有限制。

我們經常在已驗證的協定中找到臭蟲;它們只是不在我們驗證過的那個部分裡。

例如 Larry Paulson 於 1998 年用他的 Isabelle 定理證明器驗證了 SSL/TLS 協定,而此後大約每年就發現一個安全臭蟲。這些都不是基本設計上的瑕疵,而是利用了後來加上的額外功能,以及計時攻擊之類的實作議題。

這裡並沒有形式方法的失敗;它只是告訴了攻擊者哪裡不必去找。

協定穩健性#

基於這些理由,人們探索了確保認證協定設計的替代方式,包括**協定穩健性(protocol robustness)**的概念。

正如結構化程式設計技術旨在確保軟體被有條理地設計、不遺漏任何重要之物,穩健的協定設計主要關乎「明確性(explicitness)」

  • 一個協定的詮釋應只取決於其內容,而非其脈絡——所以一切重要之物(例如主體的名字)都應在訊息中被明白陳述。
  • 資料不應能被以多於一種方式詮釋——所以訊息格式必須清楚標明什麼是名字、什麼是位址、什麼是時戳;字串格式必須無歧義。
  • 不應能利用協定本身對處理它的軟體發動攻擊,例如透過緩衝區溢位。
  • 還有關於計數器、時戳與隨機挑戰所提供之新鮮性的議題,以及加密如何被使用的議題。

小結#

密碼只是一個更一般概念的例子:安全協定。協定規定主體用來在系統中建立信任關係的步驟——認證身分主張、證明擁有某項憑證,或建立對某項資源的請求權。

密碼認證協定的用途極廣,從基本的實體認證,到為分散式系統提供把信任從既有之處搬到需要之處的基礎設施。它們被部署在從遙控車門鎖、軍用 IFF 到分散式電腦系統認證的各種系統中。

  • 中間人攻擊
  • 修改攻擊
  • 反射攻擊
  • 重播攻擊

這些威脅還會與實作漏洞及拙劣的密碼學互相作用。用數學技術驗證協定正確性有幫助,但抓不到所有臭蟲

結果是:我們仍然經常在已用了多年的協定上找到攻擊,有時甚至在我們以為已有安全證明的協定上。失敗有真實後果——包括車廠在沒停下來想清楚中繼攻擊的情況下就採用被動無鑰匙進入系統之後,全球汽車犯罪的上升。

即使是專家,第一版協定也會做錯(作者自己就不只一次如此)。在協定實際部署之前修好臭蟲,不論在現金還是聲譽上,都便宜得多。

研究問題#

過去三十年間,好幾次有人以為協定「已經做完了」、我們該轉向新的研究題目。他們一再被新應用帶來的新一批錯誤與攻擊證明是錯的。

  • 1990 年代初形式方法蓬勃發展,接著是金鑰管理協定;1990 年代中期,電子商務機制的提案洪流讓大家忙碌不已。
  • 2000 年後,協定研究的一條支線帶上了經濟色彩,因為安全機制越來越多被用來支撐商業模式——設計者的「敵人」往往是商業競爭者,甚至是客戶
  • 另一條支線把協定分析工具用來檢視**應用程式介面(API)**的安全性。

多數協定研究是問題驅動的,但仍有深層問題:

  • 我們能從形式方法中得到多少?
  • 如何管理這兩個原則之間的張力:穩健協定一般是那些一切都被完整指定與檢查的協定;而系統工程原則說,好的規格不應過度限制實作者?