iOS 恶意软件如何悄悄监视用户

语言: CN / TW / HK

这将是一个系列文章,我们将介绍移动攻击者的想法,以及攻击者使用哪些技术来逃避安全保护以及如何悄悄地监视手机和平板电脑,而不被用户发现。

我们将在本文介绍最近攻击者是如何避开摄像头和麦克风绿色/橙色指示器,来悄悄监视用户的。

从 iOS 14 开始,苹果多了几个新指示器:一个绿点和一个橙点。当访问摄像头或麦克风时,这些指示灯会发出信号。

当没有绿色/橙色圆点时,就意味着手机没有被监听。

我们知道像 NSO/Pegasus 这样的恶意软件能够监听麦克风。 NSO 组织和数百名其他针对移动设备的攻击者能否在视觉指示器关闭时拍摄我们的视频?

让我们来看看此功能是否对攻击者构成任何挑战。

逻辑问题

让我们先想想,每次访问摄像头或麦克风时,指示灯是否真的亮起?我们很快就会想到 Siri。如果麦克风指示灯没有一直亮起,手机如何知道我们何时说“Hey Siri”?手机一定在听某种正确的声音。

“Hey Siri”

/System/Library/PrivateFrameworks/CoreSpeech.framework/corespeechd依赖于VoiceTrigger.framework来持续监控用户的声音,然后在听到关键字时激活Siri。

辅助功能 -> 语音控制

语音控制允许你使用语音命令与设备进行交互。

/System/Library/PrivateFrameworks/SpeechRecognitionCore.framework/XPCServices/com.apple.SpeechRecognitionCore.brokerd.xpc/XPCServices/com.apple.SpeechRecognitionCore.speechrecognitiond.xpc/com.apple.SpeechRecognitionCore.speechrecognitiond

负责访问麦克风。

SwitchControl的部分功能是检测用户头部的运动来与设备进行交互。非常酷的功能!由以下人员处理:

/System/Library/PrivateFrameworks/AccessibilityUI.framework/XPCServices/com.apple.accessibility.AccessibilityUIServer.xpc/com.apple.accessibility.AccessibilityUIServer

/System/Library/CoreServices/AssistiveTouch.app/assistivetouchd

这些功能必须访问麦克风或摄像头才能运行。但是,这些功能不会触发绿色/橙色视觉指示器。这意味着移动恶意软件也可以做同样的事情。

这意味着,通过向com.apple.accessibility.AccessibilityUIServer / com.apple. speech recotioncore .speech recotioncore .speech recotiondaemon注入一个恶意线程,攻击者就可以对麦克风进行静默访问。摄像头访问需要额外的补丁,我们稍后会讨论它。

绕过 TCC 提示

TCC 代表“透明度、同意和控制”。 iOS 用户经常会遇到这样的提示:

TCC 的核心是一个名为 tccd 的系统守护进程,它管理对敏感数据库的访问以及从输入设备(包括但不限于麦克风和摄像头)收集敏感数据的权限。

TCC提示符只适用于具有UI界面的应用程序。任何在后台运行的东西都需要特殊的权限才能操作。权限如下图所示。只需要kTCCServiceMicrophone就可以接入麦克风。

摄像头访问稍微复杂一些。除了 tccd 之外,还有另一个名为 mediaserverd 的系统守护进程确保没有后台运行状态的进程可以访问摄像头。

到目前为止,当用户与另一个前台应用程序交互时,似乎需要一个额外的步骤(例如修补 mediaserverd)来访问后台的摄像头。

禁用麦克风、摄像头访问的可视指示器

第一种方法比较粗糙,使用Cycript向SpringBoard注入代码,导致指示器突然消失。

受com.apple.SpeechRecognitionCore.speechrecognitiond 和 com.apple.accessibility.AccessibilityUIServer 的启发,这是一种非常适合我们目的的私有权限 (com.apple.private.mediaexperience.suppressrecordingstatetosystemstatus)!不幸的是,此方法不适用于摄像头访问。

通过修复“mediaserverd”在后台访问摄像头

mediaserverd 是一个监控媒体捕获会话的守护进程。想要访问摄像头的进程必须得到 tccd 和 mediaserverd 的批准。它是 tccd 之后的额外安全层。当它检测到应用程序不再在前台运行时,它还会终止摄像头访问。

值得注意的是,mediaserverd 配备了一个特殊的权限(get-task-allow)来防止代码注入。

由于“get-task-allow”授权,动态调试器依赖于获取任务端口,如 cycript,frida 在 mediaserverd 守护进程上不起作用。当 mediaserverd 没有响应时,它也会经常被系统阻止,即使是很短的时间。这并不常见:这些迹象告诉我们 mediaserverd 负责一些重要的事情。

当进程切换到后台时,mediaserverd 将收到通知并撤销对该特定进程的摄像头访问权限。我们需要找到一种方法,让mediaserverd在检测到进程在后台运行时不做任何事情。

经过简短的研究,我们发现可以通过挂钩到 Objective-C 方法 -[FigCaptureClientSessionMonitor _updateClientStateCondition:newValue:] 来防止 mediaserverd 撤销对摄像头的访问权限,因此不需要代码覆盖。

为了注入 mediaserverd,我们使用了 lldb。 Lldb 不依赖于任务端口,而是调用内核进行代码注入。实际上,已经具有内核代码执行能力的攻击者可以替代 mediaserverd 的“权限”来执行此类注入。

POC源代码可以在这里找到。

根据 2015 年之前的实验,Mac 上前置摄像头旁边的绿灯不能仅使用软件关闭。修改 AppleCameraInterface 驱动程序并上传自定义网络摄像头固件没有解决问题。绿灯无法关闭,因为它在摄像头开机时亮起。只要有电,灯就会一直亮着。从隐私角度来看,基于硬件的指示器是理想的。我们尚未在最近的 Mac 版本/硬件上对此进行验证。

我们做了一个演示,从后台进程访问摄像头/麦克风,并使用RTMP协议流视频/音频,步骤如下:

1.设置RTMP服务器;

2.编译mediaserver_patch,将代码注入mediaserverd;

3.编译 ios_streaming_cam,使用以下权限重新签署二进制文件并在后台运行;