导语:APT 是 Debian/Ubuntu 的打包器,签名校验是它最后一道防线。这次这道防线被一个重定向加一次 500 打穿了:中间人能让机器装上自己的未签名包,并以 root 执行。

一、这次被点名的是”打包器”本身
APT 是 Debian 和 Ubuntu 的软件包管理器,它背后的 Archive 签名体系是整条软件分发链路里最硬的那块信任基石——下载可以丢包、被劫持、被限速,但只要签名对不上,包就不会被装进系统。
这次基石被敲出了一道缝。漏洞编号 CVE-2026-109518,由安全研究员 Max Justicz 报告。11 月 4 日同一天,上游 APT 开发者、Debian、Debian LTS 与 Ubuntu 各自发布通告(APT-2026-11-01、DSA-6607-1、DLA-4880-1、USN-8996-1),修得相当整齐。评级上 APT 开发者自己写的是 critical,Canonical 给的是 High、CVSS 4.0 打 7.7 分,攻击向量 AV:N、权限要求 PR:N、用户交互 UI:P。
二、一个重定向加一次 500,签名校验就被绕开
上游通告里的描述很直白:攻击者利用重定向和”普通的临时性 HTTP 服务错误”诱使 APT 重试下载,导致 APT 用攻击者选定的载荷覆盖已有的硬链接。DLA-4880-1 说得更细:HTTP 重定向会让两次不同的下载拿到同一个 URI,断点续传时的文件处理存在缺陷,中间人因此能在”验证之后、落地之前”把包换掉。CVE 被归类为 CWE-62(UNIX 硬链接)与 CWE-367(TOCTOU)。

绕过的前提条件有三条,缺一不可。其一,APT 客户端必须跟着重定向走;其二,必须发生一次重试,这由 Acquire::Retries 控制,该值从 APT 2.3.2 起默认非 0(等于 3),也就是说 Debian 12 与 Ubuntu 22.04 起默认中招,更老的版本默认安全,但很可能早被你自己的脚本悄悄打开过;其三,机器此刻正在装包——.deb 安装时会以 root 执行 maintainer 脚本,于是”装上去了”直接等于”拿到 root 了”。而攻击者只需要一个恶意镜像站,或者一个会动手的代理,不需要任何 0day。
三、谁在射程之内
Ubuntu 一次性放出了全部八个在支持周期的修复版本,Debian 则覆盖 bookworm、trixie、bullseye 与 unstable:
| 发行版 | 修复版本 | 说明 |
|---|---|---|
| Ubuntu 26.10 (stonking) | 3.3.3ubuntu0.1 | 默认受影响 |
| Ubuntu 26.04 LTS (resolute) | 3.2.1ubuntu0.1 | 默认受影响 |
| Ubuntu 24.04 LTS (noble) | 2.8.4ubuntu0.1 | 默认受影响 |
| Ubuntu 22.04 LTS (jammy) | 2.4.15ubuntu0.1 | 默认受影响 |
| Ubuntu 20.04 / 18.04 / 16.04 / 14.04 | 2.0.12+esm1 / 1.6.19+esm1 / 1.2.36+esm1 / 1.0.1ubuntu2.24+esm4 | 需 Ubuntu Pro |
| Debian 13 (trixie) | 3.0.4 | DSA-6607-1 |
| Debian 12 (bookworm) | 2.6.2 | |
| Debian 11 (bullseye) | 2.2.5 | LTS 已于 8 月 31 日结束 |
| Debian unstable (sid) | 3.3.6 | forky/testing 当时仍为有漏洞的 3.3.5 |
几个值得留意的边角:截至 11 月 4 日 14:58 UTC,Debian testing 仍跑在有漏洞的 3.3.5 上;15:46 UTC 时,Ubuntu 仍把自己跟踪的全部八个版本标成 vulnerable。Canonical 还特别点名了基于 Debian/Ubuntu 构建的其他发行版,但没说是哪些。snap 走的是另一套打包机制,不受影响;FTP 传输同样不受影响。目前没有任何通告提到在野利用。
四、动手之前,先做这三件事
先查自己装的是哪一版:
apt list --installed '?source-package(^apt$)'
装补丁的时候顺手把重试关掉,这是 Canonical 给的止血姿势:
sudo apt update && sudo apt upgrade -o Acquire::Retries=0
只想升 apt 本体的话:
sudo apt update && sudo apt install -o Acquire::Retries=0 --only-upgrade '?source-package(^apt$)'
然后把软件源全换成 HTTPS,让明文链路上没有中间人可插:
sudo sed -Ei 's!http://((([a-z]+.)?archive|security|ports).ubuntu.com)!https://1!' /etc/apt/sources.list /etc/apt/sources.list.d/*.list /etc/apt/sources.list.d/*.sources
要注意社区镜像未必支持 HTTPS,替换完记得跑一次 apt update 看有没有报错。另外 Ubuntu 16.04 以后 unattended-upgrades 默认开启,补丁通常会在 24 小时内自己装上。Canonical 也提醒:签名体系是端到端的完整性保障,TLS 只是过渡手段,两者不能互相替代。

五、紫队视角:漏掉的不是补丁,是信任模型
站在看客位置复盘,这条链是教科书级别的红蓝对照。
红队这边几乎零成本:不要 0day,不要钓鱼,只要能待在你和软件源之间,再让服务器”抖”一下吐个 500,剩下的活 APT 替他们干了。蓝队这边则有点冤——签名校验一直在岗,是 APT 自己在断点续传时对硬链接的处理,让校验和落地之间裂了条缝,攻击者从缝里挤了过去。
真正该紧张的是那些”装包频率远高于审补丁频率”的环境:CI/CD 构建机、跑 apt 的容器镜像流水线、还在用 HTTP 源的厂内源站。Canonical 说 TLS 能挡住路径上的攻击者,话也说得很实在:签名体系才是更强的那道防线,而现在这道防线漏了。
这事儿吧,得从两边看——红队这波操作我给满分,一条重定向就撬开了整条供应链;蓝队这招防守呢,补丁必须当天进基线,不然下一次抖动的 500 还不知道会换来什么。
版权声明:本文由华盟网原创发布,保留所有权利。配图由华盟网授权使用。














暂无评论内容