我们的 AI 引擎 Neutron 在加州大学伯克利分校的 CyberGym 基准测试中取得了 97.1% 的成绩。 了解更多

深度解析

深度解析

Debian 和 Ubuntu 的 APT 可被替换软件包并以 root 执行代码(CVE-2026-109518)

Debian 和 Ubuntu 上的 APT 在重定向和重试后可能安装攻击者的软件包,使路径上的攻击者获得 root 权限;已在 3.3.6 和 3.0.4 中修复。

TL;DR

  • APT 可能被诱骗安装攻击者提供的软件包,而不是它已验证的软件包。网络路径上的恶意镜像或代理会在软件包安装期间触发该问题。
  • Debian 12 及更高版本、Ubuntu 22.04 及更高版本,以及继承其 APT 配置的衍生发行版,默认启用下载重试。Debian 11 和 Ubuntu 20.04 仅在启用重试时受影响。
  • Ubuntu 按 CVSS v4.0 将该漏洞评为 7.7 High。截至 2026 年 11 月 5 日,CVE-2026-109518 未列入 CISA 的 KEV 目录,也没有已知利用。
  • 请将 APT 升级到您所用发行版的修复版本。如果暂时无法升级,可将 Acquire::Retries "0" 作为临时缓解措施;请参阅“如何修复?”。

我受影响吗?

系统必须同时满足以下条件才会受影响:

  • 机器上的 APT 低于其发行版的修复版本。
  • 机器通过攻击者可修改的网络路径安装软件包,例如 HTTP 镜像或代理。
  • Acquire::Retries 不为 0。Debian 12 和 Ubuntu 22.04 起该值默认为 3,因此更早的发行版在默认配置下不受影响。
  • 攻击者位于该路径上时有软件包安装发生,并且 APT 跟随重定向并重试下载。

Debian 和 Ubuntu 的默认归档 URL 使用 HTTP,路径上的攻击者可以修改响应。各公告描述的是 HTTP 攻击。它们没有说明通过 HTTPS 访问的源是否受影响。Debian 11 和 Ubuntu 20.04 默认不受影响,但用户脚本可能已在它们上面启用了重试。

分支 受影响版本 修复版本
Debian unstable(sid) 低于 3.3.6 的 apt 3.3.6
Debian testing(forky) 3.3.5 及更早的 apt 暂无;3.3.6 已进入 unstable
Debian 13(trixie) 低于 3.0.4 的 apt 3.0.4(DSA-6607-1)
Debian 12(bookworm) 低于 2.6.2 的 apt 2.6.2(DLA-4880-1)
Ubuntu 26.10 低于 3.3.3ubuntu0.1 的 apt 3.3.3ubuntu0.1
Ubuntu 26.04 LTS 低于 3.2.1ubuntu0.1 的 apt 3.2.1ubuntu0.1
Ubuntu 24.04 LTS 低于 2.8.4ubuntu0.1 的 apt 2.8.4ubuntu0.1
Ubuntu 22.04 LTS 低于 2.4.15ubuntu0.1 的 apt 2.4.15ubuntu0.1
Ubuntu 20.04 LTS 低于 2.0.12+esm1 的 apt 2.0.12+esm1(Ubuntu Pro)
Ubuntu 18.04 LTS 低于 1.6.19+esm1 的 apt 1.6.19+esm1(ESM)
Ubuntu 16.04 LTS 低于 1.2.36+esm1 的 apt 1.2.36+esm1(ESM)
Ubuntu 14.04 LTS 低于 1.0.1ubuntu2.24+esm4 的 apt 1.0.1ubuntu2.24+esm4(ESM)

Debian 11 已超出长期支持窗口,Debian 跟踪器没有为其列出修复软件包。CVE 记录将 2.2.5 列为 2.2.x 分支的第一个修复构建。请检查已安装的版本:

apt --version
dpkg-query -W -f='${Version}\n' apt

apt --version 会输出类似 apt 3.0.3 (amd64) 的一行。将完整的已安装版本与您发行版的修复版本比较:3.0.3 低于修复版本 3.0.4。向后移植可能使用不同的版本字符串,因此如果版本看起来低于表格中的版本,请先查看发行版的安全公告,再判断机器未修复。

如何修复?

