短信验证码是互联网世界最流行的第二因素,却也是安全圈里被质疑最久的方案。SS7 协议漏洞、SIM 卡复制、补卡攻击……这些弱点早已是公开常识,但短信验证码依然大量存在于金融系统里。这一篇讲清楚它的原理和弱点,再用第 1 篇的强度尺给它一个诚实的定位。
这是《金融机构的双因素认证》系列的第二篇,第一个要被具体拆解的方案。上一篇定义了「内部落地系统」「专线托管端系统」两种场景,并借 NIST SP 800-63B 的思路立了一把 L1/L2/L3 认证强度尺。
短信验证码的原理很简单,弱点也早已是公开常识:它依赖的公网通道本身不属于持有者能完全控制的范围。这一篇讲清楚原理和两类已知弱点(SS7 协议漏洞、SIM 卡复制/补卡攻击),再看它在两种金融场景下到底还有没有位置。
短信验证码的流程本身没什么复杂的密码学:
服务器生成一个短期有效的数字串,通过短信网关送进电信运营商的网络,最终落到用户手机上;用户把这串数字念回给服务器,服务器核对通过就算认证成功。整个过程里,服务器信任的不是「用户拥有一个只属于自己的秘密」,而是「验证码能且只能到达那个手机号绑定的 SIM 卡」。这个信任假设,恰恰是后面两类攻击的切入点。
SS7(Chen 注:SS7(Signalling System No. 7,7号信令系统)是电信运营商网络之间用来交换控制信息(如呼叫路由、短信路由、漫游位置更新)的信令协议,1970 年代设计,当时的设计前提是「网络参与者都是可信的运营商」,没有考虑到后来网络互联规模扩大后,接入方鱼龙混杂的情况。) 是全球电信网络之间路由呼叫和短信的骨干协议。它的设计年代早于「零信任(Chen 注:零信任(Zero Trust)是一种安全架构理念,核心原则是「不默认信任网络内部或外部的任何实体,每次访问都要重新验证身份和权限」,由 Forrester 分析师 John Kindervag 于 2010 年提出,用来替代传统「内网边界防御、内部默认可信」的安全模型。SS7 协议设计年代远早于这个概念的提出,默认信令网络里接入的运营商节点都是可信的。)」这个概念,默许任何接入 SS7 网络的运营商节点都可以查询、重定向他人的呼叫和短信路由。
这意味着,只要攻击者能接入 SS7 网络(通过境外某个监管宽松的运营商、或者非法获得的接入权限),理论上就可以在用户手机完全没有被攻破、SIM 卡完全没有被复制的情况下,把发往目标手机号的短信重定向到攻击者控制的设备上,包括那条一次性验证码。
这类攻击门槛不低,需要具备电信网络接入能力,因此更多出现在针对高价值目标(政要、企业高管、加密货币持有者)的定向攻击中,而不是大规模撒网式的犯罪。但门槛不低,不代表不存在,对金融机构而言,「攻击者需要电信级资源」恰恰是内部落地系统和专线托管端系统更需要警惕的威胁模型,因为这两类场景本身就是高价值目标。
比 SS7 门槛低得多、也更常见的是针对 SIM 卡本身的攻击,主要有两条路:
一是 SIM 卡复制。早期 2G 时代的 SIM 卡加密强度弱,存在被物理接触后克隆的案例;现代 UICC(Chen 注:UICC(Universal Integrated Circuit Card)是现代 SIM 卡的物理载体标准,内置密钥采用 3G/4G/5G 网络的鉴权算法(如 Milenage),私钥由运营商在生产时写入、不可读出。相比 2G 时代的 SIM 卡,克隆难度大幅提高。) 卡片的密钥不可读出,纯粹的物理克隆已经很难实现。
二是补卡攻击(SIM swap)。这是目前更主流、也更值得警惕的路径,攻击的不是 SIM 卡本身的密码学强度,而是运营商的身份核实流程。攻击者收集受害者的姓名、身份证号、手机号等信息(往往来自数据泄露或社会工程),冒充受害者向运营商申请补办 SIM 卡或号码转网,一旦成功,原 SIM 卡失效、新卡(在攻击者手上)绑定同一个号码,所有发往这个号码的验证码从此都落到攻击者手里。
这类攻击已经造成过大量真实损失,尤其在加密货币和网银盗取案例中反复出现,是安全圈里被讨论最多的短信验证码弱点,也是本节要讲的第二类、也是更现实的威胁。
回到第 1 篇的两个场景标签。
内部落地系统:终端通常是机构统一发放和管控的办公设备,员工身份由机构自己的 IAM 系统管理。这意味着,如果内部系统还在用短信验证码作为第二因素,那么认证强度的短板完全绕过了机构自己能控制的一切。不管终端管得多严、内网隔离得多好,短信这一环都要依赖外部电信运营商的核实流程,机构对此没有任何控制力。这是一个和「内部落地系统终端受控」的场景假设完全脱节的方案。
专线托管端系统:短信验证码在这类场景里更加边缘。专线本身提供的网络层信任(第 7 篇细讲)已经解决了「这条链路是专的」这件事,如果第二因素还要绕道公网短信通道,等于在一条精心搭建的专用信任链路上,硬生生开了一个绕不开公网的口子。这在设计上是不协调的,会让整体安全边界出现一个和其他环节完全不对等的薄弱点。
按第 1 篇的三级尺,短信验证码属于 L1(基础级):它是「你有的」因素,但这个「拥有」的真实性完全依赖一个机构自己管不到的外部流程,抗攻击能力弱,且弱点已经被公开、被广泛利用。
一个自然的问题是:既然弱点早已是公开常识,为什么短信验证码还大量存在于各类系统(包括一些金融相关系统)里?答案通常不是技术判断,而是现实约束:
短信验证码的核心问题不是密码学强度不够,而是它把认证强度的上限,交给了一个机构自己无法控制的外部流程。SS7 协议漏洞攻击的是电信网络本身的设计缺陷,补卡攻击攻击的是运营商的身份核实流程,两条路径都不经过用户设备,也不经过金融机构自己的系统,机构再怎么加固自己的边界都无能为力。
对内部落地系统和专线托管端系统而言,这条短板和「终端受控、网络有额外信任层」的场景假设完全不匹配,短信验证码在这两类场景里几乎没有立足的理由。
下一篇转向真正在金融行业站稳脚跟的方案:硬件动态口令。它同样是「你有的」这一类因素,但密钥的生成和存储方式完全不同:不依赖任何外部运营商流程,这也是为什么它在金融行业至今仍是主力,而不是被时代淘汰的老古董。