簡訊雙因素驗證已經保護不了任何東西:該改用什麼

NIST 已把簡訊驗證碼列為受限驗證器。SIM 卡挾持、SS7 協定漏洞、即時網釣,以及究竟該用什麼取代簡訊雙因素驗證。

|

閱讀時間:2 分鐘

簡訊雙因素驗證已經保護不了任何東西:該改用什麼

2024 年 1 月 9 日,美國金融市場主管機關證券交易委員會(SEC)的官方 X 帳號發布消息,宣布核准比特幣現貨 ETF,這是市場已經等了好幾個月的決定。短短幾分鐘內,比特幣每枚上漲超過 1000 美元。隨後 SEC 出面否認:帳號遭到入侵。幣價回跌超過 2000 美元。

這起事件真正值得細看的,不是市場波動的幅度,而是所用手法之平凡。根據美國司法部的新聞稿,26 歲的 Eric Council Jr. 以一台可攜式證卡印表機印出偽造身分證件,走進一家 AT&T 門市,說服店員把與該帳號綁定的電話號碼轉到他掌控的 SIM 卡上。接著他透過簡訊收到密碼重設驗證碼,並轉交給共犯。2025 年 5 月 16 日,他被判處 14 個月有期徒刑。

有一點必須說明清楚,它會改變這起案件的讀法,卻不會削弱其教訓。根據 SEC 的官方聲明,該帳號的多因素驗證早在 2023 年 7 月就依團隊自身要求關閉。也就是說,案發當時簡訊並非第二因素,而是帳號救援管道。而這正是這個例子有用的地方:無論是第二因素或後門,電話號碼始終是整條鏈條斷裂的那一環。

第二因素本該保證什麼

原理一句話就能講完。單獨的密碼是你知道的東西;在此之上加上你擁有的東西(一支手機、一把實體金鑰)或你本身是什麼(一枚指紋)。從資料外洩中偷走你密碼的人,並不因此就握有你的實體物件。

這套推理建立在一個很少被明講的假設上:第二因素確實與你手上的某個物件綁定,而且出示它能證明一些關於你正在何處登入的資訊。簡訊在這兩點上都站不住腳。

簡訊不是持有因素

透過簡訊收到驗證碼,並不能證明你持有某台裝置,只能證明一個由電信業者配發、而且可以被同一業者變更的電話號碼指向某台終端。這不是同一回事。有三條攻擊路徑利用了這個落差,而它們的修補方式各不相同。

SIM 卡挾持

這就是 SEC 案件中的攻擊手法,它不倚賴任何技術漏洞。攻擊者蒐集目標的個人資訊,這些資訊往往已能從公開的外洩資料中取得,然後冒充目標聯絡電信業者:手機遺失,請把號碼轉到新的 SIM 卡。只要他夠有說服力,或有內部員工配合,號碼就易主了,所有簡訊都會送到他手上。美國聯邦調查局申訴中心 IC3 的 2024 年度報告光是這一年就記錄了 982 起 SIM 卡挾持通報與將近 2600 萬美元的申報損失,而且只計入實際報案的被害人。任何軟體更新都補不了這條路徑:它針對的不是軟體,而是一套由人執行的商業流程。

SS7 攔截

Signaling System 7 是讓全世界電話網路彼此對話的協定:接續一通來電、處理漫遊、把簡訊從一家業者送到另一家。它設計於 1975 年,當時業者圈子封閉、人數不多,彼此在設計上就預設對方值得信任。因此它在網路之間沒有任何原生的身分驗證:一個看起來合法的請求就會被當成合法請求處理。

這並非理論上的弱點。2014 年 12 月,德國研究者 Tobias Engel 與 Karsten Nohl 在混沌通訊大會上公開示範了這一點:僅憑一個電話號碼就能定位用戶並攔截其簡訊。2017 年,真實的利用獲得證實:德國業者 O2-Telefónica 承認有客戶的銀行帳戶遭到掏空,攻擊者先取得某家境外業者網路的存取權限,再設定簡訊轉發以攔截銀行確認碼。

即時網釣

第三條路徑最為關鍵,因為它不倚賴任何電信漏洞,前兩條裡能修補的一切它都撐得過去。

一個偽造網站完美複製某項服務的登入頁面。你在上面輸入帳號與密碼,偽站立刻轉送給真站,真站隨即發送簡訊到你的手機。簡訊確實送到你手上,而且是真的。你把驗證碼輸入偽站,偽站又在幾秒內把它轉送出去。工作階段開啟了,而握住它的是攻擊者。

這被稱為中間對手(adversary-in-the-middle)攻擊。它已經產業化:像 2017 年出現的反向代理工具 Evilginx,或以月費訂閱販售的成套工具,讓它不需要任何特殊技能就能上手。而且被偷走的不只是驗證碼,還有工作階段 Cookie,憑它此後就能維持登入狀態,不必再經過任何驗證。

