APT 是 Debian 與 Ubuntu 用來下載、安裝軟體套件的工具。Debian 與 Ubuntu 在 2026 年 11 月 4 日發布更新,修補編號 CVE-2026-109518 的漏洞:能竄改 HTTP 下載流量的攻擊者,可以在套件通過驗證之後把它換成惡意套件,安裝時以 root 權限執行。Debian 12、Ubuntu 22.04 以後的版本在預設設定下都受影響。

APT 開發者在公告中把它標為 critical(重大)的驗證繞過漏洞,Ubuntu 在自己的分級中評為 High(高)。這篇會從 APT 怎麼驗證套件開始,把漏洞原理、受影響的條件、各版本修補、更新指令、暫時解法與自動更新一起整理。

APT 漏洞 CVE-2026-109518 是什麼

APT(Advanced Package Tool)是 Debian 專案開發的套件管理工具,Debian、Ubuntu 以及 Linux Mint、Raspberry Pi OS 等衍生發行版都用它安裝和更新軟體,平常執行的 apt、apt-get 就是 APT 的指令。APT 從套件庫下載 .deb 套件檔,再交給 dpkg 以 root 權限安裝,套件裡的安裝腳本也會以 root 執行,所以安裝到被換掉的套件,等於讓攻擊者取得 root 權限。

APT 用簽章與雜湊確認套件沒被竄改:套件庫的 InRelease(或 Release)檔有 GPG 簽章,裡面列出套件索引檔的雜湊,索引檔再列出每個 .deb 的 SHA256,下載完的套件雜湊對不上就拒絕安裝。因為有這層驗證,Debian 與 Ubuntu 的預設套件來源使用沒有加密的 HTTP,傳輸途中被竄改的檔案會在驗證時被擋下。CVE-2026-109518 讓套件在通過驗證之後還能被換掉,繞過了這層保護。

CVSS(Common Vulnerability Scoring System)是業界通用的漏洞嚴重度評分,滿分 10 分;3.1 與 4.0 是兩個版本的評分標準,計算的項目不同,所以同一個漏洞會有兩個分數。CVE 紀錄由 Ubuntu 的開發商 Canonical 建立,給的是 CVSS 4.0 的 7.7 分;Red Hat 另外給了 CVSS 3.1 的 8.1 分,標示為初步評分。

項目內容
編號CVE-2026-109518
CVSS 4.07.7(Canonical)
CVSS 3.18.1(Red Hat 初評)
影響範圍Debian 12、Ubuntu 22.04 起
回報者Max Justicz
公開日期2026 年 11 月 4 日
CVE-2026-109518 的基本資料

同一次更新也修了幾個越界存取(out-of-bounds)的問題。依 APT 開發者的安全更新公告 ,這些主要是拒絕服務的風險,影響的多半是以 root 執行、會解析外來 .deb 檔的第三方工具。

漏洞怎麼在驗證後換掉套件

攻擊者利用的是 APT 在轉址與重試時對檔案的處理:兩個下載被合併成同一個網址後,重試時寫入的資料會透過硬連結(hard link)蓋到已經通過驗證的套件檔。硬連結是讓兩個檔名指向磁碟上的同一份資料,寫入其中一個,另一個看到的內容也會跟著改變。依 Debian 的安全公告 與 APT 開發者、Ubuntu 的說明,整個過程分成四步:

  1. 轉址讓兩個下載變成同一個網址:攻擊者攔截 HTTP 流量,用轉址(redirect)讓兩個套件的請求變成同一個網址,APT 把兩個下載合併處理。
  2. 暫時性錯誤觸發重試:攻擊者回應暫時性的伺服器錯誤,讓 APT 重試下載。
  3. 續傳寫進硬連結:重試時 APT 會續傳,直接寫入既有的檔案。這個檔案是硬連結時,指向同一份資料的另一個套件檔也會被改掉,已通過驗證的套件就被換成攻擊者的內容。
  4. 以 root 安裝:dpkg 安裝的是被換掉的檔案,套件裡的安裝腳本以 root 權限執行。
CVE-2026-109518 的攻擊流程:第一步轉址讓兩個套件下載變成同一個網址並合併;第二步攻擊者回應暫時性錯誤,讓 APT 重試;第三步重試時續傳寫進硬連結,已驗證的套件檔內容被換掉;第四步 dpkg 以 root 執行惡意套件的腳本;暫時解法是把 Acquire::Retries 設為 0,APT 不重試就走不到第二步
重試續傳讓驗證過的套件被換掉

