
一款诞生于 2021 年"飞马计划"(Pegasus Project)调查的手机取证工具,在五年后的这个九月重新回到了 GitHub Trending 的前排。Mobile Verification Toolkit(MVT)当前 14065 star,日增 star 数在 400 以上,仓库在 9 月 1 日、9 月 7 日、9 月 14 日、9 月 21 日连续四周各发布一个版本,最新版本 v2026.9.21 于 9 月 22 日上午刚推送到 PyPI。它的维护节奏和外部环境在这个九月同时发生了变化。
MVT 由国际特赦组织(Amnesty International)安全实验室开发并持续维护,用途是对 Android 和 iOS 设备做"同意式取证"(consensual forensics):在设备所有者知情同意的前提下,提取手机中的 forensic 痕迹,对照已知间谍软件的 IOC(Indicators of Compromise,失陷指标)判断设备是否被 Pegasus、Predator 这类商业间谍软件盯上。它的核心用户是人权工作者、调查记者和为这些人提供技术支持的取证研究员。

Android 侧出现了全新取证数据源
9 月密集发版背后,最实质的变化发生在 Android 取证路径上。2026 年 5 月,Google 在 Android 16 的高级防护模式(Advanced Protection Mode,AAPM)中加入了 Intrusion Logging(入侵日志)功能,这是主流厂商第一次专门为取证检测设计的数据源。国际特赦组织安全实验室是这项功能的设计伙伴,其负责人 Donncha Ó Cearbhaill 在功能发布时表示,这是大型设备厂商第一次主动解决"检测针对设备的高级攻击"这个问题。
在 Intrusion Logging 出现之前,Android 取证研究员能拿到的基本都是"顺带产物":Logcat 日志写在固定大小的环形缓冲区里,很快被覆盖;debuggerd 的 tombstone 崩溃记录数量有限、滚动淘汰;bugreport 和 Google Takeout 导出的数据从来不是为安全分析设计的。而人权工作者找到取证员的场景往往是"怀疑几个月前被入侵过",此时设备上的历史痕迹早已消失。攻击者也越来越熟悉这些取证手段,会刻意清理自己的行动痕迹。
Intrusion Logging 改变的是数据从哪里来。用户在 Pixel 设备上开启 AAPM 后,可以再单独打开 Intrusion Logging 开关,系统会每天周期性采集三类事件,用用户自己的密钥加密后归档到用户的 Google 账户云端,Google 自己无法读取这些日志。三类事件是:
- security_event:解锁尝试(含成功与否)、ADB shell 命令执行、通过 adb push/pull 传输文件、应用安装与卸载、进程启动。这些事件能回答"手机在离手期间是否被解锁过""有没有人用 ADB 操作过它""装过什么后来又被卸载的应用"这类问题。
- dns_event:设备发起的域名解析,含发起解析的应用包名。很多一击即走(1-click)的攻击链会把受害者重定向到中转页面,用户毫无感知,但 DNS 查询已经落了地,事后可以对照 IOC 匹配。
- connect_event:出站网络连接,同样带包名。来自被入侵应用的网络外联(C2 通信)在这里现形。
日志在设备端生成、用设备 PIN 码保护的密钥加密后才存储,用户手动"下载并解密"导出,或者通过 AndroidQF 采集工具在取证时一并拉取。MVT 的 check-androidqf 命令会自动识别采集目录里的 intrusion-logs/ 子目录并直接分析,也可以用独立命令 mvt-android check-intrusion-logs 处理手动导出的日志。分析结果输出 security_event.json、dns_event.json、connect_event.json 三份结构化文件,以及一份汇总全部时间戳事件的 timeline.csv;一旦命中可疑指标,还会生成带 _detected 后缀的告警文件。
一条实际的安全事件长这样:
{"security_event": {"event_id": 7, "event_time": 1770984359195595837,
"keyguard_dismiss_auth_attempt": {"success": true, "method_strength": 1}}}keyguard_dismiss_auth_attempt 且 success: true,意味着设备被成功解锁过一次,带精确到纳秒的时间戳。把解锁、ADB 命令、应用安装、DNS 查询这几类事件按时间线拼起来,一部手机在被扣押或离手期间发生过什么,可以还原出相当完整的链条。这套数据结构的取证价值,在它出现之前是不存在的。
需要说明它的边界:AAPM 与 Intrusion Logging 目前要求 Android 16 及以上,且只在 Pixel 设备上提供,其他厂商的支持在计划中;设备必须绑定 Google 账户;日志必须在攻击发生之前就已开启,事后无法回溯补录。另外这类日志可能包含浏览记录级别的敏感信息,共享给取证员时的知情同意比以往任何时候都重要。
iOS 侧:三条采集路径与一次底层库更换
iOS 一直是 MVT 能力最完整的平台,v3 架构下提供三条采集路径,按取证价值从高到低排列:
完整文件系统转储(filesystem dump)。需要越狱才能拿到,能提取其他方式拿不到的数据,但不是每台 iPhone 的每个 iOS 版本都有可用越狱,而且越狱操作本身可能污染证据。官方文档给出的建议是:如果设备不需要归还,可以在其他选项穷尽之后最后尝试。
iTunes/Finder 备份(backup)。最常用的路径。备份覆盖设备文件的子集,但足以检出多数可疑痕迹;加密备份比明文备份多出 Safari 历史、Safari 会话状态等记录,所以有经验的取证员会优先做加密备份。MVT 负责 decrypt-backup 解密、check-backup 分析的全流程,extract-key 可以把备份密码转换成密钥文件避免反复输入。
sysdiagnose 诊断归档。用户在设备上触发系统诊断生成的压缩包,mvt-ios check-sysdiagnose 直接接受 .tar.gz 原始归档或解包后的目录。9 月 14 日的 v2026.9.14 改进了这个路径:损坏的 sysdiagnose 归档现在会报错而不是静默跳过,bugreport 时间戳改按设备时区读取,列出归档内容时跳过 AppleDouble 附属文件。
9 月 7 日的 v2026.9.7 里有一次底层更换:iOS 备份解析库从旧的 iOSbackup 换成了 iphone_backup_decrypt。v2026.9.21 又修复了挂载点读写检测在两层配置之间的判断问题。这类更换对使用者透明,但决定了备份解析在新型设备上的成败,也说明了"持续更新到最新版"这个使用建议的实际成本。
安装与一次实操走查
MVT 支持 Linux 和 macOS,Windows 官方建议走 WSL。推荐用 pipx 安装,装完得到 mvt、mvt-ios、mvt-android 三个命令:
# macOS
brew install python3 pipx libusb sqlite3
brew install --cask android-platform-tools # 分析 Android 才需要
pipx install mvt
# 下载公开 IOC 指标库(来自 mvt-indicators 仓库)
mvt download-iocs对一台 iPhone 做一次基础检查的完整流程:
# 1. 用 Finder 做一个加密备份到本地(保持手机解锁直到备份完成)
# 2. 解密备份(密码也可用 MVT_IOS_BACKUP_PASSWORD 环境变量传入)
MVT_IOS_BACKUP_PASSWORD="你的备份密码" \
mvt-ios decrypt-backup -d /path/to/decrypted /path/to/backup
# 3. 对照公开 IOC 跑检查,结果 JSON 写入 output 目录
mvt-ios check-backup --iocs ~/下载/malware.stix2 \
--output /path/to/output /path/to/decrypted跑完之后重点看输出目录里带 _detected 后缀的文件:有内容就代表命中了已知间谍软件的域名、进程名、文件哈希等指标。--fast 参数可以跳过耗时模块先出一遍快速结果,--list-modules 列出全部检测模块,-m 单跑某个模块。
Android 侧的推荐路径是先用 AndroidQF 采集再交给 MVT 分析。AndroidQF 是一个 Go 编写的单二进制采集工具,在设备上跑一个取证采集 agent,输出标准化的证据包(备份、bugreport、系统日志、入侵日志),然后:
# VirusTotal 查询默认关闭(会把 APK 哈希发到外部服务),手动开启时限速 16 秒/次
MVT_VT_API_KEY=你的key \
mvt-android check-androidqf --virustotal /path/to/androidqf-output采集与分析分离是这个工具链的设计决定:证据在设备还在手边时一次性采全,分析可以在任何时候用更新过的检测逻辑重跑,不依赖原始设备。
v3 重构与 CalVer:一个取证工具的版本哲学
今年合并进 main 分支的 v3 重构是一次破坏性变更:输出格式整体改变,告警分成 low/medium/high 三级,官方在 issue #757 里明确提示依赖 MVT 输出做二次处理的脚本可能需要适配。配合这次重构,MVT 把版本号从语义化版本(最后一位语义版本是 2.7.0,2025 年 12 月)切换成了日历版本(CalVer):2026.4.28、2026.5.12、2026.7.29,再到 9 月的周更三连。
版本策略的切换逻辑写在那个 issue 里:取证工具的价值在于"永远跑最新版,才能检出最新恶意软件",日历版本号让版本新旧一眼可见。这和浏览器、安全厂商的更新策略是同一种思路,区别只在 MVT 把它写进了版本号。对普通使用者,pipx upgrade mvt && mvt download-iocs 两条命令就构成完整更新动作,指标库和工具本体分开更新。
公开 IOC 的能力边界
MVT 项目自己在 README 和文档里反复强调一件事:公开 IOC 只能用来"检出",不能用来证明设备"干净"。公开指标库里没有的恶意域名、新型间谍软件的进程名,公开扫描就是检不出来;可靠的全面取证需要非公开指标、研究和威胁情报支撑,这些资源国际特赦组织安全实验室和 Access Now 的数字安全热线只向公民社会提供。
这个边界划得比多数安全产品诚实。对个人用户更实际的结论是:MVT 是为技术工作者和调查人员设计的命令行工具,官方明确表示它不适合作为普通用户的自检手段;普通用户如果怀疑自己被高级监控盯上,正确做法是联系专业机构,而不是自己跑一遍扫描然后因为"没有命中"就放下心来。公开 IOC 扫描的价值在于它把 Pegasus、Predator 这类曾被认为只有国家级攻击者才掌握内部知识的对手,变成了任何研究者都能下载指标、复现检测的对象,2021 年"飞马计划"公布取证方法论时开创的正是这个先例。
仓库最近的提交显示这条产品线还在活跃推进:mvt-indicators 指标库 8 月底刚做了一轮数据修复,补上了此前从未被下发过的 eaglemsgspy 指标集(来源 Lookout),并把 lint 检查收紧。工具本体在 9 月的四周里平均每周消化五到六个 PR,从依赖更换到时区解析修复都是小步快跑。一个从调查报道中诞生的工具,五年后借着 Android 侧第一个取证专用数据源重新进入上升期,它跟踪的对手——商业间谍软件产业——也还在扩张。
来源:
- mvt-project/mvt(GitHub 仓库与 README)
- MVT 官方文档(docs.mvt.re):安装、iOS/Android 方法论、IOC、入侵日志
- v3 迁移与版本策略说明(issue #757)
- v2026.9.21 / v2026.9.14 / v2026.9.7 / v2026.9.1 发布说明
- Amnesty International Security Lab:Android Intrusion Logging as a new source of data for consensual forensic analysis
- AmnestyTech investigations(公开 STIX2 指标库)