Tor 的工作量证明防御:让洋葱服务的拒绝服务攻击变得昂贵
遭遇洪泛的 onion 服务做不到普通网站能做的事:没有可以限流的 IP 地址,因为访客和攻击者都不会暴露自己的 IP。Tor 的答案随 Tor 0.4.8 交付,并于 2023 年 8 月在项目博客上公布:给介绍环节按处理器时间重新定价。这一设计源自 proposal 327,由 George Kadianakis、Mike Perry、David Goulet 与 tevador 于 2020 年 4 月起草,它把核心问题说得直白:构建 rendezvous 电路对服务和网络都很昂贵,而单靠限速从未改变这一点。
只在高负载时出现的谜题
从协议意义上讲,该方案是透明的:没有额外的挑战往返。谜题参数就放在客户端本来就要获取的 onion 服务描述符里——一个版本标签、一个 32 字节种子(seed)、一个建议工作量值和一个过期时间。只要建议工作量保持为零,防御就处于休眠状态,介绍流程与从前完全一样。 当服务检测到过载时,它会提高建议工作量。客户端随后运行 proposal 中规定的谜题函数 Equi-X,挑战串由个性化字符串、盲化后的服务 ID、种子、一个 16 字节随机数(nonce)和所选工作量拼接而成。约 43 字节的解作为扩展搭载在 INTRODUCE1 单元里。据 Tor 博客,首次求解在快机器上约需 5 毫秒,较慢的硬件上可达 30 毫秒左右;在持续攻击下,所需工作量可能攀升到接近一分钟的算力。队列按工作量付费
校验一个解被刻意设计得很便宜;昂贵的部分——构建 rendezvous 电路——则被推迟。通过校验的请求进入按申报工作量排序的优先级队列,较旧的条目在平局时优先,调度器以受控速率将其排空。难度以 300 秒为窗口遵循加性增长、乘性衰减的循环:队列持续饱和时,服务把工作量提高到「上一值加一」或已处理介绍的平均工作量中较大者;压力回落时,工作量衰减约三分之一。客户端以递增的工作量重试——低于 1,000 时翻倍,之后乘以 1.5——处在规范设定的 8 与 10,000 上下限之间。种子约每两小时轮换一次,旧种子会短暂继续有效以避免竞态。为什么普通用户几乎察觉不到
因为谜题只在服务承压时存在,低负载下的普通流量分文不付。攻击期间点开几个页面的用户只花费几毫秒——博客将其比作在缓慢连接上等待——而倾泻数百万个介绍请求的攻击者要为每一个买单。Tor Project 对这一设计的概括:"Blocks attackers while giving real users a chance to reach their destination"——Tor Project 博客,2023 年 8 月
服务如何启用
运营者通过 torrc 控制这道防线。项目 onion 服务 DoS 指南中记录的开关:- HiddenServicePoWDefensesEnabled——在描述符中发布谜题并开启按工作量排序的队列
- HiddenServicePoWQueueRate 与 HiddenServicePoWQueueBurst——已校验请求从队列排出的速度
- CompiledProofOfWorkHash——选择谜题所用哈希函数的全局选项










