苹果手机隐私指示灯遭间谍软件绕过:摄像头麦克风偷偷录制毫无提示

admin 2026-02-04 01:27:38 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文分析Predator间谍软件绕过iOS录制指示器的技术。其利用Objective-C空消息特性,通过Hook单一函数阻断传感器状态更新,实现无提示录制。文章还阐述了PAC绕过、模块设计缺陷及基于进程注入和行为特征的检测方法,揭示了iOS隐私保护机制的潜在风险。 综合评分: 92 文章分类: 移动安全,恶意软件,漏洞分析,威胁情报,逆向分析


cover_image

苹果手机隐私指示灯遭间谍软件绕过:摄像头麦克风偷偷录制毫无提示

安全内参

2026年2月3日 17:28 北京

编者荐语:

这一技术细节的曝光再次证明:没有任何操作系统是绝对安全的。

以下文章来源于黑鸟 ,作者黑鸟

黑鸟 .

一介草民,深耕威胁情报领域多年,自封威胁分析师,APT狩猎者,战略忽悠分析师。 专注推送一切前沿高科技/人工智能、网络安全分析、敌我战略分析、数据挖掘、情报扩线、网络武器分析、社会工程学、一切开源情报、军事分析忽悠等。

自jamf的上一篇报告分析了苹果手机间谍软件Predator中未公开的反检测反蜜罐反取证技术,该团队再发布了一篇名为Predator 间谍软件绕过 iOS 录制指示器技术分析报告。

自 iOS 14 系统起,苹果公司在设备状态栏中设置了颜色指示器。

当应用调用摄像头时会显示绿色圆点,调用麦克风时会显示橙色圆点。

这是一项关键隐私功能,用于提醒用户设备可能正处于被监视状态。

本研究详细阐述了由 Intellexa/Cytrox 公司开发的 Predator 间谍软件,如何通过技术手段绕过该指示器,实现隐秘监视。

通过对 Predator 间谍软件 iOS 样本的逆向工程分析,jamf发现了多项此前未公开的 Predator间谍软件技术机制,具体如下:

  1. 巧用 Objective-C 语言的空对象消息特性,悄悄阻止摄像头、麦克风的活动状态向系统反馈更新;
  2. 仅靠一个Hook函数,就能同时隐藏 iOS 状态栏中摄像头(绿点)和麦克风(橙点)的两种状态指示器;
  3. 存在设计短板:其网络电话(VoIP)录音模块没有自带屏蔽麦克风指示器的隐身能力,需手动开启专门的指示器屏蔽模块才能隐藏痕迹;
  4. 精准锁定了 iOS 系统中私有框架的特定 API 接口作为攻击目标,明确了该间谍软件要劫持的系统核心函数。

1. 研究背景

1.1 iOS 录制指示器功能

苹果公司于 2020 年发布的 iOS 14 系统中,首次引入录制指示器这一隐私保护机制,具体功能如下表所示:

| 指示器 | 含义 | | — | — | | 绿色圆点 | 摄像头正在被调用(或摄像头与麦克风同时被调用) | | 橙色圆点 | 仅麦克风正在被调用 |

这些指示器会在设备状态栏中显示,且合法应用无法对其进行屏蔽。该功能由 iOS 系统的主屏幕及用户界面控制进程 SpringBoard 负责管理,通过私有框架类对传感器的活动状态进行实时监测。

图 1:左侧橙色圆点表示麦克风正在使用;右侧绿色圆点表示摄像头正在使用

1.2 过去的研究:NoReboot 技术

2022 年 1 月,现隶属于 Jamf 的 ZecOps 公司曾发布了一项名为 “NoReboot” 的技术研究。该技术展示了恶意软件如何模拟设备关机状态,同时维持后台监视功能。其实现原理如下:

  1. 劫持设备的关机事件;
  2. 向 SpringBoard 和 BackBoard 守护进程注入恶意代码;
  3. 阻止 SpringBoard 进程启动,从而隐藏所有用户界面;
  4. 屏蔽设备的所有物理反馈,包括屏幕显示、振动及触控功能。

通过以上手段,恶意软件可营造出设备已关机的假象,而摄像头和麦克风仍在后台持续工作。

1.3 Predator 间谍软件的差异化攻击手段

Predator 采用了与 NoReboot 完全不同的技术路径。它不会模拟设备关机,而是仅选择性屏蔽录制指示器,同时保证设备其他功能正常运行。这种攻击方式更为隐蔽,用户使用设备时不会发现任何异常,但实际上设备已处于被监视状态。

