「給我一塊立足之石,我就能撼動世界。」——阿基米德

「任何認為自己的問題能用密碼學解決的人,既不理解他的問題,也不理解密碼學。」——尼德漢與 Lampson 互相歸功於對方的名言

三種傳統,六個案例#

密碼學常被用來建造一個可信元件,讓更複雜的設計能倚賴它。這類設計來自三種相當不同的背景:

  1. 政府系統的世界(第 9 章):其哲學是用資料二極體、多層級安全加密裝置這類機制最小化可信計算基礎
  2. 銀行的世界(第 12 章):智慧卡用作認證代幣,而 HSM 用來保護 PIN 與金鑰。
  3. 1980–90 年代密碼學研究的世界:人們夢想用數學解決社會問題——建立匿名通訊好讓被壓迫的群體能規避國家監控,進而導向抗審查的出版、無法追蹤的數位現金、以及不可能被操縱的電子選舉。

在所有這些案例中,真實生活都比我們預期的更混亂。

本章討論六個密碼工程的例子:全磁碟加密、Signal 協定、Tor、硬體安全模組、飛地與區塊鏈。

頂尖科技公司製造可信電腦的最佳嘗試,產出了有瑕疵的產品;而黑幫似乎創造出了一個能運作的東西——至少目前如此。

全磁碟加密#

全磁碟加密(FDE)背後的想法很簡單:資料寫入磁碟時加密、讀出時解密。金鑰取決於密碼這類初始認證步驟,而它在機器休眠或關機時被遺忘。 所以醫生把筆電忘在火車上時,失去的只有硬體,病歷不會外流。

工程並不簡單,因為你需要一個平台來執行初始認證步驟。 早期產品提供一個額外的加密磁區,但不保護主機作業系統,且能被惡意程式擊敗。

初始認證在其他方面也很棘手。若你從使用者密碼導出磁碟金鑰,竊賊就能離線試無數個,並猜中一般使用者所設定的任何東西。硬體 TPM 晶片能限制密碼猜測,而這自 2007 年起隨 BitLocker 在 Windows 上可用。

把 FDE 整合進平台,讓廠商能為以下事項設計一致的機制:可信開機一份真實的作業系統副本、建立與管理救援金鑰、以及應付與軟體升級、置換空間、裝置維修、使用者資料備份還原、以及裝置出售時原廠重置之間相當複雜的互動。

TrueCrypt、冷開機,以及「打勾式合規」

第三方產品開始提供額外功能:例如 TrueCrypt 提供隱寫式檔案系統——除非使用者知道正確密碼,否則某個磁區的「存在本身」都保持隱藏。

攻擊持續不斷:

  • 2008 年,普林斯頓的 Alex Halderman 等人提出冷開機攻擊,擊敗了當時市面上主要的 FDE 產品,至今對許多機器仍是問題:你把儲存暫態加密金鑰的 DRAM 凍結,然後用輕量作業系統重開機並取得記憶體映像,從中讀出金鑰。
  • 2015 年,他們發現多數 Android 並不安全:原廠重置功能被多數 OEM 做得太差,以致包括 FDE 金鑰在內的憑證能從二手裝置中還原。而多數 Android 手機在停售後就不再收到修補。
  • 2019 年,Meijer 與 van Gastel 發現佔六成市場的三款第三方 FDE 產品都不安全,開源軟體加密反而會更好;而且 BitLocker 在看似偵測到這些硬體產品存在時會自行關閉(拜他們的研究之賜,如今不再如此)。

最後還得考慮「可濫用性」,至少有兩種重要的:

  1. FDE 程式碼的廣泛可得,是近期勒索軟體攻擊浪潮的兩個成分之一:幫派滲透你的系統、安裝 FDE、讓它跑到你已經加密了足夠多的備份而復原變得痛苦,然後為金鑰勒索贖金。(另一個成分是加密貨幣。)
  2. 許多人把 FDE 當成防範被入侵的魔法保險,即使拾獲者可能看過或能猜到密碼,他們也不會通報一台啟用了(或本該啟用)FDE 的筆電被遺落在火車上。

Signal#

隨著智慧手機遍及世界,人們從簡訊轉向 WhatsApp、Telegram、Signal 這類訊息 app;它們更便宜也更靈活。不久它們也開始支援語音與視訊通話,並提供端對端加密。

Signal 是一個免費訊息 app,最初由一位化名 Moxie Marlinspike 的人開發。它為訊息的端對端加密設下了標準,其機制已被包括 WhatsApp 在內的競爭產品採用。

因此 Signal 協定提供:

  • 前向保密(forward secrecy):今天的金鑰洩漏不會暴露任何未來的流量;
  • 後向保密(backward secrecy):也不會暴露先前的流量。

這兩者如今被形式化為「後洩漏安全性(post-compromise security)」。

X3DH 與雙棘輪:Signal 的三大元件

協定有三個主要元件:在 Alice、Bob 與伺服器之間建立金鑰的**擴展三重 Diffie-Hellman(X3DH)協定;在秘密金鑰建立後導出訊息金鑰的棘輪(ratchet)**協定;以及尋找通訊錄中他人 Signal 金鑰的機制。

所以在 X3DH 協定中,每位使用者 U 向伺服器發布一把身分金鑰 IK_U 與一把預金鑰 SK_U,連同一個能用前者驗證的、對後者的簽章。演算法是橢圓曲線 Diffie-Hellman 與橢圓曲線 DSA。