由于升级本身也通过 APT 下载,请先应用缓解措施,再升级,然后决定是否保留该措施。

  1. 创建重试设置。这会移除攻击所需的重试。

bash printf 'Acquire::Retries "0";\n' | sudo tee /etc/apt/apt.conf.d/99-no-retries sudo apt-config dump | grep -i 'Acquire::Retries'

当文件被读取时,第二条命令会输出 Acquire::Retries "0";。

  1. 在 Debian 上升级 APT:

bash sudo apt update sudo apt install --only-upgrade apt

  1. 在 Ubuntu 上升级 APT,包括可通过 Ubuntu Pro 获得该软件包的 ESM 发行版:

bash sudo apt update sudo apt install --only-upgrade apt

  1. 用 apt --version 确认新版本,然后在每台安装软件包的机器和容器镜像上重复操作。

  2. 保留 /etc/apt/apt.conf.d/99-no-retries,或在升级后删除它。删除后会恢复默认重试行为,防护将依赖已修复的 APT。

Debian 的公告是 DSA-6607-1,Ubuntu 的公告是 USN-8996-1。修复是提交“methods: Open target files exclusively”。

该临时措施的局限:

  1. 它阻止 APT 重试失败的下载,而这正是攻击所需的步骤。披露讨论将其描述为升级前的缓解措施。
  2. 它会降低容错能力。临时镜像错误现在会导致安装失败而不是重试,因此繁忙或不稳定的镜像会产生更多失败。
  3. 它不会使下载代码变安全。二进制文件中仍存在原地写入,未来任何无需重试即可恢复下载的路径都不在覆盖范围内。

该临时措施仅覆盖 CVE-2026-109518。它不处理同一批 APT 版本中修复的其他问题。

根本原因是什么?

APT 是解析依赖、下载 .deb 文件并交给 dpkg 的软件包管理器。它的 HTTP 方法将每次下载写入由请求 URI 推导出的目标文件。恢复下载时,它会打开该文件并在指定偏移处写入。

有漏洞的代码在打开目标文件时没有使用独占创建标志。修复前 methods/http.cc 的相关片段如下:

auto ret = BaseHttpMethod::DealWithHeaders(Res, Req);
if (ret != BaseHttpMethod::FILE_IS_OPEN)
   return ret;
if (Req.File.Open(Queue->DestFile, FileFd::WriteAny) == false)
   return ERROR_NOT_FROM_SERVER;

Queue->DestFile 是下载的本地路径。Req.StartPos 是要恢复的字节偏移。FileFd::WriteAny 以写入方式打开现有文件,文件不存在时创建它,但不要求文件是新的。因此,打开操作会跟随现有目录项并写入其 inode。该路径上的硬链接或符号链接会被跟随,而不是被替换。

Debian 的公告描述了后果:当 HTTP 重定向使两个不同软件包的下载获得相同 URI 时,APT 可能合并它们。两个队列随后使用同一个目标文件。当其中一个下载恢复时,其字节会写入另一个队列已经验证过的文件。dpkg 安装的软件包并不是 APT 校验过哈希的那个软件包。

如何被利用?

  1. 攻击者位于 APT 客户端与归档之间的路径上,例如恶意镜像、代理或攻击者控制的网段。
  2. 在软件包安装期间,攻击者用 HTTP 重定向响应软件包请求,其目标 URI 与 APT 队列中另一个下载相同。
  3. APT 为两个下载分配同一个目标文件。
  4. 攻击者返回临时服务器错误,迫使 APT 重试下载。APT 默认通过 Acquire::Retries 3 重试。
  5. APT 用 WriteAny 重新打开现有目标文件,并从之前的偏移继续写入,因此重试的字节落入已验证的 inode。
  6. 被替换的软件包由 dpkg 以 root 权限安装,其维护脚本以 root 身份执行。

目前没有公开的利用代码。这些步骤依据 Debian 公告和修复提交中的机制,而不是已公开的概念验证。

攻击如何展开?

该链条需要路径上的攻击者、合并两个下载的重定向,以及重新打开已验证文件的原地重试。

