摘要

  • Sharon Goldberg、Aanchal Malhotra、Isaac E. Cohen 与 Erik Brakke 发现,旧版 ntpd 会接受没有通过起源时间戳校验的伪造 Kiss-o'-Death 响应。
  • 攻击者只需针对每个已配置时间服务器发送一枚伪造包,就可能让客户端按攻击者选择的时长停止同步;持久的防线是把拒绝绑定到真实请求,并给退避时间设置上限。

设想一台机器最后一次校时刚刚完成。下一秒,它收到服务器发来的 RATE:请求太密,请延后再来。客户端照办。接下来的三十六小时里,它不再向这台服务器询问。若配置中的其他服务器也发来同样的答复,外部校时就此消失。

问题在于,这些答复可以一枚枚伪造。2015 年,Aanchal Malhotra、Isaac E. Cohen、Erik Brakke 与 Sharon Goldberg 对 NTP 的研究指出,ntpd 4.2.6 和 4.2.8 的相关处理路径没有验证 Kiss-o'-Death 响应是否真的对应客户端刚才发出的请求。攻击者不必看到那次通信,只要能伪造服务器源地址,就能让客户端自己执行长时间拒绝服务。

这是一类容易被流量指标忽略的攻击。发送成本按“每个时间来源一枚包”计算,后果却按“客户端未来多久不再询问”计算。控制权藏在状态变化里,而不是带宽里。

一次答复本来就有自己的回执

普通 NTP 交换已经携带用于绑定请求与响应的材料。客户端发出 mode 3 请求,把发送时间写入报文;服务器返回 mode 4 响应时,应把这个值回填到起源时间戳字段。NTP 的 TEST2 检查据此判断:眼前这份答复,是否属于尚未完成的那次询问。

Kiss-o'-Death,简称 KoD,是一种特殊的 mode 4 响应。它的闰秒指示器为 3、层级为 0,参考标识字段存放四字符拒绝码。DENY 与 RSTR 表示拒绝服务,RATE 要求拉长轮询间隔。共享时间服务器必须有办法保护自己,这套机制的目的并不荒谬。

漏洞出现在客户端如何赋予它权威。论文测试的版本即使看到不匹配的起源时间戳,仍会接受 KoD。于是,本应用来证明“这是对你那次请求的答复”的字段被闲置了;一枚离路径伪造包就能冒充正在对话的服务器。

轮询值采用二的幂次表达。值 17 意味着至少等待 2^17 秒,约三十六小时。研究者还发现,客户端接受规范设想范围以外的更大数值;值 25 大约对应一年。发送动作一闪而过,安装到客户端里的沉默状态却可能跨过维护窗口、日志保留期与人员轮班。

找到当前服务器,再逐个抹去

直接攻击需要知道受害客户端的 IP 地址,以及它正在使用哪台 NTP 服务器。研究团队展示了一条现实路径:攻击者先向客户端发 mode 3 查询;若这是一个已经同步的 IPv4 客户端,它返回的 mode 4 响应中,参考标识可能泄露当前服务器地址。

随后,攻击者伪造来自这台服务器的 KoD。客户端若切换到配置里的下一台服务器,再重复一次。攻击并非试图欺骗全球时间体系,而是逐个移除本机信任的校时来源。当前服务器、备用服务器、再下一台——每个来源只需一枚被接受的控制包。

实验室里,团队让 ntpd 4.2.8p2 配置三台公开服务器。大约九十分钟后,第三枚 KoD 也已触发。研究者停止实验,客户端此后仍连续五十小时没有发出请求,而伪造包要求的最低沉默期约为三十六小时。

周期性补发 KoD 可以继续维持状态,但第一轮已经暴露设计的不对称:攻击者承担瞬时成本,接收方承担长期行为。许多限流系统只问“调用者是否不停发送”,却没有问“一个限流答复能否独自改变接收者未来一年的行为”。

论文在 2015 年扫描得到的结果显示,超过 1300 万个 IPv4 地址会对第一步所需的查询作出相应响应。这个数字只描述当时的测量条件,并不是今天的易受攻击设备数量。目标还必须处理 KoD,并通过同步状态暴露 IPv4 服务器;响应查询不等于完整漏洞成立。

停止校时,不等于任意改时

伪造 KoD 不会直接把受害者的时钟拨到攻击者指定的时刻。它切断的是校正输入。失去服务器样本后,客户端依靠本地时钟自由运行,误差如何积累取决于振荡器、虚拟化环境、CPU 负载与校时实现。

一台稳定物理机可能慢慢漂移,虚拟机或高负载系统可能更快失准。认证、日志排序、分布式数据库、证书检查和定时任务都可能受影响,但容忍区间各不相同。因此,证据边界必须守住:论文证明攻击者能长期移除外部校正,却没有证明每个目标会在同一时刻产生同样偏差。

这也是事件调查需要保留的链条:最后一次成功同步的时间、接收到的 KoD、起源时间戳验证结果、实际应用的轮询值、本地保持精度,以及哪些业务消费了这份时间。只看到后来出现的时钟偏差,不能反向填补中间缺失的因果记录。

修补的不只是一个比较语句

NTP Project 的 Bug 2901 安全通告把 4.2.8p4 之前的版本列入直接伪造攻击影响范围。4.2.8p4 开始验证 KoD 的起源时间戳。攻击者不能再凭空造一份看似合格的离路径拒绝;报文必须带回一次真实请求里的值。

这仍不是密码学身份认证。论文还讨论了成本更高的“引水泵”办法:攻击者伪造大量来自受害者的查询去轰击真实服务器,诱使服务器真正对受害者限流,再让它产生带有效回显的 KoD。相比直接伪造,这条路径需要更多流量,常见的退避也较短,例如轮询值 10,约十五分钟,而不是任意一年。

2019 年发布的 RFC 8633 把两道防线写得更完整。客户端只有在起源时间戳有效时才能接受 KoD;对于 RATE,客户端应自行设定合理的最大间隔,且不得超过轮询值 13,也就是两小时。文档还提醒:即使只有一次请求,只要它携带异常巨大的轮询值,本身就可能是攻击信号。

请求绑定回答“这是谁的问题的答案”;身份认证回答“谁在说话”;本地上限回答“即便是真的,我最多服从多久”。三者处理的是不同风险。缺少全面认证时,后两道较便宜的约束尤其不能省略。

研究把规范、实现和互联网放在同一张桌上

Boston University 对 Goldberg 的介绍提到,她把密码学、博弈论与算法同网络测量、建模和仿真结合。NTP 研究正体现了这种姿态:规范提供应有的报文语义,代码与实验显示实际接受条件,扫描估算攻击前提在当时互联网中的可见范围,负责任披露则检验发现能否变成可部署的修复。

这项成果属于四位作者。项目页面记载,团队在 2015 年 8 月 20 日开始负责任披露;Network Time Foundation、NTPsec、Cisco 与 Red Hat 在 10 月 21 日公开之前发布补丁。把 Goldberg 作为人物主线,不应把 Malhotra、Cohen 与 Brakke 从方法和功劳中抹去。

它留下的问题早已超出 NTP。系统收到“稍后重试”“停止”“拒绝”“隔离”或“退订”时,这条负面消息与哪次请求绑定?发送者是否可信?时长由谁决定?本地上限是多少?接收者沉默期间,运维人员还能看到什么?

负面消息不是普通错误,它在命令未来。KoD 之所以危险,是因为伪造它很便宜,等它失效却很昂贵。可靠的控制面应把这笔账倒过来:证明上下文、限制退避、记录状态变化,不让礼貌的服务器保护信号成为隐形的长期租约。

来源