1. 广告投放异常现象初探
上周三早上9点15分,我像往常一样打开广告投放后台查看前一晚的数据报表,一组异常数据立刻引起了我的警觉:某款新上线的教育类APP在凌晨2点到4点间突然出现了点击量激增,但转化率却暴跌至0.3%(行业平均在3%左右)。更可疑的是,这些点击几乎全部来自同一批设备型号,且IP地址呈现出明显的集群特征——前三位完全一致,只有最后一位在轮换。
这种情况我太熟悉了——典型的竞品恶意刷量攻击。黑产团伙通过控制大量设备,用自动化脚本模拟用户点击广告,目的就是消耗我们的广告预算。去年我们有个客户就因此损失了80万广告费,最后发现是对手公司雇佣的刷量团队所为。
重要提示:凌晨时段(特别是0点-6点)的点击量突然激增,且转化率异常低下,是刷量攻击的最明显特征之一。正常用户在这个时间段的活跃度通常较低。
2. IP集群识别技术解析
2.1 IP地址的"指纹"特征
每个IP地址都像人的指纹一样带有独特的身份信息。通过分析以下维度,我们可以建立IP画像:
ASN(自治系统号):标识IP所属的网络运营商。例如阿里云的ASN是37963,腾讯云是45090。异常流量常来自这些云服务商。
地理位置:通过IP2Location等数据库查询。正常用户的IP地理分布应该符合产品目标用户分布。
IP段连续性:黑产常使用连续IP段发起攻击。比如从117.136.79.1到117.136.79.255的完整C段扫描。
存活时间:家庭宽带IP通常长期不变,而秒拨IP的生命周期可能只有几分钟。
# 示例:使用ipinfo.io API获取IP详情 import requests def get_ip_details(ip): response = requests.get(f"https://ipinfo.io/{ip}/json?token=YOUR_TOKEN") return response.json() # 输出示例:{'ip': '117.136.79.23', 'city': 'Beijing', 'region': 'Beijing', # 'country': 'CN', 'org': 'AS56041 China Mobile', 'timezone': 'Asia/Shanghai'}2.2 集群识别算法实践
识别IP集群不能简单看IP相似度,需要更智能的算法。我们开发了一套基于DBSCAN的聚类方案:
特征工程:
- 将IP转换为32位整数(如117.136.79.23 → 1966561047)
- 提取前24位作为网络标识(C段)
- 记录首次出现时间和最后活跃时间
聚类参数:
- 半径ε=3(允许3个IP位的差异)
- 最小样本数=5(小于5个IP不视为集群)
异常评分:
Score = \frac{IP数量}{时间窗口} \times \frac{云服务IP占比}{1 + 地理分散度}
表格:某次攻击中的IP集群特征分析
| IP段 | 数量 | 云服务占比 | 地理分布 | 时间段 | 风险评分 |
|---|---|---|---|---|---|
| 117.136.79.* | 128 | 92% | 3个城市 | 02:00-04:00 | 87 |
| 183.232.12.* | 56 | 15% | 28个城市 | 全天分布 | 12 |
3. 完整排查实战流程
3.1 数据采集与清洗
首先需要从各渠道收集原始日志:
广告平台数据:
- 点击时间、IP、设备ID、UserAgent
- 转化事件(安装、注册等)
补充数据源:
- IP风险数据库(如IP2Proxy)
- 设备指纹服务(如数盟、TalkingData)
-- 示例:筛选可疑点击的SQL查询 SELECT ip, COUNT(*) as click_count, COUNT(DISTINCT device_id) as device_count, MAX(timestamp) - MIN(timestamp) as time_span FROM ad_clicks WHERE campaign_id = 'edu_app_2024' AND timestamp BETWEEN '2024-03-15 02:00' AND '2024-03-15 04:00' GROUP BY ip HAVING click_count > 5 AND device_count/click_count < 0.3 -- 单IP多设备 ORDER BY click_count DESC;3.2 多维交叉验证
仅靠IP分析容易误判,需要结合其他维度:
设备指纹异常:
- 相同Android ID但不同MAC地址
- 屏幕分辨率异常(如大量480x320)
- 缺失IMEI或全是000000
行为特征:
- 点击间隔极度规律(如精确每5秒一次)
- 从不产生滑动、长按等交互
- 停留时间固定为2秒
转化路径:
- 点击→下载时间<3秒(正常用户需要10秒以上)
- 下载后立即卸载
- 注册用的邮箱都是163/qq随机组合
4. 防御方案设计与实施
4.1 实时拦截策略
基于上述分析,我们在广告监测系统中部署了以下规则:
IP层规则:
- 单个IP在1分钟内点击>5次 → 临时封禁30分钟
- 来自已知云服务IP段的点击 → 要求人机验证
- C段IP在1小时内出现>50个不同IP → 全段降权
设备层规则:
- 相同设备指纹1小时内点击>3次 → 标记可疑
- 模拟器特征(如Genymotion)→ 直接拦截
- 缺失传感器数据的设备 → 降权50%
行为规则:
- 点击→下载时间<5秒 → 不计费
- 凌晨时段(0-6点)点击量突增200% → 触发人工审核
4.2 事后追溯与取证
发现攻击后需要固定证据:
日志归档:
- 保存原始访问日志(含HTTP头)
- 录制可疑会话的屏幕操作视频(通过无头浏览器)
关联分析:
# 使用NetworkX构建关联图 import networkx as nx G = nx.Graph() for ip in suspicious_ips: G.add_node(ip, type='ip') for device in ip_devices[ip]: G.add_node(device, type='device') G.add_edge(ip, device) # 找出最大连通子图(可能属于同一团伙) largest_cluster = max(nx.connected_components(G), key=len)司法取证:
- 通过IP向运营商调取登录信息
- 设备ID与竞品APP活跃用户交叉比对
- 向广告平台提交欺诈报告申请赔付
5. 我的实战经验总结
经过多次与刷量黑产的交手,我总结了几个关键心得:
不要依赖单一维度:曾经有次我们只封禁云IP,结果黑产转用被劫持的家庭路由器IP,导致误伤真实用户。现在我们会综合IP、设备、行为至少三个维度。
动态调整阈值:节假日期间正常用户行为也会变化。我们的系统现在能自动学习历史同期的基线数据,动态调整异常阈值。
保留灰度测试能力:新规则上线前,先对1%的流量试运行24小时,确认无误再全量。
与同行共享情报:我们几个大厂的广告风控团队有个保密Telegram群,会实时同步最新出现的攻击手法和IP段。
最后分享一个实用技巧:在追踪设备集群时,可以关注电池温度和电量变化——真实用户的设备这两项参数是动态变化的,而云手机通常显示固定值(如永远25℃、100%电量)。这个特征在近期几次识别中准确率高达98%。