當 Alice 想送訊息給 Bob,她從伺服器取得 Bob 的 IK_B 與 SK_B,產生一把臨時的 Diffie-Hellman 金鑰 EK_A,並以所有可行的方式與 Bob 的金鑰組合DH(IK_A, SPK_B)DH(EK_A, IK_B)DH(EK_A, SPK_B)這些被一起雜湊出一把新金鑰 K_AB。

它使用兩個機制:金鑰導出函數(KDF)(單向雜湊函數)來更新儲存的秘密金鑰,以及進一步的 Diffie-Hellman 金鑰交換

Alice 與 Bob 各自為傳送與接收維持分離的 KDF 鏈,各有一把共享秘密金鑰與一把 Diffie-Hellman 金鑰。每則訊息帶有一個新的 Diffie-Hellman 金鑰部分,被與相關鏈的金鑰組合,而共享秘密金鑰則通過 KDF。

目標是:對手必須持續攻陷 Alice 或 Bob 的手機,才能取得他們之間的流量。

真正棘手的是初始認證#

Apple 的 iMessage 這類系統不只送單一把身分金鑰給對方,而是送一整串裝置金鑰——你的每一台 MacBook、iPhone 與其他 Apple 裝置各一把。

GCHQ 的 Ian Levy 與 Crispin Robinson 提議:用英國《調查權力法案》這類法律強制業者,在他們取得搜索令的任何使用者的金鑰串中,加入一把額外的執法金鑰。

Signal 試圖靠開源來預防這類攻擊,好讓 Alice 與 Bob 更容易看出他們的私人對話是否已被 Charlie 以「無聲的電話會議與會者」或「幽靈使用者」身分加入。若手機 app 軟體仍然不透明,要讓這類監控保持隱蔽會容易得多。

選項與他想從 Bob 銀行帳戶偷錢時差不多:入侵並偷走手機、用 SS7 漏洞竊取 Bob 的簡訊、以及用 SIM 調換攻擊接管 Bob 的號碼。個人最容易發動的攻擊大概是 SIM 調換。

Signal 現在提供一個額外的 PIN,在「於先前有另一支手機啟用過的號碼上恢復服務」時必須輸入。

但國家有精密的入侵工具,也有 SS7 存取權。所以若聯邦安全局在你的威脅模型裡,最好用一支他們不知道號碼的手機,而且別把它和他們知道是你的手機同時開機帶在身上——否則他們可能會關聯這些軌跡。

匿名集與私密聯絡人探索#

所以對吹哨者而言,勝負取決於「除了你之外還有多少人會成為嫌疑人」——也就是匿名集。 如果你是一位資深公務員,想把一項違法政策洩露給報社,而知道這件事的只有十個人,那你可能是這十個人裡唯一用過 Signal 的。

然而如果你是數百名低階嫌疑人之一(例如工會組織者或 NGO 職員),可能列在主題式蒐集的長串目標名單上,那麼你或許會想阻止當地警方系統性地記錄你的聯絡模式——而在這裡,Signal 確實幫得上忙。

訊息 app 解決了可用性問題,做法是要求存取你的通訊錄,在其伺服器上查詢你所有的聯絡人看看誰也是使用者,然後標記他們。

然而把通訊錄複本交給服務公司本身就是一種隱私妥協;而如果你還讓他們保留你的社交圖譜、個人檔案名稱、位置、群組成員身分與誰在傳訊給誰的明文紀錄,調查人員就能靠傳票拿到這一切。

Signal 最初的版本比對通訊錄中電話號碼的雜湊來探索誰在使用它;然而有研究者用 100 個帳號、花 25 天掃過美國全部 5.05 億個電話號碼,找出 250 萬名 Signal 使用者。Signal 現在已實作私密聯絡人探索。

這引發了抗議風暴:使用者以為 Signal 也會保存訊息內容;其他人不認為 PIN 提供足夠保護、不想給 Signal 一組他們拿來做網銀的 PIN、或就是不喜歡任何集中式資料的想法。

人們開始質疑:倚賴一個「首席維護者使用化名、能一時興起就把數百萬使用者當人質、而其資金部分來自政府、部分來自億萬富翁」的安全通訊 app,是否明智。公共利益的關鍵基礎設施,其治理該長成什麼樣子?

Tor#

洋蔥路由器(Tor)是人們用來取得認真線上匿名性的主要系統,2020 年約有 200 萬並行使用者。 它 1998 年始於美國海軍研究實驗室,之所以叫洋蔥路由,是因為其中的訊息像洋蔥的層一樣層層包裹。

想法是把路由與身分分離:任何想把 Alice 連到 Eve 的人,必須顛覆 Bob、Carol 與 Dave,或監看 Bob 與 David 系統進出的流量。

人們在 1990 年代實驗這些,發現要讓它妥善運作還需要三樣東西:第一,你需要不只一個混合器(對手能靠脅迫營運者、或單純關聯進出流量來攻陷單一個);第二,你必須為你想保護的流量做工程(電郵、網頁或訊息);第三,也是最難的,你需要規模。

它現在由 Tor Project(一個美國非營利組織)維護,該組織維護已成為預設 Tor 客戶端的 Tor Browser:它不只處理電路建立與加密,還管理 cookie、JavaScript 與其他危害隱私的瀏覽器功能。

它也能用來連上你能買毒品與惡意程式的地下暗市;能用來洩漏機密文件;能用來造訪兒童性虐待網站。警方也用它造訪這類網站,好讓經營者不知道他們是警察。

Tor 的四個內建弱點

主要弱點從第一天起就已知,並記載在 1998 年那篇把洋蔥路由介紹給世界的論文中——比 Tor 本身早六年。但它們經常被粗心的使用者忽略。

