
CVE-2021-3560 は、Linux デスクトップ環境で使用される認可フレームワークである Polkit (旧 PolicyKit) におけるローカル権限昇格の脆弱性です。ローカルの非特権攻撃者は、accounts-daemon D-Bus インターフェースの競合状態を悪用して、特権ユーザーを作成し、そのパスワードを設定し、最終的に root アクセスを獲得できます。
accounts-daemon (org.freedesktop.Accounts) は、ユーザーアカウント (作成、削除、パスワード変更など) を管理するシステム D-Bus サービスです。以下のようなメソッドを公開しています:
| メソッド | 動作 |
|---|---|
CreateUser | 新しいシステムユーザーを作成します |
SetPassword | ユーザーのパスワードを設定します |
DeleteUser | ユーザーを削除します |
これらの操作には認可が必要です。D-Bus 呼び出しが到着すると、Polkit は呼び出し元と accounts-daemon の間に介在します:
Caller → D-Bus → Polkit (authorization check) → accounts-daemon (action)
Polkit は呼び出し元に権限があるかどうかを判断し、権限があればリクエストを accounts-daemon に転送して実行させます。
この脆弱性は TOCTOU (Time Of Check, Time Of Use) 競合状態です。ここが重要なポイントです:
accounts-daemon に送信されます (例: CreateUser)。accounts-daemon の処理が完了する前 — ユーザー作成は適切な認証なしに実行されますが、ユーザーレコードは不完全な状態 (例: パスワードなし、ホームディレクトリなし) になります。SetPassword を呼び出すか、不完全な状態自体が昇格された特権を付与します。要するに、適切なタイミングでリクエストを強制終了すれば、認証をバイパスできます。
この exploit.sh スクリプトは、攻撃チェーン全体を自動化します:
# Clone the repository
git clone https://github.com/Jeanback1/CVE-2021-3560.git
cd CVE-2021-3560
# Make the exploit executable
chmod +x exploit.sh
# Run it
./exploit.sh
エクスプロイトが完了すると、root シェルが得られます:
whoami
# root

| コンポーネント | 影響を受けるバージョン |
|---|---|
| polkit | ≤ 0.119 (パッチ未適用) |
| accounts-daemon (accountsservice) | 影響を受ける polkit を使用するすべてのバージョン |
この脆弱性は polkit 0.120 以降でパッチされました。
パッチ適用済みディストリビューション (一部抜粋):
このリポジトリは、教育および許可されたセキュリティ研究専用です。所有していない、またはテストする明示的な許可がないシステムでこのエクスプロイトを使用しないでください。作成者は誤用に対する一切の責任を負いません。
| ステップ | 動作 |
|---|
| 1. 時間較正 | ダミーの CreateUser("nobody") 呼び出しを使用して D-Bus ラウンドトリップにかかる時間を測定し、「強制終了ウィンドウ」を計算します |
| 2. ユーザー作成 | 選択したユーザー名に対する CreateUser 呼び出しを送信し、バックグラウンドで開始し、計算されたウィンドウの間スリープしてから強制終了します — 競合状態を悪用して未認可のユーザーを作成します |
| 3. パスワード設定 | ユーザーが (不完全な状態で) 存在すると、同じ競合状態の手法で SetPassword 呼び出しを送信し、既知のパスワードを割り当てます |
| 4. 権限昇格 | su を使用して新しいユーザーに切り替え、sudo を実行し (バイパスされた認可経路でユーザーが作成されたため機能します)、/bin/bash を SUID root で /var/tmp/bash にコピーし、root シェルを起動します |