flowchart LR A["路径上的攻击者
恶意镜像或代理"] --> B["将两个下载重定向
到同一 URI"] B --> C["APT 复用一个目标文件"] C --> D["HTTP 错误迫使重试"] D --> E["恢复下载原地打开文件
没有独占创建"] E --> F["已验证的软件包被替换
在哈希校验之后"] F --> G["dpkg 以 root 安装
攻击者的软件包"]

攻击者能做什么?

替换成功后,当受害者安装被替换的软件包时,会以 root 执行任意代码。软件包的维护脚本以 root 运行,因此攻击者获得该主机上 root 能做的所有事情。

影响需要同时满足以下条件:

  • 攻击者能修改 APT 与归档之间的 HTTP 流量,或控制受害者使用的镜像或代理。
  • 受害者的 APT 中 Acquire::Retries 不为 0,这是 Debian 12 和 Ubuntu 22.04 起的默认值。
  • 攻击者能让 APT 跟随一个重定向,使两个下载获得同一 URI。
  • 攻击期间发生软件包安装,并且攻击者能强制触发恢复所需的这次重试。

已经能修改归档流量的攻击者,只有在客户端接受时才能提供恶意软件包。仓库元数据的签名校验可阻止来自未签名仓库的伪造软件包。该漏洞在 APT 验证之后替换软件包,从而绕过这一边界。目前没有已知的真实环境利用,也没有公开的概念验证。

为什么修复有效?

修复以独占标志打开每个下载目标文件。methods/http.cc 中新增的代码如下:

// If we are resuming, we first need to rescue the data we already have
FileFd partial;
if (Req.StartPos > 0 && FileExists(Queue->DestFile))
{
   if (not partial.Open(Queue->DestFile, FileFd::ReadOnly))
      return ERROR_NOT_FROM_SERVER;
}
// Open the file exclusively to avoid injection attacks by links
if (Req.File.Open(Queue->DestFile, FileFd::WriteAny | FileFd::Exclusive) == false)
   return ERROR_NOT_FROM_SERVER;
if (partial.IsOpen())
{
   // The exclusive open unlinked the old file; copy its content
   // into the new one and rewind for hashing.
   if (not CopyFile(partial, Req.File) || not partial.Close() || not Req.File.Seek(0))
      return ERROR_NOT_FROM_SERVER;
}

FileFd::Exclusive 拒绝打开已存在的文件。在此路径中,APT 先通过单独的只读句柄读取部分文件。然后它为下载创建新文件。

目标位置的硬链接或符号链接不再收到写入。旧目录项被解除链接,并创建新的 inode。恢复的字节被复制到新文件,因此 APT 验证的文件和安装的文件是同一个新 inode。

该提交对 rred 补丁方法和 store 方法应用相同的独占打开。它还新增了一个集成测试,分别下载到硬链接和指向受害文件的符号链接。测试确认受害文件未被修改。对于该提交修改的写入路径,修复是完整的。它没有移除重试行为,而是使恢复写入变得安全。

如何检查是否已遭入侵?

目前没有公布入侵指标。替换成功后会留下攻击者的软件包,已安装文件和 dpkg 记录的校验和都与该软件包一致,因此机器上看不出矛盾。线索是与官方软件包索引的不一致,即本节两项检查中的第一项。失败的尝试可能不留痕迹。

以下两项检查可以缩小范围:

  1. 对暴露窗口内 APT 安装的每个软件包,从官方归档通过 HTTPS 下载相同版本,并将其文件校验和与 dpkg 安装时记录的校验和比较。

bash v=$(dpkg-query -W -f='${Version}' apt) apt-get download "apt=$v" dpkg-deb -I apt_*.deb md5sums | diff - /var/lib/dpkg/info/apt.md5sums

请使用指向官方归档且走 HTTPS 的软件源运行,并对该期间安装的每个软件包重复执行。dpkg 记录的是它解包出的文件的校验和,而不是 .deb 的哈希,因此被替换的软件包会带来与自身一致的清单。

与官方软件包的任何差异都是线索,因为镜像或代理可能替换了文件。这本身不是证据,因为本地重新构建也会改变校验和。

  1. 将已安装版本与发行版的归档比较:

bash apt-cache policy apt

不在归档候选列表中的版本是线索。被替换的软件包可以保留其声明的版本,因此版本一致并不能证明主机安全。

如果一台通过 HTTP 安装过软件包的机器出现无法解释的校验和或版本不一致,请将其视为可能已被入侵。从可信镜像重建主机,并轮换它持有的凭据。

时间线

  • 2026-10-12:修复提交“methods: Open target files exclusively”编写并提交,CVE 同日预留。
  • 2026-11-04:CVE-2026-109518 于 15:49 UTC 公布。Debian 发布 DSA-6607-1 和 DLA-4880-1,Ubuntu 发布 USN-8996-1。
  • 2026-11-04:Ubuntu 于 14:25 UTC 将针对 26.10、26.04 LTS、24.04 LTS 和 22.04 LTS 的修复版 APT 发布到其安全归档。

修复于 10 月 12 日提交,公开公告在 23 天后的 11 月 4 日发布
图 1:修复提交比公开公告早 23 天。来源:APT 修复提交和 CVE-2026-109518 记录,2026 年 11 月 5 日检查

常见问题

仅靠 HTTPS 能阻止该漏洞吗?

各公告描述的是 HTTP 攻击,没有说明 HTTPS 源是否受影响。尽可能使用 HTTPS 镜像,但不要把 HTTPS 当作修复版 APT 的替代品。该漏洞在于下载后文件的写入方式,而不只是通道是否加密。

我使用 Debian 11 或 Ubuntu 20.04,会受影响吗?

在默认配置下不会。Acquire::Retries 在 Debian 12 和 Ubuntu 22.04 之前不是默认值,而攻击需要重试。如果脚本或管理员启用了重试,系统就会受影响。CVE 记录将 2.2.5 列为 2.2.x 分支的第一个修复构建,Ubuntu 20.04 可通过 Ubuntu Pro 获得 2.0.12+esm1。

没有路径上的攻击者也能利用吗?

没有公布其他路径。各公告描述的是能操纵 HTTP 流量的攻击者,包括恶意镜像或代理。能在下载路径上创建硬链接的本地非特权攻击者属于另一种威胁模型,修复中的测试也覆盖了该情况。

有公开利用或真实环境利用吗?

没有公开的概念验证,截至 2026 年 11 月 5 日也没有已知的真实环境利用。CVE-2026-109518 未列入 CISA 的 KEV 目录。

Acquire::Retries "0" 能完全修复吗?

它移除了攻击所需的重试,披露讨论将其描述为升级前的缓解措施。它不会改变二进制文件中的原地写入。请安装修复版 APT 软件包作为永久修复。

影响是以 root 执行代码,为什么 Ubuntu 评为 7.7 High?

CVSS v4.0 基础评分会计入攻击所需的条件,即攻击要求存在(重定向和重试)以及被动用户交互(安装)。这些条件使分数降为 7.7 High,但影响仍然很高。Ubuntu 对该 CVE 的优先级为 High。

参考文献

  • Debian,“DSA-6607-1 apt: security update”。https://www.debian.org/security/2026/dsa-6607 (2026 年 11 月 5 日检查)
  • Debian,安全跟踪器“CVE-2026-109518”条目,含修复软件包和 DLA-4880-1 引用。https://security-tracker.debian.org/tracker/CVE-2026-109518 (2026 年 11 月 5 日检查)
  • Debian,“DLA-4880-1 apt: security update”。https://security-tracker.debian.org/tracker/DLA-4880-1 (2026 年 11 月 5 日检查)
  • Ubuntu,“USN-8996-1: APT vulnerability”。https://ubuntu.com/security/notices/USN-8996-1 (2026 年 11 月 5 日检查)
  • Ubuntu,“CVE-2026-109518”。https://ubuntu.com/security/CVE-2026-109518 (2026 年 11 月 5 日检查)
  • CVE Program,“CVE-2026-109518”记录,Canonical CNA,2026 年 11 月 4 日发布。https://www.cve.org/CVERecord?id=CVE-2026-109518 (2026 年 11 月 5 日检查)
  • Jan Schaumann,“CVE-2026-109518: RCE in apt(1) (DSA 6607-1)”,oss-security,2026 年 11 月 4 日。https://www.openwall.com/lists/oss-security/2026/11/04/12 (2026 年 11 月 5 日检查)
  • APT,修复提交“methods: Open target files exclusively”。https://salsa.debian.org/apt-team/apt/-/commit/5af16a8ad0f155233dfb10b7c92ad1903112ef79 (2026 年 11 月 5 日检查)