2007 年 9 月,有人架了五個 Tor 出口節點、監看通過的流量,並把有趣的東西發表出來,其中包括若干大使館所用網頁郵件帳號的登入與密碼——包括伊朗、印度、日本與俄羅斯的使團。然而 Tor 文件明確說明出口流量可被讀取;更謹慎的外交官本該使用支援 TLS 加密的郵件服務,就像 Gmail 當時已經支援的那樣。

三、Tor 這類低延遲、高頻寬的系統對流量分析有一些內在暴露。 像 NSA 這樣在網際網路許多點竊聽流量的全域對手,只需竊聽少數幾個交換點,就能取得足以重建電路的樣本。

Tor 從一開始就明確表示它不防護「流量確認攻擊」——對手同時控制入口與出口中繼,並關聯流量的時序、量或其他特徵來辨識特定電路。事實上 2014 年發現有人(大概是情報機關)一直在做這件事,志願提供中繼進系統並竄改協定標頭好讓這更容易。

四、由於 Tor 透過約 6,000 個中繼的池連線,防火牆能直接封鎖它們的 IP 位址。 有些公司與國家(最著名的是中國)就這麼做。為了規避封鎖,志願者提供 Tor 橋接——不列在公開目錄中的 Tor 入口節點。

中國似乎偏好人們用 VPN 來繞過國家防火牆;那不只更能規模化,也更容易在危機時(例如 2020 年新冠疫情初期)完全關閉。

執法機關已數度成功找到並關閉 Tor 洋蔥服務(只能透過 Tor 網路存取的網站)。

其他洋蔥服務有的伺服器被駭、有的供應鏈被追蹤。也有針對 Tor 使用者瀏覽器、使用零時差與沙箱逃逸這類技術的攻擊。而即使沒有技術失敗,匿名本質上就很難:真實世界的交易(乃至真實世界的網頁流量)可能非常髒,所以往往能做出意料之外的推論。

  • 一群工程師,把 Tor 看成一個結構,並相信政治問題能靠做工程來解決;
  • 一群行動者,把它看成一場鬥爭,並委身於反種族主義這類特定政治價值;
  • 第三群人大致維護 Tor 中繼,一般在政治上不可知論,把自己所做的事視為提供基礎設施——「隱私即服務」。

大規模的安全需要基礎設施,而要主要靠志願努力提供這些,需要能在不同利害關係人的議程之間翻譯、並協商價值(而不只是協商合約)的領導者。

HSM 與 API 攻擊#

在銀行與帳務一章,我們描述了銀行如何用 HSM 執行職責分離政策:銀行裡不該有任何單一個人能同時拿到客戶的卡片細節與 PIN。

但把 HSM 做成防篡改還不夠。你還必須確保:當你把一項計算分割在「較可信的元件(如 HSM)」與「較不可信的元件」之間時,攻擊者無法利用這個分割。

每當一台可信電腦與一台較不可信的電腦對話,你必須預期較不可信的裝置會說謊、作弊,並用意料之外的指令組合去探測邊界,以誘騙較可信的那一台。

作者與 Mike Bond、Jolyon Clulow 在 2000 年注意到:HSM 的 API 已變得極其複雜,有數百種不同交易、涉及密碼操作的複雜組合以支援數十種支付協定變體,於是開始系統性地思考:會不會有某一連串 HSM 交易能攻破它?

他們問:「你怎麼能確定沒有某條由 17 個交易構成的鏈會洩漏一把明文金鑰?」在盯著手冊看了一段時間後,他們開始發現大量這類漏洞。

五種 HSM API 攻擊:從互斥或歸零到 EMV

(1)xor-to-null-key 攻擊。

HSM 中的加密工作金鑰有一套依功能分類的型別系統。ATM 的終端主金鑰採雙人控制,所以銀行為兩位 ATM 保管人(例如分行經理與會計)產生分開的金鑰元件。

HSM 有一個交易能產生金鑰元件並印在附掛的安全印表機上,同時把加密值回傳給呼叫程式;另有一個交易能組合兩個元件產生終端主金鑰——給定兩把加密金鑰,它會解密、互斥或、然後把結果以「標記為不可匯出工作金鑰」的方式回傳。

攻擊是把一把金鑰與它自己組合,得到一把已知金鑰——全零金鑰——而且被標記為不可匯出工作金鑰。 由於還有另一個交易能用任一把不可匯出工作金鑰加密另一把,你就大功告成了:你能用你的全零金鑰加密「皇冠上的寶石」——PIN 導出金鑰——把它萃取出來,然後算出任何客戶帳戶的 PIN。HSM 被擊敗了。

事實上,HSM 只是隨著 1980 年代 ATM 網路的引入,從更早、更簡單的設計演化而來,而銀行要求了大量額外功能好讓異質網路能互通。

(2)向下相容與時間-記憶體取捨攻擊(對 IBM 4758)。

隨著 DES 在 1980 年代變得易受金鑰搜尋攻擊,銀行開始遷移到雙金鑰三重 DES:每個區塊用左金鑰加密、用右金鑰解密、再用左金鑰加密一次。這個聰明的點子帶來向下相容:若你把左金鑰設成等於右金鑰,加密就退回單重 DES。

4758 分開儲存左金鑰與右金鑰、以不同方式加密它們、給它們不同型別——但未能把三重 DES 金鑰的兩半綁在一起。 你可以拿一把單重 DES 金鑰的「左半」加上另一把的「右半」,拼成一把真正的三重 DES 金鑰,然後用它匯出其他金鑰。

