哈希校验通过后换包:apt 漏洞让中间人拿 root

哈希校验通过后换包:apt 漏洞让中间人拿 root

LinuxDebianUbuntu安全漏洞供应链安全

数据源:Debian Security + StepSecurity · HN

每一个 GPG 签名都通过了公钥验证。每一个 SHA256 哈希值都与官方索引吻合。最终安装进系统的二进制文件,却属于链路中间的攻击者。

2026 年 11 月 4 日,Debian 发布 DSA-6607-1,Ubuntu 发布 USN-8996-1。两家主流发行版联合修复了底层包管理器 apt 的高危漏洞 CVE-2026-109518。维护团队在内部通告中直接将其定性为 critical。密码学校验保护了传输数据,却无法保证文件在验签后到安装前不被掉包。

三步完成掉包:校验与安装产生时间差

这次攻击属于典型的检查时间到使用时间(TOCTOU)缺陷。漏洞编号为 CVE-2026-109518,CVSS v4.0 评分为 7.7。包管理器在处理网络传输时,未能将验签操作与安装绑定为原子事务。攻击者利用标准 HTTP 协议交互,无需破解密码算法即可调换文件。

攻击过程分为三个步骤。首先是合并下载任务。攻击者控制网络流量,对两个不同软件包的请求返回相同的 HTTP 重定向。apt 受到误导,把两次下载任务合并指向同一个本地临时文件。

随后是触发异常重试。攻击者在传输中途故意返回临时的 HTTP 服务端错误。由于链路受到控制,中间人可以在任意精准的时间点触发这一状态。apt 随即启动断点续传机制,重新发起网络请求。

最后是校验后的文件覆盖。apt 处理合并下载的硬链接逻辑存在缺陷。哈希校验顺利通过后,续传逻辑将硬链接文件覆写为恶意载荷。重试续传覆写了刚通过校验的文件,导致 dpkg 随后直接安装恶意代码。

通过校验的 apt 包在安装前被硬链接续传覆盖换掉 图:通过校验的 apt 包在安装前被硬链接续传覆盖换掉。来源:StepSecurity 分析

默认重试 3 次:偶发缺陷变成确定利用

网络条件竞争通常伴随不确定性。然而 apt 自身的一项配置改动,消除了这种不确定性。从 2.3.2 版本起,配置参数 Acquire::Retries 的默认值从 0 提高到了 3。这项改动覆盖了 Debian 12 与 Ubuntu 22.04 及其后的所有发布版本。

默认重试机制的初衷是应对网络波动。但面对受控链路时,它将苛刻的时序窗口变成了攻击者的调度工具。攻击者无需猜测时序。他们只要人为构造错误响应,就能在指定节点触发覆盖。一次普通的软件包安装命令,便足以稳定触发提权。

该漏洞由安全研究员 Max Justicz 发现并提交。2019 年,同一位研究员曾披露过著名的 CVE-2019-3462 漏洞。两次严重缺陷均集中在 apt 的 HTTP 协议解析与下载处理代码中。老旧传输模块长期缺乏重构,使类似的状态机死角在时隔多年后再度暴露。

执行即交出 root:CI 与容器构建首当其冲

软件包管理在 Linux 系统中拥有极高权限。dpkg 安装 deb 包时,必然会以 root 身份执行其中的维护脚本。这些脚本包括安装前执行的 preinst 与安装后触发的 postinst。一旦恶意包潜入系统,攻击者立即获得宿主机的无限制控制权。

自动化构建环境受到的威胁最为直接。持续集成(CI)工作节点在每次流水线任务中频繁拉取基础包。被劫持的构建节点会导致云平台凭据与代码私钥外泄。恶意依赖一旦打入容器镜像,污染还会随着镜像分发扩散至下游集群。

受影响的范围覆盖了全部常用包管理入口。终端命令 apt 与 apt-get、高级管理工具 aptitude,以及各类桌面应用中心均受波及。由于漏洞存在于 libapt 的 HTTP 传输实现中,前端工具均无法幸免。相比之下,采用沙盒隔离的 snap 包与基于 FTP 协议的软件源未受影响。

CVE-2026-109518 影响范围与关键修复版本 图:CVE-2026-109518 影响范围与关键修复版本。来源:Rescana

明文传输遭遇状态机漏洞:单层签名难防时间差

该漏洞再次激发了发行版软件源传输协议的路线之争。Debian 长期默认使用明文 HTTP 源,这建立在其密码学设计之上。官方认为 Release 索引包含软件包哈希,且带有官方归档密钥的 GPG 签名。即使镜像站被攻击者篡改,客户端也能在比对校验时阻断安装。

明文 HTTP 源在分发效率上具备显著优势。本地缓存代理无需配置证书,即可直接对网络请求进行跨节点复用。镜像站摆脱了 TLS 握手开销。去中心化架构为开源社区节约了可观成本。

主张推进 HTTPS 的安全团队指出了这种设计的前提漏洞。明文信道直接向中间人暴露了主机安装的软件清单。缺乏传输层防护,链路控制者可以随意注入重定向指令与伪造错误响应。单层签名依赖原子读写,传输通道失守直接激活了本地状态机缺陷。

修补存在依赖循环:更新命令必须跨过污染链路

Debian 与 Ubuntu 团队在确认问题后发布了修复版本。Debian 12 升级至 2.6.2,Debian 13 升至 3.0.4,unstable 分支更新为 3.3.6。Ubuntu 22.04 推进至 2.4.15ubuntu0.1,Ubuntu 24.04 推进至 2.8.4ubuntu0.1。补丁修正了硬链接与续传的交互逻辑,禁止续传覆写已经校验完成的本地实体。

然而更新过程本身带来了一场微型自举困境。系统管理员必须运行存在漏洞的 apt 命令,才能拉取到修复后的软件包。在已经遭到网络劫持的环境中,升级操作本身便属于高风险暴露行为。

运维工程师可以通过受信任渠道手动下载补丁,使用 dpkg -i 完成离线安装。将软件源临时切换为 HTTPS 域名,同样能阻断中间人注入重定向的可能。这些操作增加了运维步骤,却有效封堵了网络层面的状态劫持。

自查版本只需要一条命令:apt --version。Debian 12 需要 2.6.2 及以上,Debian 13 需要 3.0.4,Ubuntu 22.04 需要 2.4.15ubuntu0.1,Ubuntu 24.04 需要 2.8.4ubuntu0.1。在尚未完成升级、又必须装包的窗口期里,把源切成 HTTPS 镜像可以直接掐掉重定向注入的前提。

算法本身并未被击穿。真正出现漏洞的,是「校验通过的文件必然是最终安装的文件」这一隐性假设。当校验与执行之间存在时序缝隙,防线便会在文件系统交互中被轻易绕过。供应链安全的边界不能止步于比对哈希。确保从验证到调用的全流程原子性,才是抵御中间人提权的真正基石。

参考链接:

  • Debian 安全公告 DSA-6607-1
  • Ubuntu 安全通知 USN-8996-1
  • StepSecurity 分析报告
  • Max Justicz 安全披露报告