两种技术的对比如下表所示:

| 对比维度 | NoReboot 技术 | Predator 技术 | | — | — | — | | 设备状态 | 呈现关机假象 | 完全正常运行 | | 作用范围 | 屏蔽所有用户界面 | 仅隐藏指示器 | | 用户怀疑概率 | 可能会察觉 “已关机” 设备存在异常活动 | 无任何可见异常特征 | | 技术复杂度 | 需要对守护进程进行完整注入 | 采用精准的 API 钩子函数技术 |


2. 技术分析

2.1 组件总览

Predator 间谍软件的辅助模块具备四项独立功能,具体如下表所示:

| 模块编号 | 类名 | 功能 | | — | — | — | | 10 | Helper::HiddenDot | 指示器屏蔽 | | 11 | Helper::Voip | 网络电话 / 通话录音 | | 12 | Helper::KeyLogger | 键盘记录 | | 13 | Helper::CameraEnabled | 摄像头调用 |

每个模块均通过一套简单的命令协议进行控制:

  • X,A, args:分配 / 初始化编号为 X 的模块
  • X,E, args:对编号为 X 的模块执行指定命令
  • X,D:删除 / 销毁编号为 X 的模块

2.2 HiddenDot 模块:指示器屏蔽机制

2.2.1 Hook函数安装

HiddenDot::setupHook () 函数的攻击目标是 SpringBoard 进程中的传感器活动数据提供器,具体为 SBSensorActivityDataProvider 类的_handleNewDomainData: 方法。

图 2

HiddenDot::setupHook () 函数对 SBSensorActivityDataProvider._handleNewDomainData: 方法进行挂钩

该_handleNewDomainData: 方法的作用是,每当设备传感器活动状态发生变化时,如摄像头开启、麦克风激活等,iOS 系统就会调用此方法进行状态更新。Predator 通过对这一个方法挂钩,可在传感器状态信息传递至指示器显示系统之前,对所有状态更新请求进行拦截。

2.2.2 钩子回调函数:利用 Objective-C 空消息传递机制

指示器屏蔽的核心机制十分简洁。反编译后的回调函数核心逻辑如下:

图3:HiddenDot 回调函数伪代码 —— 通过 **a2 = 0 操作将 self 指针置空

在汇编语言层面,上述逻辑仅需一条 STR XZR 指令即可实现,该指令的作用是将线程状态寄存器的值置零。

图 4:HiddenDot 回调函数汇编代码 ——STR XZR, [X8] 指令将线程状态中的 x0 寄存器置零

该技术利用了 Objective-C 语言的一项核心特性:向空对象(nil)发送消息时,系统会自动忽略该消息,且不会产生任何报错。

2.2.3 实现原理

在 ARM64 架构中,函数调用遵循特定约定,self 指针会被存储在 x0 寄存器中。当系统调用 Objective-C 方法时,例如:

[SBSensorActivityDataProvider _handleNewDomainData:newData]

寄存器的赋值情况如下:

  • x0 = self(即 SBSensorActivityDataProvider 类的实例对象)
  • x1 = _cmd(即方法选择器)
  • x2 = newData(即传递的域数据参数)

Predator 在该方法执行前,将 x0 寄存器的值置为 0(即空指针),此时上述方法调用就会变为:

[nil _handleNewDomainData:newData]

在 Objective-C 语言中,该调用会直接返回空值(nil/0),且不会执行方法内的任何代码。传感器活动状态的更新请求会被静默丢弃,SpringBoard 进程无法获知摄像头或麦克风已被激活,因此不会显示任何指示器。

2.2.4 Hook函数返回值

回调函数返回值为 2,该值在 DMHooker 框架的异常挂钩系统中,表示 “使用修改后的线程状态继续执行程序”。返回值的完整枚举定义如下:

| 返回值 | 含义 | | — | — | | 0 | 执行错误 —— 延迟后重试 | | 1 | 部分成功 —— 可能需要进行 PAC 签名 | | 2 | 执行成功 —— 转发修改后的寄存器数据 | | 3 | PAC 重定向 —— 使用缓存的签名地址 | | 4 | 移除Hook函数 —— 清理后继续执行 |

#

2.2.5 单一Hook函数实现双重屏蔽

本研究的一项关键发现是:这一个Hook函数即可同时屏蔽绿色(摄像头)和橙色(麦克风)两种指示器。SBSensorActivityDataProvider 类的作用是,在将传感器活动信息分发至用户界面层之前,对所有传感器的活动状态进行汇总。

