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 认证的密钥中没有错误的选择:协议是同一个,不同的只是附带用途。
无法一次全部更换时,从哪里开始
迁移顺序不是偏好问题,它由你各个账号之间的依赖关系决定。
- 先是主邮箱。 几乎其他所有账号的重置链接都发到这里。控制了它的攻击者可以逐个接管其余账号,而无需直接攻击其中任何一个。没有什么值得比它更早得到保护。
- 密码管理器。 它汇集了你所有访问权限的第一因素,因此它的防护必须与它所保管的、防护最好的那个账号相当。这也是检查主密码质量的时候,这个主题我们在熵与你的安全背后的科学一文中做过详细展开。
- 金融账号与加密货币平台。 具有即时价值的目标,一旦被攻陷,几分钟内就会变成不可挽回的损失。
- 有受众的社交账号。 SEC 事件说明了一个被众多人关注的账号,其发言分量几何,而受损的未必总是账号本人。
- 其余可以等等,用 TOTP 应用替代短信即可。一个论坛或一项流媒体服务不值得同样的投入。
对于尚未支持 FIDO2 的账号:凡是可能的地方都改用 TOTP,并向运营商申请号码携转锁定,这在大多数运营商那里是免费选项。
这说明了 Arpokrat 的思路
本文描述的问题,之所以存在,仅仅是因为有人把一个标识符放到了系统的中心位置。电话号码从来就不是为身份证明而设计的:它是出于习惯才成为在线身份验证的支柱,而上文描述的三种攻击,全都在利用这种用途上的错位。
这正是 Arpokrat Messenger 协议在设计时所依循的思路:没有电话号码,没有电子邮箱,也没有账号。用户以一组保存在自己设备上的加密密钥的形式存在,建立联系则通过一次性邀请链接完成。逻辑与 FIDO2 相同,只是层级更高:第三方没有掌握的东西,既无法通过针对运营商的社会工程从他那里骗走,也无法通过法律强制取得。这种与零知识架构的一致性,我们在现在收集,日后解密一文中做了展开。
一把签名却从不泄露自身秘密的硬件密钥,其实也正是离线加密钱包的工作方式,这在我们的冷钱包完全指南中有详细说明:把秘密部分保存在一个专用物件里,对外只放出一个签名。
结语
短信双因素认证并非设计得糟糕。它在 2010 年代初普及开来时,相较于单独使用密码是一次相当大的进步,而且它具备大规模推广时唯一真正重要的品质:人人都已经有一部手机。
问题不在于它被发明出来,而在于它活得太久。SS7 的演示可追溯到 2014 年,银行领域的真实利用是 2017 年,实时钓鱼的产业化则出现在那个十年的末尾。CISA 在 2024 年写下不要再使用它,NIST 在 2025 年将这一限制正式化。从漏洞变得可以被大规模利用,到机构把它白纸黑字写下来,中间隔了大约十年。而短信至今仍是大多数面向普通用户的服务的默认第二因素。
这道时间差才是本文真正的信息。安全机制并不在它失效时消失,而是在有同样简便的东西来取代它时才消失,而后者要花的时间长得多。所以问题不是你是否应该放弃短信,这一点多年前就已有定论。问题是:你视为理所当然的其他哪些防护,其实已经处在同样的境地,只是还没有人把它写下来。
参考来源
- 美国司法部,Alabama Man Sentenced to 14 Months in Connection with Securities and Exchange Commission X Hack that Spiked Bitcoin Prices,2025 年 5 月 16 日
- 美国证券交易委员会,SECGov X Account,2024 年 1 月 22 日官方声明
- NIST,SP 800-63B-4, Digital Identity Guidelines: Authentication and Authenticator Management,2025 年 7 月最终版
- CISA,Mobile Communications Best Practice Guidance,2024 年 12 月 18 日
- FBI Internet Crime Complaint Center,2024 Internet Crime Report
- Threatpost,Cellular Privacy, SS7 Security Shattered at 31C3,Tobias Engel 与 Karsten Nohl 的演示,2014 年 12 月
- Help Net Security,Attackers exploited SS7 flaws to empty Germans’ bank accounts,2017 年 5 月
- Krebs on Security,Google: Security Keys Neutralized Employee Phishing,2018 年 7 月
- W3C,Web Authentication: An API for accessing Public Key Credentials,WebAuthn 规范