問題出在架構。簡訊送出的驗證碼不帶任何關於是哪個網站發出請求的資訊。因此它無從分辨真偽:輸入到哪裡,它在哪裡就有效。

這已經不是意見,而是官方立場

反對簡訊最有力的論據,並非來自方案供應商,而是來自撰寫標準的機構。

2025 年 7 月,美國 NIST 發布了 SP 800-63B-4《數位身分指引:身分驗證與驗證器管理》的最終版。文件明確設立了受限驗證器這一類別,專門保留給那些抵抗能力已隨威脅演進而衰退的機制。第 3.1.3.3 節把公眾交換電話網路的使用歸入其中,也就是透過簡訊或語音來電發送的驗證碼:「Use of the PSTN for out-of-band verification is restricted as described in this section and SHALL satisfy the requirements of Sec. 3.2.9.」具體來說,仍在使用它的服務必須提供一種不受限的替代方案、明確告知使用者風險,並備妥遷移計畫。

在此之前,2024 年 12 月,美國網路安全機構 CISA 發布了《行動通訊最佳實務指引》,起因是「鹽颱風」(Salt Typhoon)間諜行動,與中國政府相關的行為者在該行動中滲透了多家美國電信業者。措辭沒有留下任何詮釋空間:「Do not use SMS as a second factor for authentication. SMS messages are not encrypted」,接著又直白地寫道:「Only FIDO authentication is phishing-resistant.」文件明確建議採用 FIDO 硬體金鑰,並點名 Yubico 與 Google Titan,同時指出啟用 FIDO 之後必須關閉簡訊,否則它會作為可被利用的退路繼續存在。

驗證器應用程式:真實的進步,但只是部分解答

TOTP 應用程式,全名 Time-based One-Time Password,會產生每三十秒變換一次的六位數驗證碼,由啟用時共享的祕密與當下時間在本機運算得出。沒有任何內容經過電話網路。

好處立即可見:號碼不再參與其中,SIM 卡挾持因此失效;沒有任何訊息被傳送,SS7 攔截同樣失效。對任何無法再往前一步的帳號來說,改用驗證器應用程式都值得去做。

但第三條路徑原封不動。輸入在偽站上的 TOTP 驗證碼,會像簡訊驗證碼一樣被轉送到真站。應用程式並不知道你在哪裡登入:它顯示一個數字,而這個數字在三十秒的時窗內對任何出示它的人都有效。CISA 的說法完全一致:驗證器驗證碼優於簡訊,但仍然容易受到網釣攻擊。

TOTP 是一個誠實的中繼站,而不是終點。

為什麼 FIDO2 金鑰改變的是問題的本質

FIDO2/WebAuthn 硬體金鑰並非只是讓攻擊變難,而是取消了攻擊在機制上的可能性。

在某項服務註冊時,金鑰會產生一對專屬於該服務的加密金鑰。公鑰部分交給服務方,私鑰部分永遠不離開晶片,既不可匯出也不可讀取。沒有可被複製的共享祕密,也沒有可被攔截的六位數驗證碼。

接著是決定性的機制:來源綁定。登入時,瀏覽器把目前頁面的真實網域名稱傳給金鑰。這項資訊被納入待簽署的資料中,並由瀏覽器強制執行:頁面上的 JavaScript 既不能修改它,也無法偽造它。

FIDO2 金鑰不是讓網釣更難得手,而是讓網釣的成果無法使用。

我們再看一次中間對手攻擊,這次加上一把金鑰。偽站做得天衣無縫,被害人毫無察覺,觸碰了金鑰。瀏覽器傳去頁面的真實網域,也就是那個詐騙網站的網域。金鑰發現該網域下不存在任何金鑰對,或者為它簽署,而產生的簽章會被真正的服務拒絕。兩種情況下,攻擊者都拿不到任何可用的東西。

本質上的差別就在這裡。使用簡訊或 TOTP 時,安全最終取決於使用者的警覺,取決於他能否在匆忙之際、在頁面看起來一切正常時,從網址列裡識破一個偽造網域。使用 FIDO2 時,這項核對由機器完成,每一次都如此,不倚賴任何人的注意力。這種責任的移轉,比密碼學強度更重要。

效果是可以衡量的。Google 自 2017 年初起要求員工一律使用金鑰,並在 2018 年表示,在超過 85000 名員工中沒有記錄到任何帳號遭到入侵。

硬體金鑰真正的限制

把它們說成完美無瑕並不誠實,對準備真正的決策也毫無幫助。

成本是存在的。 依型號約 25 到 60 歐元,生物辨識版本更貴,而且要乘以二。