所以攻破 4758 只需要一次單重 DES 金鑰搜尋。

假設你想要某特定型別的單重 DES 金鑰:你預先算好(比方說)2^40 把金鑰及其雜湊的表。你讓 HSM 產生該型別的金鑰並輸出雜湊,直到你看到一個已在表中的雜湊。這大約要 2^16 次雜湊,花一小時左右。

(3)差分協定攻擊。

回想 IBM(與業界多數)產生 PIN 的方法:主帳號用 PIN 驗證金鑰加密,得到 16 個十六進位數字;前四個被轉成十進位。HSM 廠商把這個操作參數化,做了一張「十進位化表」,預設是 0123456789012345(就是把十六進位輸出取模 10)。這是個大錯。

如果我們把十進位化表設成全零(0000000000000000),HSM 就會回傳 PIN「0000」(雖然是加密形式)。 我們接著用表 1000000000000000 重複這次呼叫。若加密結果改變了,我們就知道 DES 輸出的前四位數中含有一個 0。給定幾十次查詢,PIN 就能被推導出來。

「比較同一協定重複但略經修改之執行」的攻擊,我們稱為差分協定分析。

唯一真正的解法是多付錢給 HSM 廠商,買一台把你自己銀行的十進位化表寫死進去的機器。

(4)EMV 攻擊。

EMVCo 為支援「智慧卡與銀行 HSM 之間的安全訊息傳遞」而下令的一項 HSM 功能,在所有符合 EMV 的 HSM 中引入了一個可利用的漏洞。

EMVCo 定義了一個交易 Secure Messaging For Keys,讓伺服器能命令 HSM 加密一段文字訊息,其後接著一把可與銀行智慧卡分享之型別的金鑰。加密可以是 CBC 或 ECB 模式,而文字訊息長度可變。

攻擊是選擇訊息長度,好讓目標金鑰恰好只有一個位元組跨過加密區塊的邊界。 那個位元組接著能靠「送出一連串長一位元組的訊息、讓額外那個位元組循環走過全部 256 個可能值」來確定,直到找到該金鑰位元組。

(5)攻擊 CA 與雲端中的 HSM。

他們拿到 HSM 的軟體開發套件(其中含有該裝置的模擬器),對它做模糊測試直到找到若干漏洞。他們設法修補了認證函數,好讓自己能以管理員身分登入 HSM 並安裝讀出金鑰的工具。

這只是「精密的密碼學被草率的軟體工程致命地削弱」的眾多例子之一。

銀行仍必須為符合 PCI 規則而使用 HSM,但其中的密碼金鑰並非只靠篡改回應外殼保護。組態管理必須嚴密、廠商軟體修補必須及時套用,就像其他系統一樣。

但雖然任何規模的銀行多半有懂軟體安全與修補生命週期的人,他們卻較不可能有認真的 HSM 專業。

飛地#

飛地(enclave)像 HSM,都想提供一個平台,讓你能在一台由你不完全信任的人所營運的機器上安全地做一些計算。

TrustZone#

主要應用是手機:廠商想要機制保護基頻不被使用者竄改(基於法規理由),並讓手機本身能被鎖住(好讓補貼手機的電信商能把它綁在合約上)。在這兩種情況下,硬體攻擊都不是真正的顧慮。

直到 2015 年它都是封閉系統,你只能執行由 OEM 簽章過的程式碼。 所以想要「更安全」認證元件的銀行 app 開發者,得為三星手機找三星簽、為華為產品找華為簽,依此類推。更甚者,程式碼還會因產品所用的系統單晶片不同而不同。

要讓一個 app 在夠多版本的 Android 上穩健執行本來就夠難了,還得應付跑在不同 SoC 上的多個客製版 TrustZone。而要評估廠商對封閉平台所做的安全宣稱也很困難。

SGX#

2015 年 Intel 推出 SGX,其飛地瞄準一個更有企圖心的使用情境:雲端運算。

在 AWS、Azure、Google 這類服務上跑系統變得更便宜:虛擬化讓資源能被有效分享,所以資料中心、系統管理員等成本能攤在數千位客戶身上。但這帶來許多問題:

  • 你怎麼確定敏感資料不會洩漏給雲端服務的其他租戶(例如透過對超管軟體的技術利用)?這類產品每年都有數十個 bug 被修補。
  • 而面對一個用搜索令取得你資料的國家——實質上是對超管的「法律利用」——你有什麼保護?雲端服務商自己也渴望有一個技術機制能省去他們處理這類搜索令的麻煩。

由於這些顧慮,SGX 的安全周界就是晶片本身的邊界。程式碼與資料在離開晶片時加密、在被匯入快取時解密。CPU 的硬體同時保護機密性與完整性。

SGX 飛地以應用程式身分在 ring 3 執行,而 CPU 的機制把其程式碼與資料與底下的一切隔離——包括作業系統與超管。

SGX 的金鑰供應鏈,以及它的風險

每顆晶片有熔絲,晶圓廠在其中燒入一個封印秘密與一個佈建秘密,前者 Intel 不知道、後者知道。這被用來產生主導出金鑰(MDK),後者再跨電源循環可靠地產生金鑰材料。

這些金鑰讓 CPU 能向 Intel 證明自己的真實性,而 Intel 供給它一把證明金鑰——Intel 增強隱私 ID(EPID)中的一把成員私鑰,那是一個意在保護簽署者匿名性的群簽章方案。

