「建造一套『在按預期運作、且未受敵手直接實體攻擊時是安全的』加密系統相對容易。」

防篡改裝置無所不在#

本書至此討論過的例子包括:

  • 銀行卡中的 EMV 晶片與手機中用於認證的 SIM
  • 作為交通票券的非接觸卡,以及付費電視解碼器中用於服務控制的智慧卡
  • 印表機碳粉匣與遊戲主機配件中用於配件控制的晶片
  • 手機、筆電與伺服器中提供信任根、支撐安全開機與硬碟加密的 TPM 晶片
  • 用來加密銀行 PIN 的硬體安全模組(HSM),不只在銀行機房,也在 ATM 與部分銷售點終端機中
  • Android 手機中儲存非接觸支付憑證的 NFC 晶片,以及 iPhone 中儲存指紋與金鑰的飛地(enclave)晶片
  • 埋在自動販賣機裡的密碼模組,賣的東西從火車票、郵票到啟動你家電表的魔術數字
  • 各種製造控制晶片,用於「想讓低成本海外廠商代工、但不想看到未經同意的『第三班』產品流入灰市」的公司

智慧卡的防篡改能力,是在「付費電視盜版者複製訂戶卡」與「付費電視業者試圖阻止他們」的長期戰爭中演化出來的,並在「想鎖住產品的公司」與「想解鎖它們的公司」之間的軍備競賽中被磨利。

在只為完整性與可用性而需要防篡改的地方,有時可以用「在不同伺服器上複製、同時執行交易並對結果投票」來實作——這正被區塊鏈與其他共識協定重新發明。但防篡改裝置也能為資料提供機密性,而支援 SGX、TrustZone 這類飛地的 CPU 的出現,帶來了「在雲端服務中對加密資料進行計算」的前景。

歷史#

在密碼學中使用防篡改可追溯數個世紀。

  • 海軍密碼本被加重,好在即將被擄獲時扔進海裡;
  • 英國政府部長助理攜帶國家文件的公文箱內襯鉛,以確保它們會沉下去;
  • 密碼曾用水溶性墨水印製;俄國的一次性密碼本印在硝化纖維上,點燃會猛烈燃燒;而一台美國戰時密碼機附帶鋁熱劑自毀裝藥。

但金鑰材料常在突襲中被擄獲,因此人們嘗試把篡改回應流程自動化:有些機械密碼機被造成打開機殼就會抹除金鑰設定,早期電子裝置也跟進。

目標是「把金鑰材料的街頭價值降到零」,而這可以透過「無法輕易取出金鑰的防篡改裝置」或「取出金鑰會很明顯的顯篡改裝置」來達成。

硬體安全模組#

IBM 4758 是 2000 年代初領先的商用密碼處理器,重要有四個理由:

  1. 它是第一個被評估到美國政府當時所設之最高防篡改等級(FIPS 140-1 第 4 級)的商用產品
  2. 關於它有大量文獻,包括其歷史、硬體與軟體;
  3. 它因而成為高調的攻擊目標,作者與學生在 2000–2005 年間投入大量心力攻擊它、理解其殘餘弱點;
  4. IBM 目前的旗艦產品 4765 除了修掉他們找到的一些 bug 之外,並沒有大幅改變。

這導致了獨立密碼模組(金融科技界稱之為 HSM)的發展:包在堅固金屬外殼中的微電腦,具備加密硬體與特殊的金鑰記憶體——一種在外殼被打開時會歸零的靜態 RAM。

起初這只是把電源透過若干蓋子開關接到金鑰記憶體。所以每當維修人員來換電池,他們一打開蓋子就會摧毀金鑰;完事後再由 HSM 保管人重新載入金鑰材料。

如何攻破密碼處理器(1):直接偷金鑰#

修補方式是共享控制——有兩三份主金鑰元件,實際主金鑰由它們組合而成;PROM(或紙本金鑰)分別保存在由不同部門控制的不同保險箱中。

手冊或許會告訴保管人:抹除現行金鑰、讓工程師修裝置、事後再重新載入金鑰。但許多資深男性過去認為碰鍵盤是女人的工作,而即使今天他們仍認為技術工作有失身分。而且誰會去讀手冊?

所以主管常常把兩把金鑰都交給工程師以省麻煩。 有個案例裡,一位不誠實的工程師讓他們用一台「充當終端機、但開著記錄功能」的筆電輸入金鑰。作者甚至遇過 ATM 的紙本主金鑰被放在分行的通信檔案夾裡,任何員工都能查閱。

如何攻破密碼處理器(2)與(3):切開、鑽開、刮開#

到 2000 年左右,較好的產品把所有可維修元件(如電池)與裝置核心(篡改感測器、密碼處理器、金鑰記憶體與警報電路)分離。 核心接著被灌封進一整塊堅硬不透明的物質(如環氧樹脂)中。想法是任何實體攻擊都會涉及切割或鑽孔,那能被「陪同工程師進入銀行機房的警衛」察覺——至少事後會留下篡改證據。

例如你可以用刀把灌封料刮掉,然後把邏輯分析儀的探針放到其中一顆晶片上。理論上刮開黏膩的環氧樹脂應該會損傷內部元件;實務上那只是耐心問題。

RSA、DES 與 AES 這類密碼演算法有個性質:能監看計算過程中任一位元平面的攻擊者,就能還原金鑰。

於是高階產品有了篡改感測屏障。

早期例子出現在 1980 年代中期 IBM 的 μABYSS 系統:在裝置嵌入環氧樹脂時,用 40 號鎳鉻線鬆鬆地繞在它周圍,再接到感測電路。 理論上銑削、蝕刻與雷射燒蝕會弄斷線,從而抹除金鑰。

但「環氧樹脂中埋線」的技術可能敵不過用噴砂做的緩慢侵蝕:當感測線在灌封料表面露出時,就能接分流線繞過它們。

