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 推送必须弹出来电界面,持有这项监管豁免的应用则可以静默唤醒。【机制实锤】

二、通过 URL Scheme 探测你装了什么
iOS 不允许直接读取应用列表,但应用可以在 Info.plist 的 LSApplicationQueriesSchemes 里预先写好其他应用的唤醒暗号,再逐个询问系统能否打开,整个过程没有提示。【实锤】
航旅纵横硬编码了 280 个嗅探暗号
Soul 硬编码了 250 个,除了银行和办公软件,还包括保时捷、法拉利、阿斯顿马丁、玛莎拉蒂、迈凯伦、宾利、兰博基尼、特斯拉、蔚来等车企应用
小红书、BOSS 直聘、百度网盘、大麦、得物等几十款国内应用,都写有对 WhatsApp、Telegram、Twitter、Facebook、Instagram 乃至代理工具的嗅探
三、为什么关 IDFA、挂 VPN、卸载重装也没用
作者在手机上梳理出五层持久设备身份链:
iCloud 键值存储:支付宝、QQ、飞书、拼多多、腾讯会议等 18 款应用持有
ubiquity-kvstore-identifier,可以把标识写进 iCloud,卸载重装甚至换新 iPhone,只要登录同一个 Apple ID 就会同步回来【实锤】钥匙串:写入 Keychain 的数据卸载应用后依然保留,同一开发者的多款应用可以共享(本机检出 17 组)【实锤】
跨应用共享容器:同一集团的应用通过
application-groups共享存储,只要还留着其中任意一款,数据就不会被清理(本机检出 12 个)【实锤】硬编码运营商取号网关:部分应用在配置里写死了移动 cmpassport.com、联通 wostore.cn / id6.me、电信 189.cn 等一键登录网关。这类认证走蜂窝数据,即使连着 Wi-Fi,运营商也能直接从 SIM 卡识别手机号【实锤,更正后版本】
Wi-Fi 扫描钩子:美团、大众点评、支付宝、微信、钉钉持有
HotspotHelper,系统扫描 Wi-Fi 时会唤醒它们并提供周围路由器的 MAC 地址(BSSID),不需要 GPS 权限也能结合 Wi-Fi 地理库定位【机制实锤】

四、配置里的其他发现
我爱我家的配置里硬编码了 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 scanpython ios_noir.py scan:扫描全部应用,生成中英双语的交互式 HTML 报告,带--redact参数会给设备名和私人文件名打码,方便截图分享python ios_noir.py radar:实时读取 iOS 日志流,打开某个应用时,终端会显示它触发的通讯录、相册、相机、麦克风、定位和 IDFA 请求shields/目录提供两套防护:一个系统级加密 DNS 描述文件,用于拦截主流追踪域名;一份 Shadowrocket、Surge、Clash 可用的拦截规则,屏蔽运营商取号网关、数字联盟、jspatch 和主要遥测域名
安装 DNS 描述文件和拦截规则前,先看清规则内容,部分登录和风控流程可能因此失败。完整原文见 X 文章。