原本所有 SGX 程式碼都必須由 Intel 簽章,但近期版本允許第三方簽章的程式碼。每位飛地作者現在都是一個 CA,為每個飛地簽發憑證,飛地有公鑰、產品 ID 與版本號(秘密只允許遷移到較高的版本號,以支援修補但不支援回滾)。

這在 2019 年就發生在 AMD 的 SGX 等價物上,一個微碼 bug 讓這樣一把金鑰能被萃取出來。Intel 也以同樣方式脆弱:給定 MDK 的明文值,你就能在 SGX 的保護機制之外建立一個 SGX 飛地。

若這樣的破解被發現,Intel 就必須把同一 EPID 群組中所有 CPU 列入黑名單。而我們完全不知道這些群組有多大,因為所有證明都由 Intel 不透明地完成,使用者只能信任結果。

現在有一些 SGX 系統在做真正的工作。

目標是讓 Signal 客戶端能判定其通訊錄中的聯絡人是否也是 Signal 使用者,而不向 Signal 服務揭露其通訊錄。你要如何建立一個龐大的社交圖譜,卻對它毫無洞察?

想法是客戶端能聯絡飛地、驗證它正在執行正確的軟體,然後把聯絡人送進去看誰也是使用者。 然而要在 SGX 飛地的記憶體上限(128MB)內做到這件事,需要對使用者電話號碼倒排檔的雜湊表做仔細的組織。

簡言之,封鎖側通道很像組織密碼程式碼以固定時間執行:繁瑣、臨機應變、手工,而且容易出錯。

SGX 也很慢:記憶體加密本身增加的開銷不多,但脈絡切換是致命傷。 比對聯絡人真的很慢,所以流程必須為多位加入者做批次處理才能被接受。

而且即使你完全信任 Intel;即使你相信 NSA 不會用 FISA 搜索令強迫 Intel 對一個處於除錯模式的飛地做證明;即使你不擔心 MDK 被攻陷或側通道被利用——仍然有應用層暴露的風險,就像 HSM 一樣。

如果你把飛地程式碼寫成能被較不可信的程式碼當成神諭來用,你就麻煩了。

區塊鏈#

2008 年,一位化名中本聰的人悄悄發布了 Bitcoin,附上一份白皮書與一份實作。 這套匿名數位現金系統最初在 cypherpunks 郵件論壇的業餘愛好者與行動者之間流通,但兩年內就爆紅。

絲路迅速成為郵購管制藥物的市場,在 FBI 於 2013 年 10 月逮捕 Ulbricht 之前,超過十億美元的交易通過它。

絲路交易期間,價格已從約一美元漲到一百多美元。進一步的交易需求來自想把錢弄出外匯管制國家的人,這又引來把 Bitcoin 視為危機時該買之資產(像黃金)的投資需求。到 2017 年我們有了泡沫——價格陡升穿過一千美元大關,在 2017 年 12 月達到將近兩萬美元的高峰。

除了寫軟體的人之外沒有可信方,參與者也沒有預設的身分。這些機制提供了一種在分散式系統中達成共識的新方式,與第 7 章討論的拜占庭容錯機制截然不同。

Bitcoin 的十個基本機制
  1. Bitcoin 區塊鏈是一個只能附加的檔案,內含一系列交易。
  2. 使用者以「位址」出現在區塊鏈上——那是公鑰雜湊構成的化名。
  3. 多數交易把貨幣從一個位址轉到另一個,做法是取用先前交易的一筆**未花費交易輸出(UTXO)**並轉給一或多個位址。這類交易必須由對應該 UTXO 位址的私鑰簽章。
  4. 要付款,你簽署一筆交易並經由點對點網路廣播給其他使用者。 其他使用者可自由選取一組被請求的交易、檢查其有效性,並把它們挖進區塊鏈的一個新區塊。
  5. 每個交易區塊由礦工用「區塊內容加一個隨機鹽」的 SHA256 雜湊來認證。 礦工試不同的鹽,直到雜湊輸出有足夠多的前導零,讓它成為一個夠難的謎題。這樣的雜湊構成「工作量證明」,而找到它們是隨機過程,所以很難預測哪個礦工會找到下一個。難度被自動調整,好讓新區塊約每十分鐘被挖出一個。
  6. 礦工為挖出的每個區塊獲得「區塊獎勵」。 這每 210,000 個區塊減半;作者 2020 年 5 月寫這本書時,它從每區塊 12.5 個比特幣減半為 6.25 個。
  7. 礦工也拿交易費,也就是每筆交易輸入超過輸出的金額。使用者出價交易費以取得優先權;通常是幾十美分,但在壅塞時可能升到數十美元。
  8. 若挖出兩個競爭的下一個區塊,衝突就由「礦工挖最長鏈」的規則解決。 因此交易在再挖出約六個區塊之前並不真的算最終確定——經典 Bitcoin 約需一小時。即使如此,礦工的多數方仍可能靠建構一條伸得更遠的鏈來改寫歷史,也就是所謂的「鏈重組」。
  9. 若衝突未被解決,你可能得到一個「分叉」——系統孵出兩個不相容的後繼者。Bitcoin 在 2017 年因區塊長度的政策爭議分裂成 Bitcoin 與 Bitcoin Cash,而分叉前持有比特幣的使用者最後在兩邊都持有比特幣。
  10. 交易也能含有腳本,讓付款可程式化。

一個常見的模式是:優雅的密碼學想法被草率的軟體工程、缺乏系統思考、以及對使用者近乎全然的漠視所辜負。

錢包#

系統中沒有內建的「帳戶」概念,你「擁有」Bitcoin 就是知道一把能解鎖一或多筆 UTXO 的私鑰。