IBM 下一款主力產品 4753 改用金屬屏蔽,搭配一張印有導電墨水圖樣的薄膜,外面再包一層化學性質相近、但更耐久的材料。4758 則有改良的篡改感測膜:四組重疊的鋸齒導電圖樣被摻雜進聚氨酯片,再灌封在化學性質相近的物質中,好讓切入裝置的攻擊者連偵測到那條導電路徑都有困難,更別說接上它。

如何攻破密碼處理器(4)與(5):記憶體殘留與冷開機#

某款安全模組用同一組主金鑰運行數年後,其值就烙印進裝置的靜態 RAM。開機時,約 90% 的相關記憶體位元會呈現先前儲存之秘密金鑰位元的值——那已足夠還原金鑰。

記憶體殘留不只影響靜態與動態 RAM,也影響其他儲存媒體。 2005 年 Sergei Skorobogatov 發現如何從微控制器的 Flash 記憶體萃取資料,即使它已被「抹除」數次;喜不喜歡都好,Flash 晶片中的磨損平衡處理器成了你可信計算基礎的一部分。

2008 年 Alex Halderman 等人把這發展成對 PC 與手機加密金鑰的「冷開機攻擊」:現代 DRAM 在斷電後保留記憶體內容數秒,低溫下更久;用冷凍噴劑冷卻記憶體、再以輕量作業系統重開機,往往就能讀出金鑰。

除非有在斷電時把金鑰歸零的機制,否則磁碟內容的軟體加密可以被擊敗。 即使把金鑰放在 TPM 這類特殊硬體中也不夠——如果它做的只是限制你猜硬碟加密密碼的次數,然後在你猜對後就把主金鑰複製到主記憶體讓 CPU 做剩下的工作。

所以你的產品可能用某廠牌的 SRAM 通過殘留測試,卻在一年後買同廠牌晶片時無法通過同一個測試。這顯示了「倚賴某元件某項對其製造商而言不重要之性質」的危險。

一台「被凍結就自毀」的裝置無法可靠地透過正常配送通路運送,因為飛機貨艙可能低到攝氏 −40 度。(作者在 eBay 買過密碼模組,收到時是死的。)軍規設備廠商則有相反的問題:他們的裝備必須耐 −55 到 +155 度。

有些軍用裝置採用保護性引爆:把記憶體晶片灌封在鋼罐中,配上精確計算過、足以摧毀晶片而不致讓氣體從罐中逸出的鋁熱劑裝藥。

如何攻破密碼處理器(6)與(7):電磁與邏輯#

就 4758 而言,策略是採用實心鋁屏蔽,並對電源做低通濾波,阻擋任何在內部計算頻率上的訊號外洩。 這層屏蔽在篡改感測膜之內,以防對手切出一道可以充當天線的縫。

  • 有款 HSM(Chrysalis-ITS Luna CA3)的金鑰代幣軟體被逆向工程,發現有程式碼允許引入一把未經認證的「客戶驗證金鑰」,並用它來認證現行金鑰的匯出。
  • 2019 年,有人對 Gemalto Safenet Protect Server 做模糊測試(先對其 SDK 附的 HSM 模擬器,再在真 HSM 上驗證),找到緩衝區溢位攻擊,並寫出上傳任意韌體的程式碼——那是持久性的,且能下載所有秘密。

Mike Bond 與作者發現 CCA 向主機暴露的應用程式介面(API)含有若干可利用的瑕疵:有主機存取權的程式設計師能送給安全模組一連串指令,使它洩漏 PIN 或金鑰。

這些漏洞多半是「4758 使用者必須向下相容的先前加密裝置」的遺產,而事實上多數其他安全模組更糟。這類攻擊很難阻止,因為 Visa 不時會為支援新的支付網路功能而規定新的密碼操作,而這些會為整批安全模組引入新的系統性弱點。

最終結果是:許多銀行花大錢買安全的 HSM 用於形式上的合規,同時倚賴其他存取控制機制來保護這些寶貴裝置免於攻擊。甚至有專門賣防火牆來保護 HSM 免於軟體傷害的公司。

評估#

攻擊者的三個等級,以及 FIPS 140 的「3.5 級」缺口

IBM 1991 年推出 4753 時,在相關白皮書中提出下列攻擊者分類:

  1. 第 1 類——「聰明的局外人」:往往很聰明,但可能對系統理解不足。他們可能只能取得中等精密的設備。他們常試圖利用系統中既有的弱點,而非自己創造一個。
  2. 第 2 類——「有知識的內部人」:有紮實的專門技術教育與經驗。對系統各部分的理解程度不一,但可能接觸得到大部分。他們常有高度精密的分析工具與儀器。
  3. 第 3 類——「有資金的組織」:能組成技能相關且互補的專家團隊,並有雄厚資金支持。他們有能力深入分析系統、設計精密攻擊、使用最先進的分析工具,並可能把第 2 類對手納入攻擊團隊。

在這個框架下:典型微控制器的目標是擋住聰明的局外人;早期 4753 意在擋住有知識的內部人;而 4758 意在(並獲認證能)擋住有資金的組織。

FIPS 認證方案由美國政府授權的實驗室運作。

1994 年的原始標準 FIPS 140-1 設下四個保護等級,第 4 級為最高。第 4 級與第 3 級之間有巨大的落差:第 3 級的裝置往往對專家而言很容易攻擊。

事實上,IBM 工程師論評估的原始論文提出了六個等級;FIPS 標準採用了前三個作為其 1–3 級,並採用其提議的第 6 級作為自己的第 4 級。這道通常被稱為「3.5 級」或「3+」的缺口,正是 1990 年代到 2019 年間許多較好的商用系統瞄準的位置——這類設備試圖擋住第 1 類攻擊社群,同時讓第 2 類的日子難過、讓第 3 類代價高昂。

