短信泵送欺诈:一个手机验证表单如何悄悄耗尽分类广告网站的短信预算

短信账单送到了,金额是平时的三四倍。其他一切都没有变化:新广告主的数量看起来很正常,广告板看起来很正常,支付账户没有任何异常活动。最自然的第一反应是账单出错了,于是运营者向短信服务商开了一张工单,等待答复。收到的答复比账单出错更糟,因为它意味着每一条短信确实都发出去了,而服务商不会为一条真正送达的短信退款。
发生的事情有一个名字:短信泵送欺诈,也叫短信话费欺诈或人为放大流量。它精准盯上了分类信息网站用来保持广告真实性的那类表单,广告主输入手机号、点击写着发送验证码的按钮的那种。本博客已经解释过为什么会有这道验证,因为电话和身份核验正是防止广告板被虚假账号灌满的真正手段。这里说的这种欺诈根本不在乎广告内容,它只在乎那个按钮。
这种欺诈到底是怎么运作的
短信泵送是一种历史更悠久的电信骗局的变种,叫作国际分成欺诈,一旦拆解开来,其中的手法并不复杂。诈骗者与某家靠短信终结费赚钱的运营商达成协议,可能是正式合作,也可能是被利用,运营商往往位于远离业务所在地的国家。诈骗者随后用机器人反复触发网站的发送验证码动作,瞄准的是该运营商网络上真实存在的手机号码。每一个号码背后都是一张能接收短信的活跃SIM卡,所以这些短信不会退回,也不会失败,它们会送达。
因为短信确实被送达了,电信这一侧根本不存在任何欺诈信号,不会促使运营商拒绝发送,也不会促使短信服务商拒绝计费。运营商为每一条送达的短信收取终结费,而根据分成协议,这笔费用中的一部分会回流给操控机器人流量的人。从网络的角度看,付钱发短信的这家企业,不过是一个要求发送了大量短信的普通客户。上游没有任何一方有理由主动叫停这件事。
企业上游的任何一方都没有动机主动叫停这件事,这个细节值得停下来想清楚。运营商拿到的是真实送达的短信费用,所以在它的记录里,一切看起来都没问题。短信接口夹在企业和运营商中间,忠实地为被要求发送的内容计费。注意到注册表单上涌入的流量不像真正的广告主,这份责任最终落在了唯一既有动机又有能力察觉的一方身上:付账单的那家企业。
让这种手法对诈骗者有吸引力,又让目录网站付出代价的关键在于,整个过程都不需要一个真实账号。机器人不需要完成验证,不需要发布广告,验证码也永远不需要被输进任何框里。它只需要网站的表单接受一个手机号并发出一条短信。一个从未完成过哪怕一次成功验证的注册流程,照样能产生整整一个月的可计费流量。
为什么账单会比其他一切先到
大多数短信与验证接口,包括Twilio在内,都是按发送或尝试发送的短信计费,而不是按实际完成的验证计费。这种计费方式并非某一家服务商特有的设计缺陷:底层电话网络本来就是这样向企业收取送达一条短信的费用,接口只是把这笔成本原样转嫁过去。实际的后果是,一场欺诈活动从第一条短信开始就在耗费运营者的钱,而要过上数小时甚至数天,才会有人注意到注册表单的完成率已经悄悄崩塌。
这种手法能达到的规模并非纸上谈兵。2022年12月,埃隆·马斯克在一次Twitter Spaces上公开表示,Twitter每年因这种手法损失大约六千万美元,并点名约390家电信运营商,称它们涉嫌向平台灌注伪造的双重身份验证流量。这个数字是马斯克本人的说法,而非经过审计的公司披露,但后续反应是真实的,报道范围也远超反欺诈厂商的营销文章:Twitter切断了与流量看起来存在欺诈的运营商的合作,几个月后,又出于成本考虑,把免费的短信双重验证限定给付费订阅用户。即便是Twitter这种体量、拥有技术团队的公司,也花了数月才察觉并作出反应。一个仅靠单一独立短信账号运作、没有团队每天早上盯着日志的目录网站,内置的预警要少得多。
真正能揭露欺诈的数字,不是发送短信的总量,因为一次真实的营销推广或者一周真正繁忙的业务同样会拉高这个数字。真正说明问题的,是发送的验证码与成功输入的验证码之间的比例。即便总量在上升,完成率却相对平时的水平悄悄下滑,这才是流量并非由真正想完成注册的人构成的信号。
为什么一个开放的发布表单正好符合攻击目标画像
分类信息目录有一个结构性的理由,要把发送验证码按钮做得容易触达:任何给首次注册的广告主增加的阻力都会拉低转化率,本博客也解释过为什么这种阻力值得在入口处就小心把守,更何况这还是在支付环节介入之前。一个对真实广告主既快捷又友好的手机验证步骤,出于同样的设计,对一个根本无意成为真实用户的机器人来说,同样快捷又友好。
对一个规模较小的独立运营者来说,风险敞口也比表面看起来更严重。大平台会谈量身定制的批量价格,合作关系中通常也包含一定程度的反欺诈监控。而一个通过标准的按量付费短信接口来处理注册流程的目录网站,没有这样的缓冲:每一条欺诈短信都按照与每一条正常短信相同的单价计费,直接从登记的信用卡里扣款,在有人注意到账单之前,没有任何东西能吸收这个突然的高峰。
这并不意味着封锁某个国家区号是一个设一次就可以不管的决定。一个正在拓展到新城市、或者吸引到经常出差旅行的广告主的目录网站,可能会发现一年前出于正当理由被封锁的某个区号背后,其实藏着一批正当的注册请求。把受限区号列表当作每隔几个月就要复查一次的事项,和其他按同样节奏复查的事项放在一起处理,能防止这道防线悄悄变成流失注册的第二个来源。
这与本博客此前讨论为什么验证邮件有时候根本到不了广告主收件箱时描述的问题是不同的故障。那篇文章讲的是一条悄无声息失败的消息,代价不过是丢失一次注册。这一篇讲的是一条大张旗鼓成功的消息,准确无误地送达,而且每次送达都要花真金白银。
到底什么能真正拦住它
第一层防线是对发送验证码这个动作本身做限流,并且在服务器端强制执行,而不是交给浏览器去信任:严格限定单个IP地址、会话或手机号在短时间窗口内能请求的验证码数量。这一层单独并不能拦住一个利用大量IP地址分布的机器人网络,但它能剔除攻击中最廉价、最偷懒的那种版本,迫使更执着的攻击者付出更多成本。
第二层防线是把反机器人检查放在发送动作触发之前,而不是之后:确认发起请求的是真人,又不需要这个人去解决什么恼人的问题,比如在后台悄悄给请求打分的隐形验证。由于整个欺诈都依赖于自动化、大批量地触发发送,任何能明显拖慢自动化触发速度的措施,都会直接推高攻击成本,即便还是会放过一部分机器人。
第三层防线是对目录网站真实广告主群体几乎从不使用的手机号段施加阻力,而不一定是彻底封锁。一个只服务某一个国家若干城市的网站,没有太多理由在没有二次核验的情况下,接受一波涌向某个从未有过真正广告主的国家区号的验证请求。
第四层防线是启用短信服务商已经提供的反欺诈保护,而不是想当然地认为默认设置就够了。以Twilio为具体例子,它提供一项名为Verify Fraud Guard的功能,通过分析流量模式来检测并自动拦截疑似泵送活动,而且对Verify客户默认开启,还提供可调节的保护等级,以少量误判换取更高的拦截率。确认这类功能是否已经开启,并且调整到与网站真实流量相匹配的等级,不花一分钱,却能拦下网站自身逻辑会漏掉的东西。
第五层防线是直接与服务商设置支出提醒,而不是一个月后才在账单上发现问题。一个阈值,一旦每日短信支出超过没有正常解释的水平就触发通知,能把一场原本会悄无声息持续数周的欺诈活动,变成几小时内就会被察觉的事件。
这周该做的事
调出上个月的短信日志,计算发送验证码与成功验证之间的真实比例,而不只是总量。一个总量看起来正常的数字,仍然可能掩盖着某一特定周或某一特定国家区号里比例已经崩塌的事实。这一项计算,比这篇文章里的任何其他内容,都更能告诉运营者这种欺诈是否已经在发生。
然后直接向短信服务商核实三项设置:类似Fraud Guard这样的反欺诈保护是否已启用,启用在哪个等级;是否设有支出提醒,阈值是多少;发送验证码的接口是否有服务器端的限流,而且这个限流不依赖任何可以被要求浏览器忽略的东西。这三项核实都不需要新软件,也不需要新的服务商关系,只需要花时间直接向服务商提问,并读懂对方的答复。