所謂的「腦錢包」從使用者選的通行詞產生私鑰,被攻擊者用「對區塊鏈上可見公鑰做窮舉搜尋」的方式攻破;用可猜密碼的腦錢包典型在 24 小時內就被清空。

即使如此,已知有幾百萬美元 Bitcoin 的人在家中被持械搶匪脅迫轉帳的事也不是沒有。若你獨自實體保管一個 Bitcoin 錢包,你就跟數世紀前把積蓄放在金幣裡的人一樣脆弱。

到 2013 年,出現了由交易所或其他線上服務商替你打理一切的「託管錢包」。那並沒有真正解決搶劫問題(搶匪只會逼你登入付錢給他),但託管錢包導致了廣泛的其他詐欺與濫用。

礦工#

礦工在電力天然便宜的地方營運(如冰島與魁北克),但多數在俄羅斯或中國這類他們能與地方官員打交道的地方。

2019 年加密貨幣挖礦的總能源消耗約 75 TWh,二氧化碳排放超過 3,500 萬噸——與紐西蘭的碳足跡相當。以 2020 年而言,每一筆比特幣交易消耗超過半 MWh、排放超過四分之一噸的二氧化碳。

區塊鏈的全部重點就是靠建立一個防篡改、公開、只能附加的交易日誌來防止重複支付;但若礦工的多數方串謀,他們就能改寫歷史、把幣花好幾次。

早期人們以為這類攻擊會立刻對貨幣的可信度致命,但現實更複雜。 例如 2019 年 1 月,攻擊者用這項技術從市值超過五億美元的 Ethereum Classic 偷走超過一百萬美元,鏈重組長達數十個區塊。然而其市場價值並未顯著受影響。

若他們偷走大部分,價格就會崩盤、贓物就會一文不值。 2020 年 8 月又有兩起攻擊,其中一起攻擊者花了 19.2 萬美元買下所需算力,偷走 560 萬美元。

所以我們在推理區塊鏈時,必須連同賽局理論一起仔細思考,而不只是密碼學;簡化的論證未必符合現實。

智慧合約#

Bitcoin 的腳本語言很簡單,但後來的 Ethereum 有一個圖靈完備的 VM,其位元組碼通常由一個叫 Solidity 的語言編譯而來。Ethereum 已成為市值第二的加密貨幣,因為它擘畫出「機器能自動執行複雜交易之智慧合約」的前景。

泡沫期間,許多新創談論用智慧合約驅動物聯網、並創造分散式儲存這類新服務。「分散式自主組織」的想法在泡沫期間被大力推廣。

這與「再去中心化」運動相連,該運動尋求把線上世界從 2000 年代主宰它的大型服務公司手中移開;而雖然我們有分散靜態唯讀內容的好工具,我們卻缺乏一個好方法來分散「交易」。

現在出現了套利機器人,靠搶跑(frontrunning)交易來利用去中心化交易所的低效率。這些機器人把交易費(Ethereum 稱為 gas)競標上去;已經有數以百計的「優先 gas 拍賣」。

機器人理論上可能在能募到足夠資金時接管一個市場的治理並洗劫它;它們已經靠利用智慧合約中的 bug 賺取巨額利潤。

另一種看法是:如果合約就是「接受程式碼的輸出」,那麼瑕疵就在使用者對程式碼作為的理解上;那樣的話根本沒人偷東西!

曾有提案要用智慧合約支付「必須請假照顧生病孩子」的父母,那有複雜的法律規則、職員常漏掉、導致上訴。想法是把案件文件的雜湊放上 Ethereum 區塊鏈,好讓父母與上訴委員會都能追蹤,希望自動執行決定能減少官僚拖延。

但內部人、駭客與錯誤怎麼辦?地方政府常被駭、最後付勒索軟體贖金。而法律變更或發現 bug 時,誰來更新合約?區塊鏈設計上是不可變的,所以無法打補丁。

但真正的破局點是地方政府害怕失去對流程的控制。 另外兩個議題是:人們常常得彎折規則才能把事情辦成;以及程式設計師在 Solidity 這種不熟悉的語言中,比在 Python 甚至 Cobol 這種熟悉的語言中更可能寫出 bug。

鏈下支付機制:閃電網路與側鏈

一筆標準 Bitcoin 交易可能要六個區塊(一小時)才最終確定,壅塞時更久。 這對付贖金或線上買毒品或許夠快,但與 EMV 相比並不出色。更甚者,Bitcoin 每秒約 5 筆交易的吞吐量,遠遠比不上 Visa 的五萬。

Alice 與 Bob 靠在第一層區塊鏈上鎖定幣來開啟一條通道,此後就能在彼此之間快速交易。 關鍵想法是他們用雜湊時間鎖合約(HTLC)(由兩筆條件式轉帳構成)向彼此承諾一些加密貨幣:Bob 送給 Alice h(R)(R 是一個隨機數),而 Alice 用區塊鏈的腳本語言做出承諾,大意是「若你在時刻 t 之前給我看 R,我就給你這枚幣」。Bob 做出類似的承諾。

你需要爭議解決機制,以防 Alice 與 Bob 對各自該拿多少有歧見。接著你要建立讓 Alice 能透過 Bob 付給 Charlie 的機制,以及路由演算法好讓你能把錢送給任何人。

理論上這能是點對點的,但實務上這類系統似乎會自組織成樞紐,帶著永遠開著的通道——像一個銀行網路。