對 FIPS 取徑的批評指出:它未涵蓋緩衝區溢位與 API 攻擊這類非侵入式安全;其角色概念綁定於公司裡的人類行為者而非其他系統元件;它未涵蓋某些側通道分析方法;它整體上瞄準過時的技術;FIPS 標準包含了已知含有 NSA 後門的雙橢圓曲線確定性隨機位元產生器;而且它被 NIST 發布實作指引而非定期更新標準的方式改動得太頻繁。

智慧卡與其他安全晶片#

在使用中的 HSM 有數萬台,但自成一體的單晶片密碼模組有數十億個——內含非揮發記憶體、I/O、通常還有 CPU、常有些專用邏輯,以及防止記憶體被讀出的機制。

它們的範圍從低端的交通票券,經智慧卡與現在多數電腦與手機都配的 TPM,一路到設計來盡可能久地承受「有能力且有動機之對手」攻擊的付費電視卡與配件控制晶片。

付費電視訂戶卡尤其遭受密集攻擊,因為它們往往有一把通用的共享秘密金鑰——攻陷一張就能製造大量偽卡;而攻破一張銀行智慧卡只讓攻擊者洗劫那一個特定帳戶。

歷史與架構#

智慧卡於 1970 年代中到 1980 年代中在法國發展。從 1980 年代末開始大規模使用,最初是 GSM 手機中的**用戶識別模組(SIM)**與衛星電視的訂戶卡。1994 年開始在法國與南非用作銀行卡,繼而導向 EMV 標準。

智慧卡晶片也有其他封裝方式:1987–2009 年美國政府使用的 STU-III 保密電話中,每位使用者有一把封裝得看起來、摸起來都像實體鑰匙的「密碼點火鑰匙」;主機板上支援可信開機的 TPM 晶片,基本上就是加了平行埠的智慧卡晶片;非接觸智慧卡則是智慧卡晶片加一圈線圈天線。

「用便宜的卡來個人化一台較貴的電子裝置」這個策略,在從付費電視機上盒到智慧電表的其他應用中也能見到。 裝置能為全球市場大量製造,而每位訂戶拿到一張卡來付費使用服務;在攻擊成功時,卡片也能相對快速廉價地更換。

記憶體以一般電腦的標準而言很有限;對外只有電源、重置、時脈與序列埠的連接。

安全性的演化#

他不信,但當時沒有時間或工具去證明業務員錯了。他後來從業界主管那得知,在 1995 年之前沒有任何客戶願意為認真的安全付錢;在那之前,他們倚賴裝置的小尺寸、設計的晦澀、以及晶片測試工具的難以取得來增加攻擊難度。

無論如何,只要它們只用於 SIM 卡,就沒有有能力又有動機的對手:駭我自己的 SIM 卡,最多只能把通話費記到我自己帳上。

電視業者向廣大足跡(例如整個歐洲)廣播訊號,並給每位訂戶一張卡來計算解密其付費頻道所需的金鑰。由於業者通常只買了一兩個國家的影片版權,他們不能在別處賣訂戶卡。這創造了黑市,偽卡可以賣進去。

一個關鍵因素是《星艦迷航記》——歐洲人多年來從英國衛星廣播收看——在 1993 年突然被加密了。 在德國這類國家,它甚至無論出多少錢都無法合法取得。這激勵了大批熱血的資工與工程系學生去找漏洞。

另一個因素是某些國家(尤其愛爾蘭與加拿大)當時還沒有禁止販售偽造付費電視卡的法律(加拿大直到 2002 年才立法)。所以駭客能公開販售其成果。

攻破智慧卡的十二種方式(1–5):協定、電壓、時脈、探針與故障注入

(1)協定攻擊。 最早的入侵針對協定而非卡片本身。

例如某些早期付費電視系統給每位客戶一張能存取所有頻道的卡,然後在試用期後透過空中訊息取消客戶未訂閱的頻道。這開啟了一個攻擊:在智慧卡與解碼器之間插入一個裝置,攔截並丟棄任何送給卡片的訊息。於是你可以取消訂閱,而業者無法取消你的服務。

(2)凍結 EEPROM。 智慧卡使用外部電源,並把金鑰與價值計數器這類安全狀態存在 EEPROM 中。

修補方式是用倍壓電路從供應電壓 V_CC 內部產生 V_PP。 然而這並非萬無一失,因為該電路能被攻擊者摧毀(例如用一發雷射)。除了繞過價值控制,他們也能繞過 PIN 重試計數器,一個接一個試遍所有可能的 PIN。

所以審慎的程式設計師不會只是要求客戶輸入 PIN、失敗才遞減計數器。你要先遞減計數器、檢查它、取得 PIN、驗證它,若正確才把計數器加回去。

(3)掃描式電子顯微鏡與慢時脈。 另一個早期攻擊是用掃描式電子顯微鏡(SEM)讀取晶片表面的電壓。

現代智慧卡處理器有看門狗計時器或其他電路偵測低時脈頻率並重置卡片,或改用動態邏輯。但如同防盜警報,誤警與漏警之間有取捨:廉價讀卡機在卡片上電時可能有劇烈的時脈頻率波動,造成許多誤警。最終卡片有了內部時脈。

(4)實體探測。 付費電視業者擋掉容易的攻擊後,盜版者轉向實體探測。

探針工作站由裝有微操縱器的顯微鏡構成,可以把細探針降落到晶片表面。它們在半導體業用於產線抽樣測試,可以買二手的,並可能有雷射這類專門配件來在晶片鈍化層上打洞。

