早于 v40.4(提交 2c31239)的 erase-install 会将 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 提示管理员输入凭据。凭据(用户名 + 密码)通过 shell 重定向写入 /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 |
本概念验证仅用于教育和授权安全测试目的。请负责任地使用,并且仅在你拥有或已获得明确测试许可的系统上使用。