我们将在本文介绍最近攻击者是如何避开摄像头和麦克风绿色/橙色指示器,来悄悄监视用户的。
从iOS14开始,苹果多了几个新指示器:一个绿点和一个橙点。当访问摄像头或麦克风时,这些指示灯会发出信号。
当没有绿色/橙色圆点时,就意味着手机没有被监听。
我们知道像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.speechrecotioncore.speechrecotioncore.speechrecotiondaemon注入一个恶意线程,攻击者就可以对麦克风进行静默访问。摄像头访问需要额外的补丁,我们稍后会讨论它。
绕过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驱动程序并上传自定义网络摄像头固件没有解决问题。绿灯无法关闭,因为它在摄像头开机时亮起。只要有电,灯就会一