遺失金鑰才是真正的風險。 關鍵帳號只配一把金鑰是設計上的錯誤。每個重要帳號都需要註冊兩把,其中一把存放在別處,交給親近的人或放進保險箱。第二把不是為了方便,而是讓第一把能被安心使用的前提。

涵蓋範圍並不完整。 許多服務,尤其是歐洲的銀行服務,尚未支援 FIDO2,下面的優先順序正是由此而來。

金鑰可能被偷。 因此必須在金鑰上設定 PIN 碼,或選擇附指紋的型號:否則光是這個物件,就足以讓撿到的人使用。

退路仍是最脆弱的一環。 啟用 FIDO2 卻不關閉簡訊,等於毫無保護:攻擊者只會走那條依然敞開的路。唯有當舊機制從帳號中被移除,包含帳號救援選項在內,遷移才算完成。

至於硬體,YubiKey 系列涵蓋的協定範圍最廣,Google Titan 較便宜但僅支援 FIDO,Nitrokey 與 SoloKeys 提供韌體開源、可稽核的替代品,Token2 則生產內建數字鍵盤的型號,PIN 碼直接在金鑰上輸入而非在鍵盤上輸入。在通過 FIDO2 認證的金鑰之中沒有錯誤的選擇:協定是同一個,不同的只是附帶用途。

無法一次全部更換時,該從哪裡開始

遷移順序不是偏好問題,而是由你各個帳號之間的依存關係決定。

  1. 先是主要信箱。 幾乎其他所有帳號的重設連結都寄到這裡。掌控它的攻擊者可以逐一接管其餘帳號,無須直接攻擊其中任何一個。沒有什麼值得比它更早得到保護。
  2. 密碼管理器。 它匯集了你所有存取權限的第一因素,因此它的防護必須與它所保管、防護最好的那個帳號相當。這也是檢查主密碼品質的時機,這個主題我們在熵與你的安全背後的科學一文中詳細談過。
  3. 金融帳號與加密貨幣平台。 具有即時價值的目標,一旦被攻陷,幾分鐘內就會變成無法挽回的損失。
  4. 有受眾的社群帳號。 SEC 事件說明了一個被眾人追蹤的帳號其發言分量如何,而受害的未必總是帳號本人。
  5. 其餘可以等等,用 TOTP 應用程式取代簡訊即可。一個論壇或一項串流服務不值得同樣的投入。

至於尚未支援 FIDO2 的帳號:凡是可行之處都改用 TOTP,並向電信業者申請號碼可攜鎖定,這在多數業者是免費選項。

這說明了 Arpokrat 的思路

本文所描述的問題,之所以存在,僅僅是因為有人把一個識別碼放到了系統的中心。電話號碼從來就不是為身分證明而設計的:它是出於習慣才成為線上身分驗證的骨幹,而上文描述的三種攻擊,全都在利用這種用途上的錯置。

這正是 Arpokrat Messenger 協定在設計時所依循的思路:沒有電話號碼,沒有電子郵件位址,也沒有帳號。使用者以一組保存在自己裝置上的加密金鑰的形式存在,建立聯繫則透過一次性邀請連結完成。邏輯與 FIDO2 相同,只是層級更高:第三方沒有掌握的東西,既無法透過針對電信業者的社交工程從他那裡騙走,也無法透過法律強制取得。這種與零知識架構的一致性,我們在現在蒐集,日後解密一文中做了展開。

一把會簽署卻從不洩漏自身祕密的硬體金鑰,其實也正是離線加密錢包的運作方式,這在我們的冷錢包完全指南中有詳細說明:把祕密部分保存在一個專用物件裡,對外只放出一個簽章。

結語

簡訊雙因素驗證並非設計得糟糕。它在 2010 年代初普及開來時,相較於單獨使用密碼是相當大的一步,而且它具備大規模推行時唯一真正重要的特質:人人手上都已經有一支手機。

問題不在於它被發明出來,而在於它活得太久。SS7 的示範可追溯到 2014 年,銀行領域的真實利用是 2017 年,即時網釣的產業化則出現在那個十年的尾聲。CISA 在 2024 年寫下不要再使用它,NIST 在 2025 年把這項限制正式化。從漏洞變得可以被大規模利用,到機構把它白紙黑字寫下來,中間隔了大約十年。而簡訊至今仍是多數面向一般大眾的服務的預設第二因素。

這道時間差才是本文真正的資訊。安全機制並不在它失效時消失,而是在有同樣簡便的東西來取代它時才消失,而後者所需的時間長得多。所以問題不是你是否應該放棄簡訊,這一點多年前就已有定論。問題是:你視為理所當然的其他哪些防護,其實已經處在同樣的處境,只是還沒有人把它寫下來。

參考來源