在边缘阻断撞库攻击
tracio.ai 如何在自动化登录尝试触及你的认证系统之前就识别出它们——结合设备指纹、速率检查与行为信号。
撞库攻击(Credential stuffing)
使用自动化工具,拿被盗的用户名和密码组合去登录页面逐一试探。 这类攻击规模巨大——单个攻击者一天之内就可能在数百个目标站点上测试数百万条凭据。像限速和验证码 (CAPTCHA)这样的传统防御手段并不足够,因为攻击者会把请求分散到成千上万个 IP 地址上,还会使用 验证码破解服务。下面介绍我们如何在边缘阻断撞库——在请求触及你的认证系统之前。
攻击面
一次典型的撞库行动会用到一份被盗凭据清单(在暗网市场上,每百万条记录的价格可能低至 10 美元)、一款自动化工具(通常是自定义脚本,或像 OpenBullet 这样的工具),以及一个代理 IP 池(每次请求都会轮换的住宅代理,用来规避基于 IP 的限速)。
攻击者会把工具配置成以受控速率发送登录请求——慢到不会触发简单的限速规则,同时又快到每小时能测试数千条凭据。每次请求都来自不同的 IP 地址、带着不同的 user agent 字符串,看上去就像是来自不同用户的一连串正常登录尝试。
为什么限速会失效
基于 IP 的限速是多数团队部署的第一道防线,也是第一道被攻破的防线。住宅代理服务能提供访问数以百万计真实 IP 地址的能力——家用路由器、移动设备和物联网(IoT)设备——这些 IP 会随每次请求而轮换。从服务器的视角看,每一次登录尝试都来自一个此前没有任何滥用记录的独立住宅 IP。
基于账号的限速(限制每个用户名的登录尝试次数)更为有效,但会制造出一个拒绝服务的攻击面:攻击者可以故意针对某些用户名多次登录失败,从而把正常用户锁在门外。
以设备指纹为根基
设备指纹改变了这一局面,因为它识别的是运行攻击的设备,而不是它所使用的 IP。一款运行在单台机器或虚拟机集群上的撞库工具,无论轮换到哪个代理 IP,都会在所有请求中产出一致的设备指纹。
我们的 Bot Detection 引擎能识别自动化工具本身。Selenium 会留下 navigator.webdriver 痕迹。Puppeteer 和 Playwright 具有独特的 JavaScript 运行时特征。无头(headless)Chrome 会缺少有头 Chrome 所包含的某些特定浏览器 API。即便是那些不执行 JavaScript 的自定义 HTTP 客户端,也能通过 TLS 指纹被检测出来——它们的 Client Hello 报文会暴露出底层所用的 HTTP 库。
按设备追踪速率
一旦我们拿到了稳定的设备标识(通过 Device Identification),就可以在设备层面而非 IP 层面施加速率检查。如果单台设备在 5 分钟内尝试了 50 次登录——无论这些请求来自多少个不同的 IP——这个模式无疑就是撞库。
我们的 IP Intelligence 模块会在三个时间窗口上追踪速率:5 分钟、1 小时和 24 小时。这种多窗口的方式既能抓住猛烈的攻击(每分钟数百次尝试),也能抓住慢速低频的攻击(每小时寥寥几次、持续好几天)。
行为信号分析
除了机器人检测和速率追踪,我们的 Smart Signals 分析还会考察那些能把自动化攻击与正常登录区分开来的行为信号。真实用户在请求时间间隔、打字速度和浏览路径上都会表现出自然的差异。自动化工具则倾向于产出机械般一致的时间间隔、完全相同的请求头,并且没有任何鼠标移动或滚动事件。
我们还会检查那些暗示环境伪造的信号不一致之处。一个自称是 macOS 上 Chrome 的浏览器,却呈现出与 Linux 虚拟机相关联的 WebGL 参数,就会被立即标记。当 user agent 字符串与 TLS 指纹对不上时,则会触发篡改告警。
边缘部署
阻断撞库的关键,在于赶在它触及你的认证系统之前就把它拦下来。我们的 agent 会在登录页面加载时载入,并在页面加载过程中采集信号——早于用户(或机器人)提交凭据。等到登录表单被提交时,指纹和机器人检测的结果就已经就绪,你的服务器可以据此即刻拒绝自动化尝试。
对于高流量的目标,我们建议部署我们的 Cloudflare Worker 或 CloudFront Lambda@Edge 集成,让指纹校验在 CDN 边缘运行。这意味着撞库请求会在离攻击者最近的边缘节点上被拦截,永远不会触及你的源站服务器。
成效
我们的客户反馈,在登录页面部署 tracio.ai 之后,撞库流量下降了 99%。其余 1% 是使用完整浏览器自动化、并精心伪造信号的高度复杂攻击——而随着速率模式浮现,我们的多方法检测会在最初几十次请求内就将它们捕获。