成本包括:中間節點需要有足夠流動性來轉發交易;以及所有活躍參與者都必須在線——其意涵從熱錢包的失竊風險,到礦工在 Bob 廣播 R 時搶跑的風險,再到網路故障後大規模崩潰的風險。

2020 年這類系統的領頭羊是閃電網路(Lightning),它讓付款在數秒內最終確定、讓有正確 app 的人能像微信支付一樣掃 QR code 付款,如今每天處理一千筆交易。

交易所、加密犯罪與監理#

2011 年的領頭羊是日本的 Mt Gox,它撐過了 2011 年的一次入侵,但在 2014 年宣稱被駭走 4.6 億美元後倒閉。當時的新聞報導稱其內部控制與軟體開發流程一片混亂。

它不再把客戶的比特幣放在分開的錢包裡,而是開始把所有 Bitcoin 放在自己的錢包中,只在客戶造訪其網站時顯示一個名目帳戶餘額。

它完成了十八世紀金融中「從金商變成銀行」的轉變:客戶不再擁有金庫中某一特定袋的金幣,而只是對銀行全部資產有一項請求權。

受害者描述:在他們的錢包被託管後,他們開始看到自己並未授權的轉出交易。Mt Gox 倒閉後的分析顯示,這些交易許多甚至沒有出現在區塊鏈上。 從 2013 年年中起,你向他們買一枚比特幣時,他們所做的只是給你看一個「你的餘額是一枚比特幣」的網頁。(而許多交易所至今仍是這樣運作的。)

一份分析報告的結論是:交易所在 2018 年被駭客搞丟了約十億美元,多數竊案由兩個犯罪集團所為,其中一個後來被連結到北韓。此外,買賣毒品與其他非法商品的地下市場周轉額為六億美元,約是 2017 年的兩倍。

還有市場操縱:有證據顯示 Bitcoin 的價格在 2017 年榮景期間,受到涉及 Tether(一種釘住美元的數位貨幣)的內線交易支撐,這帶來一個可能性:許多加密貨幣的市價往往可能是不法操縱的結果。

加密貨幣如何改變其他犯罪類型,以及監理機關的回應
  • 迄今最大的單一加密貨幣騙局,看來是一個叫 PlusToken 的龐氏騙局,在組織者 2019 年被捕前從中國公民身上撈了約 30 億美元。
  • 勒索軟體在 2001 至 2015 年間從每年約兩三百萬美元漲到大概每年八百萬,因為 Bitcoin 突然讓贖金變得容易收取。
  • 到 2018 年,為網路罪犯提供服務的「防彈託管」站點正轉向加密貨幣,因為其他支付機制變得更困難。
  • 同年,全球最大的暗網兒童色情網站「Welcome to Video」在其經營者被靠區塊鏈上的 Bitcoin 流向追查出來後被關閉,所以加密貨幣的化名性質有其極限。
  • 總計,詐騙與其他濫用直接加起來約占加密貨幣交易量的 3%。

Bitcoin 使用者試過各種把戲讓交易更匿名,例如把付款拆成許多小筆、混在一起、再重組——也就是所謂的「滾筒(tumbler)」或「混幣器(mixer)」。然而你若那麼做,就用「嘗試洗錢」污染了你的比特幣;而總計大概有 10% 的 Bitcoin 至少曾被偷過一次、或至少通過洗錢服務一次。

也有用進一步密碼技術提供更多隱私的加密貨幣,尤其是 Zcash 與 Monero。目前 Monero 提供最強的隱私,且設計成幣能用軟體挖出——其超過 4% 的幣是由跑在別人機器上的惡意程式挖出來的。

各國政府一直試圖用金融監理反擊。

有些政府走得更遠:例如德國監理機關 BaFin 用既有金融法規堅持所有交易所都要取得執照;由於讓個人以現金互相買賣加密貨幣的點對點交易所 localbitcoins.com 沒去申請,它在德國被封鎖。

但撰稿時最大的推力來自 FinCEN 2019 年的一份諮詢意見,它要求加密貨幣交易所實施「旅行規則」:任何處理超過一萬美元交易的人,都必須辨識寄送方與接收方,並在相關時提交可疑活動報告。

當一位英國或美國使用者把 Bitcoin 送給另一位時,交易很有可能根本沒靠近區塊鏈:如果兩人都是 Coinbase 客戶,Coinbase 只要調整他們比特幣錢包網頁上顯示的餘額就行了。

這立刻引出一個問題:為什麼這些交易所不像其他任何貨幣服務業一樣受監理?

交易所主張,由於交易需求遠小於投資需求,虛擬貨幣應被視為資產而非支付機制。但那樣的話,監理機關為什麼不要求交易所在與券商相同的規則下營運——好讓客戶的比特幣不能被拿去做交易,而只能賣回市場、款項匯入當初購買所用的銀行帳戶?

作者與同事也建議適用《支付服務指令》,那會給交易所客戶與銀行相當的消費者保護。 值得注意的是:雖然銀行對「如何封鎖對客戶手機的 SIM 調換攻擊」表現出很大興趣,多數加密貨幣交易所卻毫無興趣——儘管交易所憑證正是 SIM 調換集團的主要目標之一。

許可制區塊鏈#

這導向了 Hyperledger 與企業以太坊聯盟這類倡議,其中許多涉及一種許可制區塊鏈結構,基於拜占庭容錯而非工作量證明,仍能支援智慧合約。

  • 對絕大多數應用而言,你不需要區塊鏈;一個前向安全的封印日誌就夠了。
  • 而在區塊鏈可能有幫助的地方,你也不能用公開的那種。
  • 最重要的是,區塊鏈 app 必須與遺留系統對話,而且不能比別的更容易造成應用安全錯誤或可用性隱患。

