
認可されたテスト/研究用途に限ります。 このPoCは、あなたが所有しているか、明示的にテストを許可されているシステムに対してのみ実行してください。
このリポジトリには、CUPS 2.4.16 におけるローカルプリンター脆弱性を、システムのCUPSを対象に再現する実装が含まれています。
この実装は、公開されているCUPS脆弱性の再現コードをもとに開発され、別途インストールされたCUPSビルドとrootで実行する再現ハーネスを必要とするのではなく、すでに稼働しているシステムのCUPSインストールに対して動作するように適応されています。
再現は、おおむね次の連鎖に従います。
CUPS 2.4.16
│
▼
ローカル認証チャレンジ
│
▼
攻撃者が制御するIPPエンドポイント
│
▼
Authorization: Local <token>
│
▼
認証済みCUPS管理
│
▼
CUPS-Create-Local-Printer
│
▼
file:// デバイスURI
│
▼
プリンター/ジョブの競合
│
▼
root所有の対象ファイル
このエクスプロイトは競合状態に依存するため、毎回成功するとは限りません。
公開されている再現コードは、制御された脆弱性ハーネスとして設計されています。特に、専用のCUPSインストールを前提とし、再現環境では適切だが、すでに稼働しているディストリビューションのインストールを代表するものではないセットアップ/リセット操作を実行します。
この実装は代わりに、次のことを行います。
ipptool バイナリを使用する。cups-create-local-printer.test 定義を使用する。Local 認可トークンを取得する。file:// プリミティブを再現する。作者のラボで以下を用いてテスト済みです。
ipptoolテスト定義は次の場所にあることを想定しています。
/usr/share/cups/ipptool/cups-create-local-printer.test
インストール状況は次のコマンドで確認できます。
cupsd -v
which ipptool
find /usr/share/cups -name 'cups-create-local-printer.test' 2>/dev/null
攻撃者IDと対象パスを環境変数で設定します。
export CUPS_ATTACKER="$USER"
export CUPS_TARGET="/tmp/cups-poc-target"
python3 exploit.py
制御された権限昇格の再現を行う場合は、分離されたテスト環境に適した対象を選択してください。
このスクリプトはデフォルトで /etc/sudoers.d/ 配下のsudoers形式の対象を指定するため、本番システムで気軽に実行しないでください。
このPoCはIPPリスナーを起動し、CUPSにそれに対して認証させます。リスナーは最初に 401 チャレンジを次の内容で返します。
WWW-Authenticate: Local trc="y"
続くリクエストには次が含まれます。
Authorization: Local <token>
その後、このトークンはローカルCUPS管理エンドポイントに対して再利用されます。
再現では次を使用します。
CUPS-Create-Local-Printer
file:// デバイスURIとともに使用します。
候補ループはプリンター操作を繰り返し実行します。これには次が含まれます。
CUPS-Add-Modify-Printer
CUPS-Accept-Jobs
Resume-Printer
Print-Job
1回の試行では勝てない可能性があるため、競合は意図的に繰り返されます。
このリポジトリは適応版であり、正規のアップストリーム実装ではありません。
リクエスト構築ロジックとエクスプロイトのシーケンスは、公開されている再現コードに基づいています。主な変更点は、既存のシステムCUPSインストールに対して実行することと、再現環境のセットアップ/リセットの前提を削除したことです。
権威ある脆弱性情報と元の再現コードについては、アップストリームのOpenPrinting CUPSセキュリティアドバイザリおよびリポジトリを参照してください。
許可なくCUPSインストールに対してこれを使用しないでください。
防御的な検証において有用な指標には、攻撃者が制御するエンドポイントへの予期しないIPPリクエスト、異常な Local 認証交換、予期しないローカルプリンターの作成、不審なプリンター/ジョブアクティビティなどがあります。