撞库:你的登录看起来一切正常,却仍在泄漏
这种攻击从不触发限流也能得手——它在日志里长什么样、常规手段为何漏掉它,以及什么才真正拦得住它。
这种攻击,以及它为何不是暴力破解
撞库不猜密码。它重放密码。有人拿到某个与你无关的服务泄漏出来的用户名和密码组合,对你的登录逐一试一次,赌的是相当一部分人会重复使用凭据。
仅这一点差别,就让你部署的大多数手段失效。暴力破解很吵:针对一个账号的大量尝试,容易限流,也容易锁定。撞库则是在成千上万个账号上各试一次,摊在数小时里,并且轮换地址。
成功率很低——通常引用的数字在千分之一到百分之几之间——而这已经完全够用了。面对一份一百万组的清单,千分之一就是一千个能用的账号。
而且那次成功的登录,按你的应用所能拿到的任何技术指标衡量,都是正确的。密码是对的。没有什么可以拒绝。
它在你的日志里长什么样
这件事之所以能几周不被察觉,是因为任何单独的信号看起来都不吓人。这个模式只存在于总量之中。
- 看失败率,而不是失败次数。你登录失败的绝对数量也许几乎没动,但失败与成功的比例会偏移——因为这些尝试摊在了大多并不存在或并不匹配的账号上。
- 每个账号只试一次。以账号为键的限流器永远不会触发。以地址为键的限流器只有在攻击者忘了轮换时才会触发。
- 地址分布。尝试来自住宅代理池,也就是说,那些地址看起来像普通客户,而不像数据中心。
- 节奏过于均匀。人类的登录流量随你客户的作息起伏。而一轮撞库整夜都是平的。
- 来自陌生地址的、悄无声息的成功量上升。这是最要紧的一条,也是没有人设告警的一条——因为一次成功的登录并不是错误。
常规手段为何漏掉它
以下每一项都值得拥有,但没有哪一项能单独挡住这种攻击。
限流的键取错了。以账号为键的限制,在每账号只试一次时永远不会触发;以地址为键的限制,则被住宅代理池的轮换击败,而那已是一种大路货服务。
账号锁定在这里比无用更糟,而且是主动危险的。它在只试一次时无法触发,而在一个公开的登录页上,它让任何人都能随手停用你客户的账号。
CAPTCHA 是攻击者早已列入预算的每次尝试成本。打码服务按千次计价,而在 0.1% 的成功率下,这笔账仍然算得很宽裕。
密码复杂度规则毫无作用。被重放的那个密码本来就是有效的——它满足了另一个服务施加的规则,很可能也满足你的。
多因素认证是唯一能真正打断这种攻击的手段,值得为部署它付出一切努力。它同样帮不了那些尚未开通的账号,而在面向消费者的产品里,那是大多数。
什么才真正拦得住它
因为这种攻击在任何单个请求里都不可见,检测必须在会话和地址这两个层面上进行。
会话级信号。一轮撞库会把表单自动化:字段的填充没有敲键盘的节奏,焦点的移动不是人手会产生的样子,提交到达的速度快过一个人可能填完的时间。这与任何无感机器人识别所读取的是同一个行为层,而且在第一次尝试时就已经可见。
传输层指纹。工具必须建立一次 TLS 连接,它的技术栈就此暴露。一个与会话自称的浏览器对不上的 JA3/JA3N 指纹是一个很强的信号,而攻击者无法靠改一个请求头来修正它。
跨尝试的信誉。每账号一次,按账号看你什么也得不到;但同一个地址对四百个不同账号各试一次,则毫无歧义。这个总量只有在有东西在为地址评分、而不是在数请求时才会存在。
跨租户信誉。撞库清单会在同一场行动里对许多站点轮番重放。一个昨夜在别人登录页上跑过清单的地址,值得在它开始对付你之前就被拦下——而这只有在这份知识被共享时才可能。
一套站得住脚的方案
按每一步对结果的决定性程度排序。
部署 MFA 并推动开通率。这份清单上没有别的东西能单独打断这种攻击。把它设为新账号的默认项,并在已有账号从新地址成功登录后提示开通。
对来自陌生地址的成功登录设告警。这很便宜,用的是你已经有的数据,而且正是撞库开始奏效的信号。
为会话评分,而不是为请求。行为与传输层信号在第一次尝试时就能抓住自动化,早于那个总量模式成形。
在网关上执行。在页面 JavaScript 中施加的决定,是攻击者的工具根本不会执行的决定。
在设置密码时和登录时,都对照已知泄漏库校验凭据。如果被重放的密码已经在公开语料里,你可以在它成为任何人的麻烦之前就拒绝它。
让放行名单保持最新。你自己的 QA 自动化和压力测试看起来和这种攻击一模一样,而在发版当天把它们挡下来,是另一种意义上的事故。
Karma 处在什么位置
Karma 覆盖第三和第四条:它依据行为与传输层信号为每个会话评分,维护一个租户级信誉库,使得散布在众多账号上的同一个地址被看作同一个行为体,并提供可选加入的共享封禁名单,让一份正在全行业被重放的清单在抵达你的登录页之前就已经是已知的。
判定送往你的网关,网关会在你的应用还没来得及校验密码之前就拦下请求——因此这次尝试不会让你付出任何代价,也永远不会变成一次需要你去调查的成功登录。
它不能取代 MFA,本页也无意暗示它能。MFA 是让被重放的密码变得一文不值的那个手段;这里所讲的一切,是关于拦住那些正在试探哪些密码仍然有效的流量。