因此,通过拦截_handleNewDomainData: 方法,Predator 可利用一个Hook函数,实现对所有类型传感器状态更新的拦截。

这种实现方式比在无效代码中发现的另一种方案更高效。黑鸟认为主要原因在于下面的废弃方案需要为每种指示器分别设置Hook函数。

2.2.6 无效代码:被弃用的技术方案

在分析过程中,还发现了一个名为 CSWatcherSpawner::TestHooker () 的函数。

该函数实现了另一种指示器屏蔽机制,直接Hook SBRecordingIndicatorManager 类:

图 5:TestHooker () 函数中的无效代码展示了被弃用的 SBRecordingIndicatorManager 挂钩方案 —— 该函数无任何交叉引用

该函数不存在任何交叉引用,即从未被调用过。这表明它是一个开发 / 测试阶段的代码,最终被更简洁高效的 SBSensorActivityDataProvider 挂钩方案所取代。

被弃用的技术方案需要满足以下条件:

  1. 需要设置两个独立的Hook函数,每种方法对应一个;
  2. 需要直接对指示器的可见性进行操控;
  3. 可能会与显示系统产生竞争条件问题。

而最终投入使用的_handleNewDomainData: 方法挂钩方案更为简洁,它从数据源层面直接阻断状态更新,而非在用户界面层进行干预。

2.3 网络电话(VoIP)录音模块

VoIP 录音模块不具备指示器屏蔽功能,仅对音频处理函数进行挂钩:

图 6

Voip::setupHooks () 函数挂钩 AudioConverterNew 和 AudioConverterConvertComplexBuffer+52 方法 —— 无任何指示器屏蔽相关代码

该模块的音频捕获流程具体如下:

  1. 通过缓冲区大小检测音频采样率,支持 16kHz、24kHz、32kHz、44.1kHz、48kHz;
  2. 利用 NEON 单指令多数据(SIMD)指令,将 32 位浮点型脉冲编码调制(PCM)音频数据转换为 16 位整型;
  3. 将 4 声道音频下混为立体声;
  4. 通过 ExtAudioFileWrite () 函数将音频数据写入文件。

但该模块未包含任何屏蔽橙色麦克风指示器的代码。这一设计意味着,需要先执行一次全局指示器屏蔽操作,之后 VoIP 录音功能及可能的摄像头捕获功能,才能在不触发可见指示器的情况下运行。

2.4 CameraEnabler 模块:摄像头调用的 PAC 绕过技术

CameraEnabler 模块采用了另一种技术手段 —— 指针认证码(PAC)重定向。

2.4.1 基于模式匹配的目标定位

该模块并未对已知符号进行挂钩,而是通过 ARM64 指令模式匹配技术,定位目标函数的地址:

图 7:CameraEnabler::findFunctionAddress () 函数利用 memmem () 函数,在 FigVideoCaptureSourceCreateWithSourceInfo 函数附近搜索 ARM64 指令头模式

这种技术可让 Predator 间谍软件定位到未导出的内部函数,使Hook函数能够有效应对 iOS 系统更新。即使系统对函数名称或导出结构进行调整,该技术依然有效。

2.4.2 Hook回调函数:条件性 PAC 重定向

CameraEnabler 模块的回调函数会检查 x0 寄存器的值,并根据检查结果执行条件性重定向操作:

图 8:CameraEnabler 回调函数流程图 —— 当 x0 寄存器值等于 0x10 时,返回值为 3(PAC 重定向),从而绕过摄像头权限检查

当返回值为 3 时,会指示 DMHooker 框架使用 PAC 缓存中预先签名的返回地址,执行重定向操作,以此绕过系统的摄像头访问权限检查。

  1. 检测思路

3.1 进程注入痕迹

Predator 的Hook函数需要向系统进程注入恶意代码,涉及的目标进程如下:

SpringBoard 进程:用于实现 HiddenDot 模块功能

mediaserverd 进程:用于实现 CameraEnabler 和 VoIP 模块功能

对应的检测方法如下:

1、监控系统进程中是否存在异常的内存映射;

2、检查是否有非系统代码注册异常端口;

3、分析线程状态,查看是否在非预期位置存在断点指令。

3.2 Hook函数检测

DMHooker 框架采用基于 Mach 异常的挂钩技术,而非传统的内联挂钩技术。对应的检测方法如下:

1、枚举系统进程的异常端口;