探測攻擊的通常目標是處理器的匯流排。 如果能記錄匯流排流量,就得到程式運作的軌跡。(業界一度建議的實務做法,是卡片在重置後立刻對記憶體計算校驗和——那等於給出所有程式碼與資料的完整清單。如果晶片使用 AES 與 RSA 這類演算法,除非有某種遮罩計算的防禦機制,否則即使只有一條匯流排線的軌跡也足以重建金鑰。

(5)記憶體線性化與故障注入。 這個策略被 Oliver Kömmerling 的記憶體線性化攻擊擊破。

事實上,一旦裝置的部分 ROM 與 EEPROM 被理解,攻擊者就能跳過不要的指令,讓裝置只執行他所選擇的指令。所以只用一根探針,他們就能讓卡片執行任意程式碼。這可以想成早期版本的返回導向程式設計(ROP)攻擊。

一個常見目標是測試電路:典型晶片的 ROM 裡有自我測試常式,在工廠執行、允許讀取並驗證所有記憶體內容。有些情況下會燒斷一個熔絲來阻止攻擊者使用該功能。但攻擊者能在這個機制上製造故障——不論是翻轉 Flash 記憶體中的一個位元,還是單純找到那個熔絲、用兩根探針把它橋接起來。

我們曾提過 RSA 演算法在故障存在時很脆弱:只要一發雷射,就能讓一個簽章模 p 正確、模 q 錯誤,使攻擊者能分解金鑰 pq。

Adi Shamir 指出,如果一顆 CPU 的乘法單元有錯誤——哪怕只是某一個計算 ab = c 的結果總是在單一位元上錯——你就能設計一個 RSA 密文(或明文),讓計算模 p 正確、模 q 錯誤,同樣讓你能分解金鑰。

所以細心的程式設計師永遠會檢查關鍵計算的結果,並認真思考錯誤訊息可能揭露什麼。

攻破智慧卡的十二種方式(6–12):硬體密碼、防護網、功耗分析、光學探測與 SEM 讀記憶體

(6)硬體密碼處理器。 付費電視卡業界接下來納入硬體密碼處理器,以迫使攻擊者重建硬體電路而非單純複製軟體,並迫使他們在盜版卡上使用更貴的處理器。

下一版把密碼硬體做進 CPU 本身。 當它只有幾千個閘時,攻擊者能從顯微照片手工描出電路;但在閘數更多、製程進入深次微米後,成功的攻擊需要認真的工具:你得蝕刻或研磨掉晶片的層、拍電子顯微照片,並用影像處理軟體重建電路。設備現在能租、電路重建軟體能買——如今短缺的資源是熟練的逆向工程師。

(7)防護網屏蔽與聚焦離子束。 1995 年 STM 首創新防禦:晶片表面的保護屏蔽。

感測網屏蔽能真正推高攻擊成本。 一種繞過方式是用探針把感測線拉到 V_DD,但這可能很脆弱;而其他廠商有多條帶著真實訊號的感測線。所以你若切斷它們,就得修好它們——而做這事的工具是「聚焦離子束工作站(FIB)」。

FIB 類似掃描式電子顯微鏡,但用離子束而非電子束。 藉由改變束流,它既能當顯微鏡、也能當銑床,有效解析度在 10 奈米以下。引入會被離子束分解的氣體,你就能以數十奈米的精度鋪設導體或絕緣體。

FIB 在從半導體測試、冶金、鑑識到奈米技術的各種應用中都太有用了,因而在物理與材料科學實驗室中廣泛可得,租用一小時大約一百美元。

(8)差分功耗分析(DPA)。 1998 年,Paul Kocher 宣布的新攻擊震撼了智慧卡業界。

智慧卡廠商自 1980 年代就知道這在理論上可行,甚至為一些粗糙的對策申請了專利。但 Paul 想出了讓它變容易的高效訊號處理技術。他還想出更簡單的基於時序的攻擊:若密碼操作耗費的時脈週期數不同,這也可能洩漏金鑰材料。

1998 年市面上所有智慧卡都被發現對 DPA 高度脆弱,這在對策開發期間拖住了整個產業好幾年。

(9)光學探測與「半侵入式」分析。 機械探測技術因製程尺寸縮小而穩定變難。

同年稍晚,Sergei 報告用裝在同一台廉價顯微鏡上的雷射直接讀出微控制器的記憶體。 基本想法很簡單:若你把雷射照在一個電晶體上,會誘發光電流並增加裝置的功耗——除非它本來就在導通。所以用雷射掃過裝置,你就能繪出哪些電晶體是關的、哪些是開的。

他們稱之為「半侵入式分析」,因為它介於既有的侵入式與非侵入式之間:它不侵入(沒破壞鈍化層),但確實移除了環氧樹脂,所以也不算非侵入。

(10)背面攻擊。 一旦製程小於 0.35μ,背面攻擊就是可行的半侵入式選項。

背面攻擊有時能靠直接觀察萃取 ROM 內容,但主要技術是光學故障注入(OFI),如今已成為標準的安全測試程序。矽浸沒透鏡讓 OFI 攻擊能持續在 28nm 矽上製造單事件翻轉,即使雷射光斑約一微米大。2019 年多數在用的智慧卡約為 90nm,最小的 65nm,所以 OFI 還會實用一段時間。

(11)Flash 撞擊攻擊與 SEM 直接讀出。

由於記憶胞是靠浮閘中幾百個電子的有無來儲存一個位元,要不用專為此設計的電路來讀出它們很棘手——尤其是用一束由數十億電子構成的射束、從晶片背面瞄準。(他們過去把這比喻為「用噴燈讀重寫本」。)

要做到這點,需要非常仔細的樣品製備、一台支援被動電壓對比(PVC)的 SEM、精細調校的掃描擷取與高效的影像處理。用這樣的工具與技術,如今能從典型智慧卡或其他安全晶片讀出 256K 的 Flash 或 EEPROM,大概只有半打單位元錯誤。

對智慧卡業界的影響是:晶片的整個記憶體現在都能被讀出。逆向工程就變成弄清楚 CPU 的指令集、記憶體如何加密等等的問題。

(12)整片逆向 + 模擬器。

然後你有各種選項:一旦你對某型卡片理解得夠透徹,每張卡的複製成本就只剩記憶體萃取的成本。你也能用模擬來尋找側通道攻擊、規劃 FIB 修改、或對裝置做模糊測試找其他漏洞。

由於智慧卡就是電腦,它們有時也會敗給一般的電腦攻擊,例如送出過長的參數字串造成堆疊覆寫。2019 年,惡意簡訊被國家級攻擊者用來把惡意程式下載進目標使用者的 SIM,以追蹤其位置。

亂數產生器與 PUF#

許多密碼晶片提供亂數產生器、實體不可複製函數(PUF),或兩者。

1990 年代流行演算法式的亂數產生(正確名稱是偽亂數產生器 PRNG)。密碼晶片可能有一把用於計數器加密模式的特殊金鑰產生金鑰;然而若計數器被重置,輸出就會重複。

本書也提過 NIST 的 Dual-EC-DRBG,它被內建進 Windows 且似乎含有 NSA 的暗門;史諾登後來證實 NSA 付了 RSA 一千萬美元,讓許多科技公司授權的工具採用該標準。

密碼產品常把環境與內部的多重來源隨機性混合在一起,而這也是最高認證等級的要求。這些來源如何被組合往往才是關鍵,而要小心那些試圖過於聰明的設計。

還必須當心:硬體 RNG 通常是專有、晦澀的設計,有時還專屬於單一晶圓廠,所以很難檢查設計是否健全,遑論檢查它不含微妙的後門。

密碼晶片的製造通常包含一個把序號與金鑰載入 Flash 或 EEPROM 的「個人化」階段。這是另一個攻擊點: 史諾登報告 GCHQ 曾入侵 Gemalto 用來個人化卡片的機制,取得了數百萬張 SIM 中的金鑰複本。

PUF:從鈔票裡的光纖到 XOR 仲裁器

實體不可複製函數(PUF)是一種靠製造時自然發生的變異來辨識裝置的手段。

積體電路能不能弄個類似的東西? 2000 年 Oliver 與 Fritz Kömmerling 提議在晶片封裝中摻入金屬纖維、量測其性質以產生一把用來加密晶片內容的金鑰,好讓鑽穿封裝就會摧毀金鑰。 2002 年另有人提議使用矽本身的製程變異,認為一組環形振盪器或許夠混沌而能夠獨一無二。

典型的「弱 PUF」在上電時從製程變異產生一個一致的隨機數;SRAM PUF 讀取某些 SRAM 胞的初始狀態,經糾錯後用作穩定的隨機 ID、或用作加密記憶體的 AES 金鑰、或用來驅動 PRNG。

如果你的對手有能力逆向你的電路並掃描你的 Flash 記憶體,PUF 至少能迫使他們多花力氣從匯流排上探出金鑰,或一次一條匯流排線地注入故障、用差分故障分析把它讀出來。

注意這本身並不會阻止 NSA 對 Gemalto 的攻擊,因為他們入侵的是個人化檔案;若當時用了 PUF,他們也會拿到挑戰-回應對的檔案。

而且探測攻擊永遠都在:晶片上總得有某個常式能讀取 PUF 才能讓它做事,那意味著開機載入器或監控器。由於這些常為了個人化、保固與升級目的而對供應鏈的一部分開放,很難看出這類裝置能提供什麼額外保護,即使我們能發明出一個真正能用的。

最後,PUF 的強度取決於晶圓廠竭盡全力想消除的變異,所以矽製程一改,PUF 設計就可能突然變得不安全。

更大的晶片#

帶有嵌入式安全功能的較大晶片越來越多,典型瞄準製造控制或配件控制。

從 Clipper 晶片到安全 FPGA 與 SoC

這類產品的鼻祖可能是 Clipper 晶片,柯林頓政府 1993 年提議用它取代 DES。

也稱託管加密標準(EES),這是一顆含 Skipjack 區塊密碼、以及一個設計來讓 FBI 能解密任何用它加密之流量的協定的防篡改晶片。

當你把明文與金鑰給 Clipper 加密時,晶片回傳的不只是密文,還有一個「執法存取欄位(LEAF)」,內含用一把嵌在裝置中的 FBI 金鑰加密過的使用者金鑰。為了防止人們送出錯誤的 LEAF 來作弊,LEAF 帶有用所有 Clipper 晶片共享的「家族金鑰」計算的 MAC。

熔絲鏈也用在其他裝置上(例如近期的 iPhone 在其系統單晶片中燒入一把 AES 金鑰)。逆向工程反熔絲裝置基本上有三種取徑:

  1. 先看程式化電路。 所有這類晶片都有在程式化期間讀回並驗證位元流的測試電路,而許多在事後熔斷單一熔絲來停用它。若你能取得樣品與燒錄器,也許能用差分光學探測找到那個熔絲,然後用 FIB 修好它、或用兩根探針橋接,把位元流讀出來。
  2. 當你需要讀出許多熔絲時(例如它們用來存 AES 金鑰),蠻力做法是一層一層剝掉晶片並直接讀熔絲;用適當的化學染色它們是看得見的。由於這種攻擊是破壞性的,對每顆裝置都不同的金鑰而言用處有限。
  3. 若裝置實作了密碼演算法,側通道攻擊可能是最快的入口。 2000 年前製造的多數裝置對功耗分析相當脆弱,而雖然智慧卡晶片商已納入防禦,較大晶片的製造商可能寧可避開向 Cryptography Research 支付權利金。

安全 FPGA 在 21 世紀成為大生意,因為廠商把電子產品製造外包到遠東,卻想至少控制一個關鍵元件以防超產與仿冒。

現在賣的多數 FPGA 用的是傳統記憶體而非反熔絲,所以能做成可重新程式化。若你用把位元流存在 SRAM 的揮發性 FPGA,你會需要在非揮發記憶體中放一把或多把嵌入金鑰,好讓位元流在上電時被上傳並解密。

但要當心透過升級機制的阻斷服務攻擊。 例如一顆 Flash FPGA 可能只有放一份位元流的記憶體,而非兩份;於是天真的做法是把位元流讀入一次以解密並驗證 MAC,再讀第二次來重新程式化該零件。但如果第二次提供的位元流是壞的,你會不會就得到一個死掉的產品?

而如果你允許回滾,你的客戶或許就能靠重播舊位元流來逃避升級。而如果攻擊者讓你的產品載入一個隨機的加密位元流,這可能造成短路而讓零件變磚。

第二類大晶片安全產品是內建認證邏輯的系統單晶片(SoC)。

遊戲主機商的商業模式包括對軟體與額外記憶卡收取溢價,其賣家必須使用防拷技術並向主機商支付權利金;這用來補貼主機的初始成本。 當然,售後市場業者接著會駭掉他們的防拷機制,於是 Sony 著手用更好的防拷技術主宰其售後市場。

MagicGate 協定既簡單(所以找不到協定攻擊)又隨機化(所以攻擊者無法從重複交易中學到東西)。售後市場公司花了好幾年與數百萬美元才追上。

雖然小晶片中的認證邏輯可能需要頂層金屬屏蔽、複製陷阱與佈局混淆來藏住它,同樣的邏輯在大晶片中卻能藏在數十億顆其他電晶體之間。

到 2000 年代中後期,類似的邏輯開始出現在其他產業的 SoC 產品中——有時用於配件控制,有時用於「讓同一個產品能以數種不同效能等級販售」以做價格歧視。

這個做法導致了一些有趣的邊緣案例:2017 年,特斯拉曾為了讓車主能逃離颶風 Irma 的路徑,臨時「升級」了 Model S 與 X 的電池。

那麼要怎麼駭這些如今無所不在的神奇裝置?

例如 Sergei Skorobogatov 用新的 PVC Flash/EEPROM 讀出技術逆向了 OmniPod 胰島素幫浦會寫程式的糖尿病患者偏好自己控制胰島素幫浦,但廠商基於市場控制與責任理由試圖阻止他們。

於是 OmniPod 的 SoC 會與其授權控制器執行認證協定,而支援糖尿病患者的 NGO「Nightscout 基金會」想萃取出金鑰,好讓病患能依自身健康需求而非依 OmniPod 訂的治療協定來最佳化控制。

早期例子是 Markus Kuhn 對 DS5002 處理器發明的「密碼指令搜尋攻擊」。 這款裝置首創匯流排加密——用硬體在資料載入與儲存時即時加密記憶體位址與內容,好讓它不受限於當時低成本篡改感測封裝所能容納的少量 RAM。

Markus 注意到該處理器有些指令具有可見的外部效應,特別是有一個指令會把記憶體中的下一個位元組輸出到裝置的平行埠。所以你若用測試夾攔截處理器與記憶體之間的匯流排,就能在指令流的某一點餵入所有可能的 8 位元指令位元組,直到看到一位元組的輸出。 用這個技巧列出幾個位元組的加密函數後,你就能加密並執行一段短程式來傾印整個記憶體內容。

類似的把戲今天仍在使用。 2017 年 Sergei 展示了對一款汽車業所用 SoC 的主動攻擊,該晶片用記憶體加密讓匯流排探測更難;他藉由選擇性地把錯誤運算碼注入匯流排,成功反推出加密函數。

2016 年 3 月,FBI 局長 Comey 要求 Apple 做出一個 iOS 的執法「升級」以存取上鎖的 iPhone,宣稱否則 FBI 無法解鎖聖貝納迪諾槍手的手機。Sergei 著手證明他錯了,到 8 月就有了可行的攻擊。

該款 Apple 5c 的 SoC 有一把靠燒熔絲設定的嵌入式 AES 金鑰;由於這些在電子顯微鏡下看得見,讀出或許可行,但會摧毀 SoC。AES 不易受密碼分析,而加密看來是一次一條快取線地進行,所以密碼指令搜尋行不通。

但沒關係,因為有 NAND 鏡像攻擊。 手機的非揮發記憶體是一顆 NAND Flash 晶片,其內容被嵌入式裝置金鑰逐條快取線加密,好讓一支手機的晶片無法在另一支上讀取。

攻擊方式是:把記憶體晶片解焊下來、裝進插座、複製其內容。 接著你猜半打次 PIN,手機開始變慢(十次後鎖定)。然後你取下記憶體晶片、還原其原始內容。現在你可以再試半打次。 多做點功夫,你還能複製該晶片或做一塊電路板來模擬它,好讓你猜得更快。

最後 FBI 用的是鑑識公司 Cellebrite 的服務,後來證明那是在利用 iPhone ROM 中的 Checkm8 漏洞。

半導體接面切換時會發射光子,而光子發射顯微術是既有的失效分析技術。2008 年首次被用來攻擊密碼實作時,研究者用昂貴的單光子計數光電倍增管從一顆過時的 0.8μ 微控制器讀出 AES 金鑰,但擔心該技術對小於 0.12μ 的技術無效。

隔年 Sergei Skorobogatov 發現賣給業餘天文愛好者的光電倍增管近乎理想,並發現了一個「升壓」技巧:把晶片供應電壓從 1.5V 提高到 2V,光子輸出增加六倍。他因而幾乎能從一顆現代晶片(Actel ProASIC3 FPGA)的內部密碼引擎讀出 AES 金鑰。

接著,一旦確立了 AES 演算法的時序、知道每個回合金鑰花 1.6μs,他就在單一次匯流排寫入的那 0.2μs 內進一步把電壓提高到 2.5V,讓光子輸出再增加四倍並取得時間解析度,使他能清楚地從匯流排上讀出回合金鑰的每一個字。

這一切相當令人難堪,因為作者 2001 年曾為 Actel 的設計擔任顧問。 ProASIC3 用 0.13μ 製程、七層金屬與 Flash 記憶體製造,而他們針對當時已知的攻擊建了各種對策;要以侵入方式讀出它會很繁瑣。

那是一記尖銳的提醒:很難擋住尚未被發明的攻擊,而一旦專家開始磨利它們,攻擊能改善得非常快。

技術現況#

  • 1990 年代末,一切都被攻破了。 本書 2001 年版寫道:「據我所知,沒有任何技術或技術組合,能讓智慧卡抵抗熟練而堅定的攻擊者的滲透。」
  • 2000 年代,因為付費電視公司與銀行業的努力,防禦改善了,所以第二版寫道:「這仍幾乎為真,但……你可能得面對一年的延遲、超過一百萬美元的預算,而且不保證成功。」
  • 如今在 2019 年,摩爾定律已經沒力了;密碼晶片多半卡在約 100nm,而半導體測試設備業正瞄準支援 9nm 製程,並仍不斷推出被動電壓對比顯微術這類創新。所以攻擊方開始追上來了。

所以有越來越多中等級的產品,適合研究生學習硬體逆向工程的技藝。而中國對「為相容性而逆向裝置」日益增長的需求,推動了商業逆向實驗室的成長。市場已大到能讓人靠賣佈局重建軟體、光學故障注入工作站這類專門工具維生。

結果是:攻擊者變得更多也更有效率。作者懷疑複製一張智慧卡的成本會穩定地降到數萬、也許進入單位數的數千美元。

買 HSM 的銀行家大概不會意識到 FIPS 第 3 級與第 4 級之間的巨大落差,也不會理解第 3 級有時能被一把瑞士刀擊敗。那裡的購買誘因是合規,而在真正的安全與營運衝突時,看到「為了讓合規更容易而設計的較弱標準」也就不足為奇。

API 安全太難,而 HSM 內外 API 的差異讓它太令人困惑。

第一,多數 HSM 生意正在移往雲端:Azure 與 AWS 各有約 2,000 台 HSM,Google 在追趕。與其讓數千家銀行各跑幾台或幾十台 HSM,我們將有三家公司跑數千台。 隨著價格被壓低,HSM 廠商工程師的專業會流失;而由於雲端服務商守衛其資料中心,HSM 很可能會被密碼晶片取代。

第二,多數大宗智慧卡市場(SIM 卡與 EMV 卡)只有中等的實體保護需求,因為完全攻陷只讓攻擊者利用一個帳戶。你不會想要一台壞終端機能對它看到的每張 EMV 卡做生產級的功耗分析攻擊,但即使真的發生,那也不是世界末日——磁條卡就是那樣被複製的,而我們知道怎麼限制損害。

廠商只會花剛好足夠達到認證要求的錢,而認證仍會滑不溜丟、會被玩弄。安全工程師將必須習慣用「灰盒」元件建構系統——那些只要花點功夫就能萃取出金鑰與演算法的晶片。

作者懷疑配件控制會仍是最艱難的硬體戰場。 售後市場控制如今不只關乎印表機碳粉匣,還延伸到車輛、醫療裝置與其他高價值產品。但只要互相認證的兩個裝置中至少有一個偶爾會上線,保護需求就遠不如衛星電視嚴苛。真正的問題會是:如何阻止攻擊規模化。

殘餘風險#

安全工程師必須注意那些「或多或少與裝置價格或技術防篡改能力無關」的系統失效模式。

可信介面問題#

有些銀行安全模組前面有實體鎖,確保只有持特定金屬鑰匙(或智慧卡)的人能執行特權交易。但無論你用 2,000 美元的 4765 還是 2 美元的智慧卡做數位簽章,你都還是得信任驅動它們的 PC。

如果它顯示「請支付 amazon.com 67.99 美元購買一本《Security Engineering》」,而它實際送去簽章的訊息是「請把我在 Acacia 大道 13 號的房子二胎抵押,並把款項付給黑手黨房地產公司」,那防篡改就沒替你買到多少東西。

有人指出:當你使用合格電子簽章裝置時,你等於在說「我同意對所有以我現在出示的金鑰驗證通過之簽章負無保留責任,並承擔任何人因信賴它而承擔的一切風險。

歐盟 eIDAS 規則要求所有歐盟政府在先前要求紙本簽名的交易中接受合格電子簽章。相較於紙筆簽名的責任移轉,沒有一個明智的人會在非必要時使用合格電子簽章裝置。所以遊說者出動了,某些國家現在強制你用它們報稅。

這促使德國研究者仔細檢視簽章、簽章驗證服務與 PDF 檔案如何互動;一如你所預期,結果相當駭人:他們製作了一份由德國 Amazon 簽署、有全套官方機制背書、證明你應獲得一兆美元退款的文件。他們找到三種對 PDF 簽章的新攻擊,想出如何繞過 22 個檢視器中 21 個的簽章驗證,並騙過 8 個線上驗證服務中的 6 個。

這開啟了一些可能性,包括「惡女僕攻擊」:能暫時接觸該裝置的人(例如旅館清潔人員)重新燒錄微控制器軟體。在此案例中,安全元件完全不知道主處理器是否在執行被攻陷的程式碼。

回想預付式電表的例子:防篡改處理器能維持一個價值計數器,對每個業者強制執行信用上限,並在售賣機被偷時限制損失。郵資機的運作方式相同。在從印表機墨水匣、遊戲主機到預付電話卡的許多其他應用中,廠商主要關心的是使用控制。

利益衝突、檸檬市場與評估遊戲#

在銀行業,發卡機構、終端機擁有者與客戶是不同的;複製卡、假終端機、黑幫商家與作弊銀行之間的所有互動都需要被想清楚。

他們的客戶可能擁有該產品,卻有動機在辦得到時去篡改它。 以配件控制而言,客戶可能還有嘗試破解它的合法權利;而當這些機制被用來限制裝置壽命、從而助長環境污染時,他們甚至可能覺得自己有道德義務這麼做。

第一,高保證等級的產品相對少(不論是 FIPS-140 第 4 級或 CC 第 4 級以上)。低等級的很多,那裡測試相當容易通過,而廠商能到處找一家願意放水的實驗室。這導致一個檸檬市場,除了消息最靈通的買家外,所有人都會被誘去買最便宜的 FIPS 第 3 級或 CC EAL4 產品。

第二,評估證書的意思跟看起來不一樣。 2001 年買 4758 的人可能會把它的第 4 級評估解讀為「牢不可破」——然後在被攻破時大吃一驚。事實上,該 FIPS 證書只涉及硬體,而他們找到的是軟體漏洞。 反過來也發生過:曾有一張智慧卡有 CC 第 6 級評估,但那只涉及作業系統——而它跑在一顆對微探測毫無真正防禦的晶片上。

最後,許多公司使用安全處理器是為了「甩鍋」而非降低風險。 銀行很愛能說「你的晶片+ PIN 卡被使用了,所以是你的錯」,而許多國家的主管機關就讓他們這麼幹。從醫療到國防,有許多環境中買家想要的是一張安全證書,而非真正的保護。

以晦澀求安全#

晦澀也常是出口核准的要求,導致一種懷疑:它掩蓋的是刻意的漏洞。 例如他們測試過的一張卡,在被指示產生私鑰/公鑰對並輸出公開部分時,總是產生同一個值。

這種開放性促成了對 IBM 產品的 API 攻擊、以及對 Intel 與 Arm 產品的側通道與 ROP 攻擊的發現。但多數這類攻擊都被負責任地揭露,而學習過程改善了他們的產品。

由於業界早年不對自家產品做敵意攻擊,其產品很弱,最終被別人攻破。 1990 年代末以來,有些組織(如 VISA)已規定要做滲透測試。但誘因仍然錯位:明智的廠商會去找那家給他們最輕鬆過關的評估實驗室。

環境改變#

我們看過原本只是「向電信商識別你」的 SIM 卡,變成控制你銀行帳戶存取的代幣。

本書第二版寫道:「這重要嗎?……我會說大概不重要;用簡訊確認銀行交易,以幾乎為零的邊際成本給了銀行與客戶一個有價值的第二認證通道。」當時我們只有一起 SIM 調換攻擊的通報案例,發生在南非。

下一段他寫道:「但五年或十年後、等所有人都這麼做時會怎樣?如果 iPhone 如 Apple 所願起飛,讓所有人不只把它當手機、也當網頁瀏覽器用呢?那兩個認證通道就一下子縮成一個了。

事實正是如此;SIM 調換如今在美國變成主流。

但有一個 SIM 調換詐欺很少的國家是印度,那裡主管機關決定電信商必須分擔 SIM 調換詐欺的責任,且電信商在賣 SIM 前必須比對客戶指紋與全國 Aadhaar 資料庫。

所以到底該保護什麼?#

在如此複雜的世界裡,防篡改晶片能增加什麼價值?

  1. 把資訊處理綁定到單一實體代幣。 付費電視訂戶卡能在灰市買賣,但只要它沒被複製,電視台就沒損失多少收入。這也適用於配件控制:印表機廠商希望產品能與任何原廠墨水匣配合,就是不要與便宜的競爭品配合。
  2. 維持價值計數器(如郵資計量)。即使裝置被偷,它能配發之服務的總價值也有限。 在印表機中,墨水匣可以被程式化成只配發一定量的墨水,然後宣告自己乾了。
  3. 減少信任人類操作者的必要。 它們在某些政府系統中的主要目的是「把金鑰材料的街頭價值降到零」。保密電話的密碼點火鑰匙,應該只讓竊賊能冒充其合法擁有者,且只在他能接觸到一台實際裝置時、且只在鑰匙與電話都尚未被報失時。
  4. 保護監控安全開機的實體信任根,從而讓惡意程式難以持久存在。這個任務本身不需要高等級的實體保護;對有能力有動機之軟體攻擊者的安全性才是關鍵。
  5. 控制不可信硬體承包商超產的風險——有時稱為「第三班」問題:你雇的工廠開兩班替你做裝置、再開第三班多做一些拿去灰市賣。這可以靠把部分設計嵌進難以逆向的 FPGA,或靠用 TPM 控制「裝置在你的生態系中運作所需的憑證」來做到。
  6. 控制仿冒電子零件的一些更普遍風險。 這涵蓋了無數罪過,從造成產品早期故障的廉價山寨品,到國家對手的精密供應鏈攻擊。其中最陰險的可能是硬體木馬:一個國安顧慮是,隨著國防系統越來越倚賴海外製造的晶片,晶圓廠可能加入額外電路以利日後攻擊——例如某些額外邏輯讓「以兩個特定輸入做 64 位元乘法」變成一個開關來關閉整個系統。

但要當心:實際所需與所提供的保護性質可能相當微妙,而防篡改裝置往往是有用的元件,而非完整的解方。

通用機制一次又一次失敗;安全不是某種你灑在系統上就能讓壞事不發生的魔法粉塵。你必須弄清楚自己想阻止哪些壞事。

如果你不小心,你可能會發現自己在「它們其實幫助不大」的應用中付錢買智慧卡與密碼模組;而如果你真的很不走運,你可能發現業界遊說出了法律強制或產業標準,逼你使用他們的產品。

小結#

本章講述了硬體防篡改如何經由一連串攻防循環發展的故事。安全處理器通常易受介面(人、感測器或系統)攻擊,但在「我們需要把處理綁定到實體物件、並在任何線上服務都可能斷斷續續的環境中保護安全狀態免於可規模化威脅」的應用中,往往能帶來價值。

研究問題#

  1. 關心做出「更快、更好、更便宜、更安全」的處理器:高階裝置提供的保護,如何被帶到成本不到一美元的晶片上?
  2. 關心推進攻擊技術的前沿:最新的晶片測試技術能如何被用來做出「更快、更好、更便宜、更新穎」的攻擊?