Debian と Ubuntu の APT における root 権限でのパッケージ差し替え RCE(CVE-2026-109518)
Debian と Ubuntu の APT は、リダイレクトと再試行の後に攻撃者のパッケージをインストールし、経路上の攻撃者に root 権限を与えます。3.3.6 と 3.0.4 で修正済みです。
要点
- APT は、検証したパッケージではなく攻撃者が用意したパッケージをインストールするように誘導されます。経路上の悪意あるミラーやプロキシが、パッケージのインストール中にこの問題を引き起こします。
- Debian 12 以降、Ubuntu 22.04 以降、およびこれらの APT 設定を引き継ぐ派生ディストリビューションは、再試行が既定で有効です。Debian 11 と Ubuntu 20.04 は、再試行が有効にされた場合にのみ影響を受けます。
- Ubuntu はこの問題を CVSS v4.0 の 7.7 High と評価しています。CVE-2026-109518 は 2026 年 11 月 5 日時点で 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.x 系の最初の修正ビルドを 2.2.5 としています。インストール済みのバージョンを確認します。
apt --version
dpkg-query -W -f='${Version}\n' apt
apt --version は apt 3.0.3 (amd64) のような行を出力します。インストールされているバージョン全体を、各リリースの修正バージョンと比較してください。たとえば 3.0.3 は修正版の 3.0.4 より古いバージョンです。バックポートではバージョン文字列が異なることがあるため、表より古く見える場合は、未修正と判断する前にディストリビューションのセキュリティアドバイザリを確認してください。
修正方法
更新自体も APT を通じてダウンロードされるため、先に暫定策を適用し、次に更新し、その後で暫定策を残すか決めます。
- 再試行の設定を作成します。これにより、攻撃に必要な再試行がなくなります。
bash
printf 'Acquire::Retries "0";\n' | sudo tee /etc/apt/apt.conf.d/99-no-retries
sudo apt-config dump | grep -i 'Acquire::Retries'
2 つ目のコマンドは、ファイルが読み込まれると Acquire::Retries "0"; を出力します。
- Debian で APT を更新します。
bash
sudo apt update
sudo apt install --only-upgrade apt
- Ubuntu で APT を更新します。Ubuntu Pro でパッケージを利用できる ESM リリースも含みます。
bash
sudo apt update
sudo apt install --only-upgrade apt
-
apt --versionで新しいバージョンを確認し、パッケージをインストールするすべてのマシンとコンテナイメージで繰り返します。 -
更新後も
/etc/apt/apt.conf.d/99-no-retriesを残すか、削除します。削除すると既定の再試行動作に戻り、保護は修正版 APT に依存します。
Debian のアドバイザリは DSA-6607-1、Ubuntu のアドバイザリは USN-8996-1 です。修正はコミット「methods: Open target files exclusively」です。
暫定策の限界は次のとおりです。
- 失敗したダウンロードの再試行を防ぎます。これは攻撃に必要な手順です。開示スレッドは、更新までの緩和策と説明しています。
- 耐障害性を下げます。一時的なミラーのエラーで再試行せずにインストールが失敗するため、混雑した不安定なミラーでは失敗が増えます。
- ダウンロードのコードを安全にはしません。バイナリにはその場での書き込みが残り、再試行なしでダウンロードを再開する将来の経路は対象外です。
暫定策が対象とするのは 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 リダイレクトによって 2 つの異なるパッケージのダウンロードが同じ URI になると、APT はそれらを統合できます。2 つのキューは 1 つの宛先ファイルを使用します。一方のダウンロードが再開されると、そのバイトはもう一方のキューがすでに検証したファイルに書き込まれます。dpkg がインストールするパッケージは、APT がハッシュを確認したパッケージではありません。
どのように悪用されますか?
- 攻撃者は、APT クライアントとアーカイブの間の経路、たとえば悪意あるミラー、プロキシ、または自身が制御するネットワークセグメントに位置します。
- パッケージのインストール中に、攻撃者はパッケージ要求へ HTTP リダイレクトで応答し、その宛先 URI を APT のキューにある別のダウンロードと同じにします。
- APT は 2 つのダウンロードに同じ宛先ファイルを割り当てます。
- 攻撃者は一時的なサーバーエラーを返し、APT にダウンロードを再試行させます。APT は既定で
Acquire::Retries 3により再試行します。 - APT は既存の宛先を
WriteAnyで再度開き、前回のオフセットから書き込みを再開するため、再試行のバイトは検証済みの inode に届きます。 - 差し替えられたパッケージは root 権限で
dpkgによりインストールされ、そのメンテナンススクリプトが root として実行されます。
公開されたエクスプロイトコードはありません。この手順は、公開された実証コードではなく、Debian のアドバイザリと修正コミットに記載された仕組みに従っています。
攻撃の流れは?
この連鎖には、経路上の攻撃者、2 つのダウンロードを統合するリダイレクト、および検証済みファイルをその場で再度開く再試行が必要です。
悪意あるミラーやプロキシ"] --> B["2 つのダウンロードを
同じ URI へリダイレクト"] B --> C["APT が 1 つの宛先ファイルを再利用"] 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 以降の既定値です。 - 攻撃者が、2 つのダウンロードに同じ URI を与えるリダイレクトを APT にたどらせることができる。
- 攻撃中にパッケージのインストールが実行され、攻撃者が再開に必要な再試行を強制できる。
アーカイブのトラフィックをすでに変更できる攻撃者でも、クライアントが受け入れる場合にのみ悪意あるパッケージを配信できます。リポジトリメタデータの署名確認により、署名のないリポジトリからの偽造パッケージは防がれます。この問題は、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 が記録したチェックサムはそのパッケージと一致し、マシン上に矛盾は見えません。手がかりは公式パッケージインデックスとの不一致で、このセクションの 2 つの確認のうち 1 つ目です。失敗した試行は痕跡を残さない場合があります。
次の 2 つの確認で範囲を絞れます。
- 影響を受けた期間に 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 のハッシュではないため、差し替えられたパッケージは自分と一致する一覧を持ち込みます。
公式パッケージとの違いは手がかりです。ミラーやプロキシがファイルを差し替えた可能性があります。ローカルでの再ビルドでもチェックサムは変わるため、それだけでは証拠になりません。
- インストール済みのバージョンをディストリビューションのアーカイブと比較します。
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 は 26.10、26.04 LTS、24.04 LTS、22.04 LTS 向けの修正版 APT を 14:25 UTC にセキュリティアーカイブへ公開しました。
よくある質問
HTTPS だけでこの問題を防げますか?
各アドバイザリは HTTP での攻撃を説明しており、HTTPS のソースが影響を受けるかは記載していません。可能なら HTTPS ミラーを使用してください。ただし、HTTPS を修正版 APT の代替とは考えないでください。この問題は、ダウンロード後のファイルの書き方にあり、通信路の暗号化だけの問題ではありません。
Debian 11 や Ubuntu 20.04 を使っています。影響を受けますか?
既定の設定では影響を受けません。Acquire::Retries は Debian 12 と Ubuntu 22.04 より前は既定ではなく、攻撃には再試行が必要です。スクリプトや管理者が再試行を有効にした場合、そのシステムは影響を受けます。CVE レコードは 2.2.x 系の最初の修正ビルドを 2.2.5 としており、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 日確認)