2、检查是否存在指向非系统代码的断点异常处理器;

3、监控是否存在修改寄存器内容的 thread_set_state 调用。

3.3 行为特征检测

1、检测是否存在摄像头或麦克风被调用,但未显示对应指示器的情况;

2、检测 mediaserverd 进程是否向异常路径调用 ExtAudioFileWrite 函数写入数据;

3、检测 SpringBoard 进程是否接收到传感器活动通知,但未更新用户界面的情况。

结论

本研究首次公开了对 Predator 间谍软件 iOS 版本录制指示器绕过机制的技术分析。

核心研究成果如下:

利用 Objective-C 空消息传递机制:

通过对 SBSensorActivityDataProvider._handleNewDomainData: 方法设置单一钩子函数,将 self 指针置空,实现对摄像头和麦克风两种指示器的同时屏蔽;

模块化架构设计存在缺陷:

其 VoIP 录音模块未内置指示器屏蔽功能,需要操作人员先手动激活 HiddenDot 模块;

采用 ARM64 指令模式匹配技术定位目标:

CameraEnabler 模块通过指令模式匹配而非符号解析的方式,定位系统内部框架函数;

无效代码揭示技术演进历程:

被弃用的 SBRecordingIndicatorManager 挂钩方案表明,该间谍软件的技术路线,从直接操控用户界面的方案,演进为更简洁高效的数据源拦截方案。

本研究成果填补了现有威胁情报的空白,揭示了商业间谍软件为绕过 iOS 隐私保护机制所采用的复杂技术手段。

  1. 入侵特征

5.1 被Hook的方法

SBSensorActivityDataProvider._handleNewDomainData:(SpringBoard 进程)

CMCapture.framework 中特定模式偏移位置的函数(mediaserverd 进程)

AudioConverterNew(mediaserverd 进程)

AudioConverterConvertComplexBuffer+52(mediaserverd 进程)

5.2 目标进程

SpringBoard

mediaserverd

5.3 目标框架路径

/System/Library/PrivateFrameworks/CMCapture.framework/CMCapture

/System/Library/PrivateFrameworks/AudioToolboxCore.framework/AudioToolboxCore

关键术语解释

  1. SpringBoard

    定义:iOS 系统的主屏幕及用户界面控制进程,负责管理设备的主屏幕显示、应用启动及状态栏指示器等功能。

  2. SBSensorActivityDataProvider

    定义:iOS 私有框架中的类,负责汇总设备传感器的活动状态信息,并将其分发至用户界面层,是录制指示器功能的核心数据来源。

  3. 钩子函数(Hook)

    定义:一种代码注入技术,通过修改目标函数的执行流程,在函数执行前、执行中或执行后插入自定义代码,实现对函数行为的拦截或修改。

  4. Objective-C 空消息传递

    定义:Objective-C 语言的特性,向空对象(nil)发送消息时,系统不会执行任何操作,也不会抛出异常,仅会返回空值。

  5. 指针认证码(PAC,Pointer Authentication Code)

    定义:ARM64 架构中的安全机制,通过为指针添加加密认证码,防止指针被篡改,抵御代码注入和重定向攻击。

  6. DMHooker

    定义:一款基于 Mach 异常的挂钩框架,可在不修改目标函数代码的情况下,实现对函数执行流程的拦截。

  7. NEON SIMD

    定义:ARM 架构中的高级单指令多数据扩展指令集,可并行处理多个数据元素,提升音频、视频等数据的处理效率。

  8. 守护进程(Daemon)

    定义:运行在后台的系统进程,负责执行特定的系统服务功能,无用户界面。

  9. 脉冲编码调制(PCM,Pulse Code Modulation)

    定义:一种将模拟音频信号转换为数字信号的编码方式,是数字音频的基础格式。

  10. 竞争条件(Race Condition)

    定义:多进程或多线程并发执行时,由于执行顺序不确定,导致程序输出结果异常的问题。

由于原文已经被删除(未知原因),因此内容仅供参考,为避免内容流失,特此整理记录。

https://www.jamf.com/blog/predator-spyware-ios-recording-indicator-bypass-analysis/

推荐阅读

  • 网安智库平台长期招聘兼职研究员
  • 欢迎加入“安全内参热点讨论群”

文章来源:黑鸟

点击下方卡片关注我们,

带你一起读懂网络安全 ↓


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:安全内参 《苹果手机隐私指示灯遭间谍软件绕过:摄像头麦克风偷偷录制毫无提示》

评论:0   参与:  0