第二步的重試由 Acquire::Retries 決定,這是 APT 下載失敗時自動重試的次數。CVE 說明寫明 Acquire::Retries 不是 0 才會觸發,設成 0 就不會重試,這也是後面暫時解法的依據。

哪些系統受影響

Acquire::Retries 不是 0 的系統都受影響。APT 從 2.3.2 版起把預設值改成 3,所以 Debian 12(APT 2.6)、Ubuntu 22.04(APT 2.4)以後的版本在預設設定下都受影響。Debian 11、Ubuntu 20.04 以前的版本預設不重試,除非在設定檔或腳本裡自己加過 Acquire::Retries。

攻擊者還必須能竄改 APT 與套件庫之間的 HTTP 流量,例如惡意的鏡像站、代理伺服器,或同一個網路上的中間人。套件來源改用 HTTPS 後,傳輸途中的流量無法被竄改, AWS 的安全公告 說明這可以降低風險,但不能取代更新;CVE 說明也把惡意的鏡像站列為攻擊途徑,鏡像站本身有問題時,HTTPS 一樣擋不住。

檢查主機的 apt 版本與設定

在 Debian 或 Ubuntu 上執行下面三個指令,可以看到目前的 apt 版本、重試設定與套件來源:

# 目前安裝的 apt 版本(Installed 那一行)
apt-cache policy apt
# 有沒有自己設定重試次數,沒有輸出代表使用預設值
apt-config dump | grep -i '^Acquire::Retries '
# 套件來源用 http 還是 https
# 系統沒有 sources.list 時的錯誤訊息可以忽略
grep -rhE '^(deb|URIs:)' /etc/apt/sources.list /etc/apt/sources.list.d/

apt-cache policy 列出的已安裝版本(Installed,中文環境顯示為「已安裝」)等於或高於下一節表格的版本,就已經修補。apt-config dump 有輸出而且不是 0,或沒有輸出、但 apt 是 2.3.2 以後的版本,代表重試開著。grep 列出的網址開頭是 http:// 的來源,下載流量沒有加密。

更新與暫時解法

Debian 與 Ubuntu 在 2026 年 11 月 4 日同時發布修補,各版本修正後的 apt 如下:

發行版修正後的 apt
Debian 13 trixie3.0.4
Debian 12 bookworm2.6.2
Ubuntu 26.103.3.3ubuntu0.1
Ubuntu 26.04 LTS3.2.1ubuntu0.1
Ubuntu 24.04 LTS2.8.4ubuntu0.1
Ubuntu 22.04 LTS2.4.15ubuntu0.1
Ubuntu 20.04 LTS2.0.12+esm1
各版本修正後的 apt 套件版本

Ubuntu 20.04 的修補需要 Ubuntu Pro。Ubuntu Pro 是 Canonical 的延伸支援訂閱,把 LTS 版本的安全性更新從 5 年延長到 10 年,個人使用最多 5 台實體機器免費;18.04 的修補是 1.6.19+esm1,16.04 與 14.04 還需要 Legacy Support 附加方案。Debian 13 的公告是 DSA-6607-1;Debian 12 已進入由 Debian LTS 團隊維護的長期支援階段,修補以 DLA-4880-1 發布。測試版 forky 修正在 3.3.6,unstable 在 3.3.7。

更新時把重試關掉,可以避免下載修補的這一次就觸發漏洞。下面是 AWS 公告建議的指令,upgrade 會升級所有可以更新的套件:

# 更新套件索引
sudo apt-get update
# 升級套件,這一次下載失敗不重試
sudo apt-get upgrade -o Acquire::Retries=0
# 確認 apt 已經是修正後的版本
apt-cache policy apt

只想先更新 apt 的話,把 apt-get upgrade 那行改成 sudo apt-get install --only-upgrade -o Acquire::Retries=0 apt。apt 不是常駐在背景的服務,更新完不用重新開機,下一次執行 apt 就會用新版。

暫時關閉下載重試

還不能更新的主機,可以先把重試關掉。在 oss-security 轉貼 Debian 公告 的 Jan Schaumann 提到,在 APT 設定加上 Acquire::Retries "0"; 可以在更新前緩解;AWS 的更新指令也帶了同一個設定。下面在 /etc/apt/apt.conf.d/ 新增一個設定檔,這個目錄依檔名順序讀取,排在後面的檔案會覆蓋前面檔案的設定:

# 新增設定檔,關閉下載重試
echo 'Acquire::Retries "0";' | sudo tee /etc/apt/apt.conf.d/99-no-retries
# 確認生效,應該輸出 Acquire::Retries "0";
apt-config dump | grep -i '^Acquire::Retries '

/etc/apt/apt.conf 與指令列的 -o 會在 apt.conf.d/ 之後套用,腳本裡寫了 -o Acquire::Retries=3 的話,這個設定檔就沒有作用。關閉重試之後,網路暫時中斷或伺服器短暫出錯時,APT 不會再自動重試,下載會直接失敗,需要手動再執行一次。更新到修正版本後,刪除 /etc/apt/apt.conf.d/99-no-retries 就會回到 apt 的預設值。

自動更新會不會裝上修補

會,前提是系統開著自動更新。依 Ubuntu Server 的文件 ,Ubuntu 安裝完就會每天自動安裝安全性更新; Debian 的 wiki 說明多數版本會安裝 unattended-upgrades,預設會自動安裝安全性更新,但系統上也可能沒裝或被關閉。這次的 apt 修補屬於安全性更新,自動更新下一次執行時就會裝上。

自動更新預設每天執行一次,從公告發布到修補裝好之間會有一段空窗,下載修補的那一次用的也還是舊版 apt。下面兩個指令可以確認自動更新開著,以及 apt 什麼時候被升級:

# 自動更新的設定,值是間隔天數:"0" 是關閉、"1" 是每天
# 沒有輸出代表沒有設定自動更新
apt-config dump | grep -E '^APT::Periodic::(Update-Package-Lists|Unattended-Upgrade) '
# apt 的升級紀錄,包含已輪替的舊紀錄
zgrep -h ' upgrade apt:' /var/log/dpkg.log*

zgrep 會列出升級的時間與前後版本,例如 upgrade apt:amd64 3.0.3 3.0.4。沒有輸出時,用 apt-cache policy apt 對照上面的版本表,確認是不是已經是修正版本。

Docker 容器與映像檔

以 Debian、Ubuntu 為基礎的容器映像檔裡也有 apt,Dockerfile 裡的 apt-get install 會用映像檔裡的 apt 下載套件。截至 2026 年 11 月 8 日,Docker Hub 上的 Debian 官方映像檔已在 11 月 5 日重建,Ubuntu 官方映像檔最後更新在 10 月 29 日,裡面還是修補前的 apt。可以在 Dockerfile 第一個 apt-get 步驟先升級 apt:

# 先用不重試的方式把 apt 升級到修正版本
RUN apt-get -o Acquire::Retries=0 update \
 && apt-get -o Acquire::Retries=0 install -y --only-upgrade apt

建好的映像檔可以用 docker run --rm 映像檔名稱 apt-cache policy apt 確認版本。容器裡沒有執行 apt 時不會觸發這個漏洞。

常見問答

已經有人利用這個漏洞嗎?

Debian、Ubuntu 與 APT 開發者的公告都沒有提到被實際利用的案例。攻擊者要能竄改下載流量,但 Debian 12、Ubuntu 22.04 以後的預設設定都符合重試的條件,建議盡快更新。

套件來源已經是 HTTPS,還需要更新嗎?

需要。HTTPS 擋得住傳輸途中的竄改,但惡意的鏡像站仍然符合攻擊條件,AWS 的公告也說明改用 HTTPS 不能取代更新。

更新 apt 之後要重新開機嗎?

不用。更新後執行的 apt 指令就是修正版本,重新開機不影響 apt。

Debian 11 或 Ubuntu 20.04 要處理嗎?

預設設定下不受影響,這些版本的 apt 早於 2.3.2,Acquire::Retries 預設是 0。設定檔或腳本裡加過重試的話就會受影響,可以把重試設回 0;Ubuntu 20.04 也能透過 Ubuntu Pro 取得 2.0.12+esm1。

RHEL、Fedora 會受影響嗎?

標準安裝不會。RHEL、Fedora 用 RPM 與 DNF 管理套件,Red Hat 說明標準安裝不包含 APT。Fedora 與 EPEL 套件庫另外提供 apt 套件,自己裝過的話(例如用來建立 Debian 的 chroot 環境),要更新到 3.3.6 以後的版本。

參考來源

發佈留言