搞砸的例子已經夠多了:阿根廷把官方公報放上區塊鏈並宣告其具法律效力,結果有人把它駭掉、發布關於新冠病毒的假新聞。

失敗的密碼夢:區塊鏈選舉#

宣稱使用區塊鏈的選舉系統已在俄羅斯與美國部署,結果並不令人印象深刻:

  • 2018 年莫斯科三個選區的系統用 Ethereum 區塊鏈計票,但「計票」與「區塊鏈」之間的連結在選前不久兩個密碼漏洞被修補時就斷了——而區塊鏈在選後隨即消失。
  • 同樣在 2018 年,西維吉尼亞成為第一個允許部分選民用手機 app 投票的美國州。 MIT 研究者逆向工程了它,發現若干能讓攻擊者暴露或竄改選票的漏洞——儘管該 app 用了區塊鏈,而那與這些攻擊毫不相干。 依研究者所說,攻擊者能製造出被污染的紙本軌跡,讓可靠的稽核變得不可能——儘管區塊鏈的賣點包括透明與問責。

你不能用這項技術修好選舉,因為它根本沒處理選舉是怎麼被偷走的。 執政黨不斷改變規則、並在技術堆疊的所有層次上顛覆技術:從選民登記,經競選資金與廣告規則,到媒體審查、選民恫嚇、以及能被操縱的投票制度。

小結#

從 1980 年代起,許多人試圖把密碼學當作「系統安全某個面向」的可信平台。

一個世代之後,帶著對全球化技術之效應的懷疑浪潮,或許是該盤點的時候了。

這些案例研究教了我們一個技術的、一個經濟的、與一個政策的重點。

  • 即使最簡單的應用(如 FDE),在成熟為產品後也會變複雜,且實作品質差異極大。
  • HSM 是另一個「取得越來越多功能,直到功能把它們弄壞」的密碼系統例子,如今還需要其他元件來封鎖針對性攻擊。
  • SGX 跑在複雜到易受多重側通道攻擊的處理器上,而 Intel 甚至不認為其中某些在其威脅模型內:若一個有能力有動機的對手能在與你同一台機器上跑他的程式碼,你基本上就完蛋了。
  • 區塊鏈也差不多,它發展出了所有系統中最複雜的生態系。 連「理性礦工沒有動機改寫歷史」這個基本假設,在應用製造出必要誘因時都開始失效。

HSM 比伺服器貴。SGX 有記憶體上限,且在脈絡切換上有真實的效能開銷。Bitcoin 礦工排放的二氧化碳與紐西蘭一樣多。智慧合約也許能做些聰明的事,但實務上在大小與範圍上都比其他軟體受限得多。

「這個成本值不值得」是一筆精細的計算;而隨著維護成本累積、系統陷入技術債,這筆計算隨時間可能變得更不利。

若它們成功了,它們似乎會把「滿足某項法規的欲望」或「規避法規的欲望」納入其核心目的。所以部署或維護它們的決定,可能涉及微妙的外部性。

  • 硬體安全模組在卡片支付系統中是強制的,因為卡片組織規則最終源於銀行「不想為詐欺負責」的欲望。
  • SGX 被視為向雲端運算客戶保證「其最有價值資產受保護,不受流氓系統管理員與情報機關侵害」的方式。
  • Bitcoin 與其眾多複製品已成為規避一切(從證券法、支付法到反洗錢法規)的機制。

真實系統是為策略理由而建的,而那往往意味著為其創造者建立或鞏固權力——不論是市場權力還是政治權力。

雖然法律應該捍衛私人公司與個人創造優惠券、哩程這類價值代幣的權利,但一旦這些開始被當作貨幣使用、而行為像銀行的機構出現,立法者把它們當作銀行對待就是合理的。

若要總結四十年來「試圖用數學的魔法解決真實世界問題」的經驗,那大概會是 TANSTAAFL:天下沒有白吃的午餐。

研究問題#

去中心化的協定傾向化石化:我們仍在用 1990 年代初的電郵、DNS 與 BGP 機制,因為要改任何東西都很困難。端對端加密無法疊在 SMTP 電郵之上(儘管 PGP 努力過),而必須等一個能靠命令強制它的新平台,例如 Signal。

Bitcoin 提供另一個例子。 原本的 cypherpunks 理想是一個完全去中心化、不需政府或銀行這類主宰玩家介入的支付系統。然而礦機的生產已成為由 Bitmain 控制的獨占,而 ASIC 全來自台積電。絕大多數 Bitcoin 使用者倚賴託管型交易所持有其加密貨幣,而這些交易所做了大部分的交易。託管型交易所實質上已成為不受監理的銀行。

在 Tor 那是一個社群;而在加密貨幣的世界,則有為利潤工作的競爭開發團隊。可以預期安全經濟學會比密碼學更重要,而我們已經看到智慧合約如何能製造出「可能打破底層共識層」的應用層誘因。

電腦科學對 API 安全問題的取徑,是試圖改造形式方法工具來證明介面是安全的。這方面的文獻在成長,甚至有一系列工作坊,但這些方法仍只能處理相當簡單的 API。

智慧合約遇上了類似的問題,而且被「難以更改它們以修 bug 或回應變化中的情況」所複雜化。 難怪許多用來架設去中心化交易所的智慧合約,都寫死了管理員金鑰,好在必要時能人工介入。這只是審慎的工程,卻讓「這類交易所是免信任的」這個意識形態正當化受到質疑。