验证表单看起来可能完全正常,而攻击者却在利用它触发付费发送。攻击者瞄准注册、验证码请求或验证流程,因为这些流程允许任何人触发一次发送。攻击产生消息费用,而路由沿途的某一方从中获利。
业界也将 SMS 泵送称为人为虚增流量。
为什么有人要这么做?
因为向特定目的地发送 SMS 会产生资金流动,其中一部分可以被下游截取。
终结一条消息会让发送方付费,并让路由上的各方获利。当攻击者控制路由上的某一方或从中获得分成时,向该路由生成流量就能直接获利。他们不需要读取验证码或攻破任何账户:发送本身就是产品。
这正是泵送与大多数滥用行为不同的地方。没有需要检测的账户接管,也没有需要保护的数据。损失就是账单,而在每个单独请求看起来都合法的情况下,账单持续累积。
它是什么样子的?
一次带有独特模式的突增,模式比规模更重要。
- 集中在异常目的地。 请求聚集在你通常不会服务的国家代码和号段上,往往是终结费率较高的号段。
- 几乎没有完成验证。 验证码被请求后从未输入,因此发送量与成功验证量的比率急剧下降。
- 号码看起来是合成的。 连续或有规律的号段,而非真实客户的随机分布。
- 来源难以通过身份进行封锁。 请求来自大量不同地址,因为被滥用的流程不要求登录账户。
最后一点解释了为什么按用户的请求速率限制本身效果有限:根本没有用户。滥用行为存在于你的产品中专门面向陌生人开放的部分。
如何阻止它?
四项措施,大致按投入产出比从高到低排列。
- 将目的地限制在你实际服务的范围内。 如果你的客户分布在五个国家,向其余两百个国家发送只有损失没有收益。Bird 按目的地控制发送权限,一个国家必须先被启用,流量才能到达。
- 基于你掌握的信息做速率限制,而非基于对方的身份。 按电话号码、按号码前缀、按地址、按会话。无法绑定到账户的欺诈通常仍可绑定到目的地号段。
- 在发送之前增加阻力。 在请求验证码之前设置一道验证,对真实用户只多花一刻时间,却会摧毁自动化攻击者的经济模型。
- 关注完成率而非发送量。 发送量上升是模糊的信号。发送量上升而完成量持平才是真正的信号,而且它比账单更早出现。
Bird 还会在你的配置之下执行自己的上限。验证发送指南说得很清楚:
Independent of your settings, Verify enforces platform caps to keep OTP traffic from being weaponized, whether against your wallet (SMS pumping) or against a victim's inbox
这值得注意,原因有二:你自己配置错误的限制并不是你与一张大额账单之间唯一的屏障;而且如果合法流量被拒绝,原因可能正是你未曾设置的平台上限。
这和验证码轰炸攻击是一回事吗?
有关联,但针对的受害者不同。
同一段引文提到了两者。泵送针对的是你的钱包:攻击者希望消息被发出,接收者无关紧要。轰炸针对的是某个人的手机:攻击者希望用大量验证码消息淹没一个受害者,通常是为了骚扰或掩盖一条真实的提醒。
Pumping 表现为大量目的地且无完成验证;flooding 表现为单一目的地和大量请求。单收件人速率限制可以减少对同一号码的重复请求,但无法阻止分散到大量号码的攻击。需要结合目的地限制一起使用。
关于验证流程的背景知识,什么是 OTP 介绍了这种滥用所依赖的机制。
简而言之
攻击者的收入就是你的发送成本。
流量被泵送到下游有人分成的路由上的号码,因此消息本身就是目的,而非副产品。
它针对的是无需登录即可发送 SMS 的任何入口。
注册表单、验证码请求和电话验证流程是攻击面,因为它们允许陌生人触发付费消息发送。
特征体现在目的地分布上,而非流量大小上。
集中在异常国家代码和号段上的突增,且几乎没有完成验证,这就是信号。
平台上限位于你自己的设置之下。
Bird 会独立于你的配置对验证流量实施上限,因此配置错误的限制并不是唯一的防线。