iOS-NOIR:不越狱给 iPhone 做一次隐私取证

· 资源分享

开源工具 iOS-NOIR 通过 USB 读取 iPhone 应用的签名权限、配置和内核遥测,作者在 148 款应用中发现静默唤醒、URL Scheme 嗅探和五层持久设备身份链;已按作者更正整理。

很多人觉得 iPhone 只要不越狱、不装企业证书、随手划掉后台、再挂个 VPN,App 就被关在沙盒里翻不出什么花样。原帖作者用 Python 写了一套不需要越狱的 iOS 取证工具 iOS-NOIR,用 USB 数据线连接自己的主力机(iPhone 15,iOS 27.0.1,共 148 款应用,全部安装的应用,不是挑选的),读取签名权限、Info.plist 配置、沙盒文件、崩溃日志和开发者模式下的内核遥测,做了一次全面体检。

工具的灵感来自 Android 隐私审计项目 Verlintas/NOIR 和 RootSir 的 Claude iOS 逆向报告,结论按证据分三级:【实锤】来自静态配置、沙盒文件或内核日志;【机制实锤】指应用持有苹果签发的特殊权限,具备相应能力,但实际触发多少取决于服务器推送和运行状态;【推断】是根据共享容器、钥匙串组和 SDK 域名做的关联推断。

更正说明

原文发布后,作者陆续做了更正,本文已按更正后的版本整理:

  • 原文写「支付宝 7414 秒内唤醒 14,228 次」,作者回头核对原始数据,发现这组数字并不存在,是用 AI 写稿时加进去的,本文已删除

  • 持有 VoIP 监管豁免签名的 7 款应用中,有 4 款是外国应用(Teams、WhatsApp、WhatsApp Business、Telegram),不只是国内应用

  • 原文第 4 层「无视 Wi-Fi 和 VPN 强行直连蜂窝基站」已在工具 11 月 6 日的更新中调整为「硬编码运营商取号网关」;network-authentication 归入第 5 层的 Wi-Fi 钩子

作者也承认,一台手机说明不了全部,部分结论还在继续补充和核实。

一、划掉的 App 为什么还在后台跑

作者把手机放在桌上一小时几乎不操作,前后各抓一次内核进程表做差分:常驻后台的 WhatsApp 用掉 105.7 秒 CPU,读取 411.5MB、写入 83.6MB;Instagram 用掉 35.6 秒 CPU,读取 195MB。【实锤】

美团和小红书早已从后台划掉、也关了后台 App 刷新,仍出现在进程表里。原因是通知服务扩展(NotificationServiceExtension):服务器发送带 mutable-content: 1 的推送时,iOS 会在后台拉起扩展进程,给它约 30 秒运行时间。这一小时里,美团的扩展进程读取了 16.57MB,小红书读取了 22.65MB。【实锤】

另外,微信、QQ、钉钉等 7 款应用持有 com.apple.developer.pushkit.unrestricted-voip-regulatory 签名。iOS 13 起,普通应用收到 VoIP 推送必须弹出来电界面,持有这项监管豁免的应用则可以静默唤醒。【机制实锤】

iOS-NOIR 报告:全量应用审计榜,钉钉、微信、支付宝的特权签名与嗅探暗号明细(原文发布时的版本)

二、通过 URL Scheme 探测你装了什么

iOS 不允许直接读取应用列表,但应用可以在 Info.plist 的 LSApplicationQueriesSchemes 里预先写好其他应用的唤醒暗号,再逐个询问系统能否打开,整个过程没有提示。【实锤】

  • 航旅纵横硬编码了 280 个嗅探暗号

  • Soul 硬编码了 250 个,除了银行和办公软件,还包括保时捷、法拉利、阿斯顿马丁、玛莎拉蒂、迈凯伦、宾利、兰博基尼、特斯拉、蔚来等车企应用

  • 小红书、BOSS 直聘、百度网盘、大麦、得物等几十款国内应用,都写有对 WhatsApp、Telegram、Twitter、Facebook、Instagram 乃至代理工具的嗅探

三、为什么关 IDFA、挂 VPN、卸载重装也没用

作者在手机上梳理出五层持久设备身份链:

  1. iCloud 键值存储:支付宝、QQ、飞书、拼多多、腾讯会议等 18 款应用持有 ubiquity-kvstore-identifier,可以把标识写进 iCloud,卸载重装甚至换新 iPhone,只要登录同一个 Apple ID 就会同步回来【实锤】

  2. 钥匙串:写入 Keychain 的数据卸载应用后依然保留,同一开发者的多款应用可以共享(本机检出 17 组)【实锤】

  3. 跨应用共享容器:同一集团的应用通过 application-groups 共享存储,只要还留着其中任意一款,数据就不会被清理(本机检出 12 个)【实锤】

  4. 硬编码运营商取号网关:部分应用在配置里写死了移动 cmpassport.com、联通 wostore.cn / id6.me、电信 189.cn 等一键登录网关。这类认证走蜂窝数据,即使连着 Wi-Fi,运营商也能直接从 SIM 卡识别手机号【实锤,更正后版本】

  5. Wi-Fi 扫描钩子:美团、大众点评、支付宝、微信、钉钉持有 HotspotHelper,系统扫描 Wi-Fi 时会唤醒它们并提供周围路由器的 MAC 地址(BSSID),不需要 GPS 权限也能结合 Wi-Fi 地理库定位【机制实锤】

iOS-NOIR 报告:五层持久设备身份链(原文发布时的版本,第 4 层说法已在 11 月 6 日更新中调整)

四、配置里的其他发现

  • 我爱我家的配置里硬编码了 jspatch.com,这是早年被苹果禁止的远程热更新框架

  • Airbnb 中提取到数字联盟(shuzilm.cn)设备指纹服务和联通取号网关的域名;腾讯会议硬编码了秒针、国双、AdMaster 等 12 家广告监测服务

  • 渣打银行 SC Mobile 的推送扩展里有 LexisNexis 的 TMXBehavioSec 行为生物特征引擎,会分析打字节奏和触控习惯;星展银行 digibank 的沙盒里有 Sentiance 的行程数据库,用传感器推断步行、地铁或驾车

  • 12 款应用开启了 UIFileSharingEnabled,手机连接曾经点过「信任」的电脑时,不需要解锁应用就能通过 HouseArrest 协议读取它们 Documents 目录里的文件

以上域名和 SDK 属于静态提取结果,代表代码里存在,不等于每次运行都会调用。

五、如何使用 iOS-NOIR

工具采用 MIT 协议开源,完全本地离线运行,目前只在 macOS 上测试过。连接 iPhone、解锁并点「信任此电脑」后运行:

git clone https://github.com/arnold117/iOS-NOIR.git
cd iOS-NOIR
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python ios_noir.py scan
  • python ios_noir.py scan:扫描全部应用,生成中英双语的交互式 HTML 报告,带 --redact 参数会给设备名和私人文件名打码,方便截图分享

  • python ios_noir.py radar:实时读取 iOS 日志流,打开某个应用时,终端会显示它触发的通讯录、相册、相机、麦克风、定位和 IDFA 请求

  • shields/ 目录提供两套防护:一个系统级加密 DNS 描述文件,用于拦截主流追踪域名;一份 Shadowrocket、Surge、Clash 可用的拦截规则,屏蔽运营商取号网关、数字联盟、jspatch 和主要遥测域名

安装 DNS 描述文件和拦截规则前,先看清规则内容,部分登录和风控流程可能因此失败。完整原文见 X 文章。

原帖