进度检查器
进度检查器(ProgressCheatBlocker)(有时也称为 PCB 或者启发式检测算法)是由 PeerBanHelper 创建的基于下载进度的一种启发式的反吸血检测算法。
概述
传统的反吸血通常依靠检查 PeerID 或者 ClientName 来屏蔽。这对于迅雷或者QQ旋风这种如实报告自己 PeerID 的 Peer 效果不错。但如果恶意吸血者冒充了 qBittorrent 或 Transmission 这种正常客户端,那么传统的反吸血手段就会完全失效。
PeerBanHelper 会持续追踪所有活动种子上的活跃 Peers,实时追踪它们的进度情况。在出现下面的情况时,PeerBanHelper 就会封禁它们:
- Peer 不汇报自己的进度,一直保持为 0%
- Peer 不如实汇报自己的进度,汇报的进度与实际下载了的进度不符
- Peer 断开重连后进度归零,或者进度变少超过一定值(进度回退)
- Peer 在下载了 100% 种子体积大小后,没有断开连接而是仍然持续下载(超量下载)
对于进度检查器来说,其进度判定不是基于单个 IP 地址,而是基于 “IP 组”。同一个组里的 IP 地址都被视为同一个 Peer,不论 IP、端口、PeerID、ClientName 是否相同。
- 对于 IPv4,这个组的默认大小是
/32
,也就是 1 个 IPv4 地址 - 对于 IPv6,这个组的默认大小是
/60
,通常是路由器得到的 IPv6 前缀大小
PBH 持续追踪 Peer 的下载进度,并计算其上传量和上传增量。当 Peer 的统计数据由于某种原因重置了(例如更换端口和PeerID),PBH 会通过之前记录的数据为 Peer 修正进度以避免进度欺骗。
进度差异
PeerBanHelper 会根据下载器数据、本地记录数据和 Peer 汇报数据,综合计算 Peer 当前最少进度。如果 Peer 的进度比最少进度还要少(虚报进度),则 PeerBanHelper 将会封禁 Peer。
过量下载
恶意 Peer 的目的是尽可能多的从受害者处下载数据,因此 PeerBanHelper 会根据下载器数据、本地记录数据和 Peer 汇报数据,综合计算 Peer 已经下载的量。
该计算的下载量不完全依赖下载器,因为攻击者可以轻松欺骗和重置下载器的统计信息。
如果 Peer 下载的数据量超过整个当前用户拥有的数据总大小一定比例(也就是下载了比拥有的种子的总体积还要多的数据),PeerBanHelper 将对其执行封禁操作。
持久化记录
关闭状态下,数据全部保存在内存中。当内存不足或者一段时间没有使用后,数据将会被清空删除。此时 PeerBanHelper 会 “忘记” 之前记录的数据。
启用持久化记录后,在从内存删除前,数据将被保存到数据库中,并在未来需要(且数据未过期时)重新读取载入。可以有效避免攻击者打游击战,避免攻击者进行缓存遗忘攻击。
快速 PCB 测试
一种快速检测算法,当 Peer 的下载进度(计算的)达到 “快速 PCB 测试启动阈值” 后,PeerBanHelper 会短暂封禁对方(默认是 30 秒)以便断开连接,并在稍后解除封禁。一部分恶意客户端在断开连接后,其汇报进度将归零,PCB 反作弊将能够立刻捕捉这种异常情况,加快异常、恶意客户端的封禁速度。减少流量损失。