4. 暴力尝试的攻击模式
在Velocity风控体系中,识别暴力尝试的关键不在于“是否失败”,而在于“失败以什么节奏、什么分布、什么组合出现”。同样是登录失败,字典攻击、撞库、密码喷洒和分布式暴力破解在流量形态上差异显著。理解这四类攻击的行为特征,是后续编写检测规则、配置阈值和设计拦截策略的前提。
一、核心原理:四类攻击的本质差异
暴力尝试的共同目标是绕过身份认证,但它们的约束条件不同,导致攻击者采取的策略不同。我们可以从三个维度来区分:账号维度(攻击者针对少量账号还是大量账号)、密码维度(尝试少量常见密码还是大量候选密码)、来源维度(集中来自少数IP还是分散到大量IP)。
- 字典攻击:针对少量已知账号,使用一个包含常见弱密码的字典逐个尝试。账号集中、密码候选有限、来源通常集中。典型场景是攻击者已经知道某个用户名,试图猜出其密码。
- 撞库:利用从其他平台泄露的“账号-密码”组合,批量尝试登录目标系统。账号和密码都来自外部泄露库,命中率取决于目标用户是否复用密码。特征是账号分散、密码与账号一一对应、来源可能分散。
- 密码喷洒:针对大量账号,每个账号只尝试极少数几个高频弱密码(如
123456、Password1)。目的是规避“单账号多次失败”的锁定策略。特征是账号极分散、单账号失败次数极低、来源可能集中或分散。 - 分布式暴力破解:将密码尝试分散到大量IP或设备上,对同一批账号进行持续尝试。单IP失败次数低,但全局失败量高。特征是来源极度分散、时间上持续、账号与密码组合空间大。
核心判断逻辑:Velocity中不要只看“失败次数”,而要看“失败在账号、IP、时间三个维度上的分布形态”。单账号高频失败指向字典攻击;多账号低频失败指向密码喷洒;账号与密码成对出现且来源分散指向撞库;单IP低频但全局高频指向分布式暴力破解。
二、方法流程:从日志到特征提取
在Velocity中识别上述攻击,通常遵循以下流程:
- 采集登录事件:记录每次登录尝试的账号、来源IP、时间戳、成功/失败、User-Agent、设备指纹等字段。
- 按维度聚合:分别按账号、按IP、按时间窗口进行聚合统计。例如:单账号5分钟内失败次数、单IP5分钟内失败次数、全局5分钟内失败账号数。
- 计算分布特征:计算失败账号的基数、失败IP的基数、账号与密码的对应关系、失败时间间隔的方差等。
- 匹配攻击模式:将特征与四类攻击的典型画像比对,输出风险评分或告警。
- 联动处置:根据模式类型采取不同策略,如验证码、限速、账号锁定、IP封禁或人工审核。
下面是一段Velocity规则中常见的特征提取伪代码,用于计算单账号和单IP的失败分布:
// 按账号聚合,统计5分钟窗口内失败次数
accountFailCount = count(loginEvents)
.where(status == "FAIL")
.groupBy(account)
.window(5m)
// 按IP聚合,统计5分钟窗口内失败次数
ipFailCount = count(loginEvents)
.where(status == "FAIL")
.groupBy(sourceIp)
.window(5m)
// 计算全局失败账号基数,用于识别密码喷洒
distinctFailedAccounts = distinct(loginEvents)
.where(status == "FAIL")
.window(5m)
// 输出特征向量
featureVector = {
maxAccountFail: max(accountFailCount),
maxIpFail: max(ipFailCount),
distinctAccountCount: distinctFailedAccounts,
accountIpRatio: distinctFailedAccounts / distinct(sourceIp)
}
三、案例与场景:四类攻击的日志特征对比
假设某系统在5分钟内产生了以下登录失败日志,我们可以通过特征对比快速判断攻击类型:
| 攻击类型 | 账号分布 | 密码分布 | 来源IP分布 | 单账号失败次数 | 典型日志特征 |
|---|---|---|---|---|---|
| 字典攻击 | 极少(1~5个) | 大量候选密码 | 集中(1~3个IP) | 高(几十到几百) | 同一账号连续失败,密码字段变化频繁 |
| 撞库 | 大量(几百到几万) | 与账号一一对应 | 分散或集中 | 低(每个账号1~2次) | 账号与密码成对出现,来源IP可能来自代理池 |
| 密码喷洒 | 大量(几百到几万) | 极少(1~5个高频密码) | 集中或分散 | 极低(每个账号1~2次) | 同一密码被用于大量账号,失败时间间隔均匀 |
| 分布式暴力破解 | 中等(几十到几百) | 大量候选密码 | 极度分散(成百上千IP) | 低(单IP失败少) | 全局失败量高,单IP失败量低,时间上持续 |
场景提示:在实际Velocity部署中,撞库和密码喷洒最容易混淆。区分点在于:撞库的密码与账号是“绑定关系”,来自泄露库;密码喷洒的密码是“固定几个”,与账号无关。可以通过统计“同一密码被尝试的账号数”来区分:如果某个密码被用于超过阈值的大量账号,则倾向密码喷洒。
四、误区与复盘:常见误判与修正
在实战中,仅凭单一指标容易产生误判。以下是几个高频误区:
- 误区一:失败次数高就是暴力破解。如果某个账号因为密码过期或客户端缓存旧密码,可能产生大量失败,但并非攻击。应结合密码字段是否变化、来源IP是否异常来判断。
- 误区二:单IP失败少就安全。分布式暴力破解正是利用这一点,单IP可能只失败1~2次,但全局失败账号数极高。必须引入全局视角和IP基数指标。
- 误区三:撞库一定来自大量IP。撞库也可以来自少量IP,尤其是攻击者使用高并发脚本时。来源IP分散不是撞库的必要条件,账号与密码的对应关系才是核心特征。
- 误区四:密码喷洒只针对弱密码。高级攻击者会使用“季节+年份”等变形密码,如
Summer2024!,仍然属于密码喷洒,因为其针对大量账号使用同一密码。
复盘建议:每次告警后,应回看原始日志,确认账号基数、IP基数、密码重复率三个指标。如果账号基数大、密码重复率高、单账号失败低,优先判定为密码喷洒;如果账号与密码成对出现且来源分散,优先判定为撞库。持续校准阈值,避免将正常用户误伤。
总结来说,四类攻击模式的核心区别在于“账号、密码、来源”三个维度的分布形态。在Velocity中,建议同时维护账号级、IP级和全局级三个计数器,并结合密码重复率与账号基数进行综合判定。只有把单点失败放到全局分布中观察,才能准确识别暴力尝试的真实意图。