文章总结: 文档剖析了Predator间谍软件的反分析技术,包括利用错误代码系统诊断环境,检测开发者模式、越狱及安全工具。该软件具备反取证能力,能监控删除崩溃日志并阻止内存转储,还利用ROP链及Hook技术隐藏录制指示器,展现了高度隐蔽的智能攻击策略。 综合评分: 96 文章分类: 恶意软件,移动安全,逆向分析,威胁情报
苹果手机间谍软件Predator中未公开的反检测反蜜罐反取证技术
原创
黑鸟 黑鸟
黑鸟
2026年1月15日 23:48 中国香港
黑鸟一直持续关注Predator间谍软件的最新技术点,近期相关文章可阅读Intellexa联盟与Predator间谍软件的故事,建议阅读后再阅读此篇
黑鸟,公众号:黑鸟Intellexa联盟0day漏洞攻击不止:泄露分析揭全球监视黑幕
在数字战场的阴影中,Predator 间谍软件就像一位经验老道的猎手,由 Intellexa 开发,专为 iOS 系统设计。
它并非单纯的入侵工具,而是配备精密的诊断系统,能将每次失败转化为宝贵情报,帮助操作员优化策略,避免暴露踪迹。
这个故事从一次典型的感染尝试展开,逐步揭示 Predator 的逻辑流程:
从初始部署,到多层检测,再到自我保护和清理,每一步都如棋局中的精妙布局,旨在躲避研究人员和安全工具的追捕。
故事伊始,Predator 通过精心利用的漏洞悄然进入目标设备,驻扎在 /private/var/tmp/ 目录中。
这是它的临时基地,但它不会贸然行动。
首先,它激活核心类 CSWatcherSpawner::CSWatcherSpawner,通过 check_perform() 函数启动一系列检查,确保环境安全。
如果任何一步失败,它会触发结构化的错误代码系统(范围 301–311),向指挥与控制(C2)服务器报告具体问题,然后自我清理。
代码如 301、307、308 被保留作为占位符,而 302、303、305、306 则缺失——可能已弃用、特定于变体,或与其他 Intellexa 产品共享。
第一道关卡:多实例检测(错误代码 311)。
Predator 调用 getCountNames() 函数,使用 sysctl 系统调用枚举所有进程,再通过 proc_pidpath() 获取每个进程的可执行路径。
它仔细计数位于 /private/var/tmp/ 中的实例。
如果发现两个或更多,它会有所察觉,这可能意味着设备已被多次尝试感染,或正处于监控状态。
于是,它报告 311 代码,告知操作员“多个实例运行中”,然后中止行动。这不仅仅是逃避,更是诊断:
操作员能据此判断是否需等待或更换策略。
紧接着,Predator 检查开发者模式。
通过 is_developer() 函数,它查询 sysctlbyname(“security.mac.amfi.developer_mode_status”)。如果返回 true(特别是在 iOS 16+ 版本),表明开发者模式启用,这往往是研究人员的测试环境。
Predator 会立即停止,避免落入陷阱,帮助操作员识别出目标可能是安全专家。
接下来是越狱检测,使用 is_not_phone() 函数和 access() 系统调用扫描特定路径:
/bin/bash、/private/var/tmp/cydia.log、/Applications/Cydia.app、/private/var/lib/apt/、/private/var/lib/cydia、/etc/apt 和 /private/var/stash。它还检查 /bin/ 目录的条目数是否超过 2(标准 iOS 仅 ≤ 2)。
如果检测到越狱迹象,它会悄然退场,报告相应代码,让操作员知道设备已被修改,可能不适合感染。
地理限制是另一层防护(错误代码 309),Predator 通过 NSLocale 获取国家代码,如果匹配 “US”美国 或 “IL”以色列,它会中止执行,或许是为了规避高风险地区的法律审查。
这一步确保了行动的地域针对性,避免无谓的暴露。
更巧妙的,是控制台检测(错误代码 310),在 is_console_attached() 函数中,它比较 /private/var/preferences/Logging/com.apple.diagnosticd.filter.plist 文件的修改时间 (mtime) 与系统启动时间。
如果 mtime > 启动时间,表明日志记录是在引导后启用的,这暗示设备可能连接了调试控制台。
Predator 会触发 310 代码,报告给 C2,帮助操作员推断目标是否在被监控。
安全工具检测(错误代码 304)是 Predator 躲避研究人员的杀手锏,通过 is_unsafe_running() 函数,它扫描运行进程,寻找 tcpdump、frida-server、netstat、sshd、checkra1nd、loader、McAfee、AvastMobileSecurity、NortonMobileSecurity,甚至 Bash 和 checkrain。
如果检测到这些,它会中止,并报告 304 代码。这不仅仅针对专业工具如 Frida(用于逆向工程),还包括日常安全应用,让操作员知道失败源于目标的防护措施,而非兼容性问题。
同时,它检查自定义 HTTP 代理(/private/var/preferences/SystemConfiguration/preferences.plist)和根证书(/private/var/protected/trustd/private/TrustStore.sqlite3,使用 SQL 查询如 “select * from tsettings WHERE length(sha256) > ?” 和 “select tset FROM tsettings WHERE INSTR(tset, ?)”),以检测潜在的 MITM 攻击或分析环境。
如果所有检测通过,Predator 进入潜伏阶段,但它仍保持警惕。
通过 monitoringCrashReporter() 函数,使用 kqueue 监视 /private/var/mobile/Library/Logs/CrashReporter/ 目录,一旦新崩溃日志生成,立刻删除。
同时,在 crash_reporter_block_handler 中,如果日志文件名含 “SystemMemory”,它会定位并用 SIGKILL (信号 9) 杀死 mmaintenanced 守护进程,抑制内存转储,防止内存取证。
为进一步规避,它隐藏录音指示器。通过 TestHooker() 或 UMHooker 函数,利用 Mach 异常处理注入 SpringBoard 进程,钩住 SBRecordingIndicatorManager 方法。
当麦克风或摄像头激活时,抑制橙色/绿色指示灯,让受害者毫无察觉。
内核级技术是其核心,如 NSTaskROP::WithoutDeveloperMode 类,使用返回导向编程 (ROP) 链,即使无开发者模式也能实现持久注入和Hook。
它还预留了 is_corellium() 函数(地址 0x100005bb8),虽在本样本中未调用,但暗示了对 Corellium 虚拟化平台的潜在检测。
如果行动失败,Predator 的逻辑闭环启动:注册Darwin通知观察者(Darwin Notification Observer),监听 com.apple.springboard.deviceWillShutDown 事件,在关机时移除磁盘痕迹。
然后,使用 _remove() 删除暂存目录 /private/var/tmp/ 中的内容。
所有这些,都在 C2 回调后执行,确保失败也成为学习机会。
这个故事并非虚构,而是 Predator 真实的行为逻辑:
从诊断失败(如 304 代码揭示的安全工具),到压制日志(如崩溃报告),再到适应性规避(如网络监控检测)。
它让研究人员面临更大挑战:失败感染不再是死胡同,而是运营商的调试工具。
最终,在这个猫鼠游戏中,Predator 提醒我们:间谍软件的进化,正从简单入侵转向智能诊断与持久隐藏,剩下的,就是要想办法如何应对它们。
详细报告&翻译:
https://www.jamf.com/blog/predator-spyware-anti-analysis-techniques-ios-error-codes-detection/
2024年12月,谷歌威胁情报小组(GTIG)发布了关于Intellexa Predator间谍软件的详尽研究报告,记录了其零日漏洞利用链和PREYHUNTER阶段性组件。他们的研究发现,“监视”模块能够检测开发者模式、越狱工具、安全应用程序和网络拦截配置。
然而,Jamf Threat Labs 在对 Predator 样本进行独立逆向工程时,发现了一些未公开的机制,揭示了这款间谍软件反分析能力的真正复杂程度。本文将介绍以下原创发现:
一套完整的错误代码分类体系(301-311),使操作人员能够准确诊断植入物失效的原因。
每种检测方法的实现细节,而不仅仅是高层次的描述
一个未公开的用于反取证的崩溃报告监控系统
SpringBoard 钩子用于向受害者隐藏录制指示器
内核利用类名揭示了其内部架构
这些发现表明,Predator 操作员可以详细了解部署失败的情况——这种能力对试图分析这些样本的研究人员具有重大意义。
CSWatcherSpawner架构
该植入程序包含一个名为 transforming\_analysis 的 C++ 类CSWatcherSpawner::CSWatcherSpawner,用于协调所有反分析检查。该类实现了一套全面的检测方法,并配备了完善的报告机制。
该架构的显著特点不仅在于检查范围广,还在于其报告机制,该机制可在部署失败时为操作员提供精确的诊断信息。
check_perform() 入口点显示了 getCountNames() 检查和错误代码 311,用于检测多个实例
图 1:check_perform() 入口点,显示 getCountNames() 检查和多实例检测的错误代码 311 分发
错误代码分类
最重要的未记录发现是Predator的错误代码系统。当任何反分析检查触发时,恶意软件并不会直接终止,而是在清理并退出之前,向其命令与控制基础设施报告一个特定的错误代码。
该check_perform()函数揭示了完整的分类体系:
错误代码列表(301 至 311),缺少 302、303、305 和 306,并显示了触发条件和检测方法。
表 1:错误代码及其条件
缺失的错误代码:302、303、305、306
仔细检查二进制文件的字符串部分,可以发现错误代码分类中存在一个有趣的漏洞。该__cstring部分存储的错误代码按顺序出现,但存在明显的间隔:
分析截图显示了 __cstring 部分中的错误代码字符串。
图 2:__cstring 部分中的错误代码字符串——注意地址是连续的,但代码却不是连续的(301、304、307、308),这表明缺少 302、303、305 和 306。
值得注意的是,错误代码 302、303、305 和 306 在此样本中完全缺失。编号方案中的这些缺失暗示了以下几种可能性:
保留代码:用于尚未实现的未来功能或检查的占位符代码
特定版本:这些代码可能用于其他 Predator 变体或针对不同平台的版本
已弃用的检查:已移除但其错误代码仍保留在分类法中的检测方法
共享分类法: Intellexa 多个产品共享的错误代码系统,不同产品实现不同的子集。
非连续编号(从 301 跳到 304,再从 304 跳到 307)表明此错误分类随着时间的推移而演变,或者旨在适应可能根据目标配置有条件编译的检查。
为什么这很重要
这套错误代码系统将部署失败的情况从“黑盒”转化为诊断事件。当操作员针对目标部署 Predator 并收到错误代码 304 时,他们就知道目标正在运行安全工具——并非漏洞利用失败,也并非设备不兼容,而是明确表明正在进行主动分析。
这对目标个人有直接影响:如果 Frida 等安全分析工具正在运行,Predator 将中止部署并向操作员报告错误代码 304,然后操作员可以排查部署失败的原因。
检测实施细节
虽然谷歌的研究提到Predator可以检测“自定义HTTP代理”和“自定义根CA”,但具体的实现细节并未公开。以下是二进制文件揭示的内容:
多实例检测(错误 311)
首先,调用check_perform()会getCountNames()检查是否存在多个 Predator 实例正在运行。这可以防止研究人员同时运行多个分析实例:
getCountNames() 伪代码的屏幕截图
图 3:getCountNames() 伪代码 — 通过 sysctl 枚举所有进程,使用 proc_pidpath 获取可执行文件路径,统计从 /private/var/tmp/ 目录运行的进程数
该函数遍历所有正在运行的进程sysctl,通过检索每个进程的可执行文件路径proc_pidpath(),并统计有多少进程正在从/private/var/tmp/(Predator 的暂存目录)运行。如果计数为 2 或更高,则报告错误代码 311。
开发者模式检测:针对研究人员
基于谷歌发现 Predator 可以检测开发者模式,我们反向工程分析了这种检查的工作原理。
该is_developer()函数专门针对使用 API 的 iOS 开发者模式sysctlbyname:
分析屏幕截图显示对 sysctlbyname 的调用
图 4:开发者模式检测实现,显示了 sysctlbyname(“security.mac.amfi.developer_mode_status”) 调用
这一点意义重大,因为 iOS 16 中专门为安全研究人员和开发者引入了开发者模式。通过检测到这一点,Predator 实际上表明:“如果你启用了开发者功能,你可能不是普通的攻击目标。”
越狱检测:is_not_phone()
该is_not_phone()函数检查是否存在与越狱相关的文件和目录:
流程图显示了越狱指标的检查
图 5:is_not_phone() 图形视图 — 越狱指示器的级联文件存在性检查
该函数使用系统调用检查以下路径access():
/bin/bash— Shell 二进制文件(原生 iOS 系统中不存在)
/private/var/tmp/cydia.log— Cydia 软件包管理器日志
/Applications/Cydia.app— Cydia应用程序
/private/var/lib/apt/— APT 软件包管理器目录
/private/var/lib/cydia— Cydia 数据目录
/etc/apt— APT 配置
/private/var/stash— 越狱藏匿处目录
此外,它还会检查是否/bin/包含两个以上的条目(原生 iOS 在 /bin 中只有最少的二进制文件)。
地理限制:避开美国和以色列的管辖权
谷歌的研究发现,Predator 会检查设备所在地区是否为美国或以色列。我们的分析记录了这一地理位置检查的具体实现方式(错误代码 309),值得进一步关注。Predator 无法在地区设置为美国或以色列的设备上运行。
分析截图显示了地理限制检查
图 6:使用 NSLocale 进行地理限制检查 — 将国家/地区代码与“US”和“IL”进行比较,触发错误 309
虽然我们无法证实,但这很可能是 Intellexa 为避免在网络犯罪法律严密且执法部门与 Intellexa 欧洲总部积极合作的司法管辖区面临法律风险而做出的刻意决定。
控制台检测:基于时间的分析
该is_console_attached()函数采用了一种巧妙的基于时间的方法:
调试控制台检测显示 is_console_attached() 调用和错误代码 310 分发
图 7:调试控制台检测显示 is_console_attached() 调用和错误代码 310 分发
此检测方法会将 diagnosticd 过滤器文件的修改时间与系统启动时间进行比较。如果有人在设备启动后启用了控制台日志记录(例如研究人员的操作),则该文件的修改时间将比启动时间更新。
安全工具检测:完整列表
谷歌的研究提到了“Bash、tcpdump、frida、sshd 或 checkrain”,但二进制文件中实际包含的列表更长。该is_unsafe_running()函数会显示完整的进程检测列表:
完整的过程检测列表
图 8:is_unsafe_running() 程序集 — 完整的进程检测列表,包括 tcpdump、frida-server、netstat、sshd、checkra1nd、loader、McAfee、AvastMobileSecurity、NortonMobileSecurity
检测到的所有进程完整列表还包括:
tcpdump— 网络数据包捕获
frida-server— 动态仪器框架
netstat— 网络统计
sshd— SSH守护进程
checkra1nd— checkra1n 越狱
loader— 通用加载进程
McAfee— McAfee 移动安全
AvastMobileSecurity— Avast 移动安全
NortonMobileSecurity— 诺顿移动安全
netstat 的加入值得注意——这表明 Predator 不仅关注使用专业工具的研究人员,也关注那些可能监控自身网络连接的目标。一个注重隐私的用户仅仅是检查自己的网络连接,就可能触发这种检测。
错误报告和关机后的自我清理
Predator 向 C2 报告错误代码后,会通过删除其暂存目录来执行自我清理:
自清理代码
图 9:错误报告后,自清理代码调用 _remove 函数移除 /private/var/tmp/ 暂存目录。
此清理操作发生在 C2 回调之后,确保即使恶意软件立即被移除,操作员也能收到诊断信息。
另一个清理机制与设备关闭生命周期相关,该植入程序注册了一个 Darwin 通知观察器,用于“com.apple.springboard.deviceWillShutDown”。
用于注册关机信号监听器的代码
图 10:注册关机信号监听器的代码
当收到关机通知时,程序会转入清理程序,删除磁盘上存在的特定证据。
关闭过程中的自清理代码
图 11:关闭过程中的自清理代码
未记录的反取证措施:崩溃报告监控
在任何公开研究中都没有提及的一项功能是monitoringCrashReporter():
monitoringCrashReporter() 函数
图 12:monitoringCrashReporter() — 基于 kqueue 的 /private/var/mobile/Library/Logs/CrashReporter/ 监控
此函数使用 kqueue 监控 CrashReporter 目录中的新文件。当发生可能暴露 Predator 存在的崩溃时,处理程序会在崩溃日志被同步或检查之前对其进行处理或删除。
内存取证抑制:杀死 mmaintenanced
崩溃处理程序专门针对内存取证证据:
崩溃报告器块处理程序代码
图 13:crash_reporter_block_handler — 当检测到系统内存崩溃报告时终止 mmaintenanced 进程。
当崩溃报告文件名包含“SystemMemory”时,处理程序会立即定位并mmaintenanced使用 SIGKILL(信号 9)终止该进程(内存维护守护进程)。这会阻止调查人员捕获内存转储。
这对取证工作意义重大:崩溃日志是检测攻击尝试的宝贵证据,而 Predator 会主动抑制它们。
录音指示器隐藏
该TestHooker()函数揭示了 Predator 如何向受害者隐藏 iOS 录制指示器:
UMHooker 核心功能
图 14:UMHooker 使用 Mach 异常处理实现跨进程钩入 SpringBoard
这段代码定位到 SpringBoard 进程,利用内核漏洞注入 SpringBoard,并钩住 SBRecordingIndicatorManager 的方法来抑制录制指示器。当 Predator 激活麦克风或摄像头时,受害者将看不到橙/绿色的指示点。
内核利用类名
代码中透露了几个内部类名,这些类名表明了攻击架构:
表2:类名及其用途
该NSTaskROP::WithoutDeveloperMode模板特别有趣——它表明 Intellexa 已经开发出即使在禁用开发者模式(大多数用户的默认状态)的情况下也能工作的 ROP 技术。
存根功能:is_corellium()
一个有趣的实例是is_corellium()地址处的函数0x100005bb8:
Corellium 是一个基于云的 iOS 设备虚拟化平台,常被安全研究人员使用。此存根函数的存在表明 Intellexa 已知晓 Corellium 是一个分析平台;检测机制可能已经实现但后来被禁用,或者计划在未来的版本中加入检测功能。
本示例中并未调用此函数check_perform(),但它的存在表明研究人员了解研究界的工具。
IOCs的迹象
文件访问模式
/private/var/preferences/SystemConfiguration/preferences.plist(代理检查)
/private/var/preferences/Logging/com.apple.diagnosticd.filter.plist(控制台检查)
/private/var/protected/trustd/private/TrustStore.sqlite3(根证书检查)
/private/var/mobile/Library/Logs/CrashReporter/(崩溃监控)
越狱检测路径
/bin/bash /private/var/tmp/cydia.log /Applications/Cydia.app /private/var/lib/apt/ /private/var/lib/cydia /etc/apt /private/var/stash
过程检测目标
tcpdump, frida-server, netstat, sshd, checkra1nd, loader, McAfee, AvastMobileSecurity, NortonMobileSecurity
SQL 查询(信任库)
select * from tsettings WHERE length(sha256) > ? select tset FROM tsettings WHERE INSTR(tset, ?)
结论
分析表明,Predator 的反分析能力比之前记录的更为复杂。错误代码分类表明,Intellexa 操作员能够细致地了解部署失败的原因,从而能够针对特定目标调整策略。
对研究人员而言,这些发现凸显了以下方面的重要性:
物理隔离的分析环境:
C2 回调意味着任何联网的分析都会向操作员发出警报。
崩溃日志保存:在分析开始前启用崩溃日志收集。
进程名称感知:即使运行 netstat 也会触发检测。
启动时注意事项:在启动前配置的控制台日志记录可能会绕过基于时间的检测。
对于更广泛的安全社区而言,这项分析表明,商业间谍软件供应商投入了大量工程资源来检测研究人员,而不仅仅是绕过安全产品。存根的存在is_corellium()表明,他们正密切关注着我们的工具,正如我们密切关注着他们的工具一样。
附录:函数参考
功能表及其对应地址和描述
表3:功能列表及其相关地址和描述
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:黑鸟 黑鸟 黑鸟《苹果手机间谍软件Predator中未公开的反检测反蜜罐反取证技术》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论