详解恶意软件 XcodeSpy 如何针对 iOS 开发人员展开供应链攻击
编译:奇安信代码卫士团队
威胁行动者滥用苹果 Xcode IDE 中的 Run Script 功能通过共享 Xcode 项目感染毫不知情的Apple 开发人员;
XcodeSpy 是一个恶意 Xcode 项目,在开发者的macOS 计算机上安装 EggShell 后门的自定义变体及持久机制;
该后门拥有的功能包括记录受害者的麦克风、摄像头和键盘以及上传并下载文件。
其它威胁行动者也可利用 XcodeSpy 感染向量,建议所有使用 Xcode 的 Apple 开发人员在使用共享 Xcode 项目时特别注意。
本文提供了开发人员可扫描 Xcode 仓库中 XcodeSpy 的简单方法。
今年出现了两个新趋势:攻击针对开发人员以及通过供应链攻击感染大量客户。攻击软件开发人员是成功实施供应链攻击的第一步。其中一种攻击方法是滥用必要的开发工具。2021年1月,谷歌威胁分析团队公开指出发现某朝鲜黑客组织攻击安全研究人员和开发人员。其中的一种感染方法是共享旨在加载恶意 DLL 的 Visual Studio 项目。本文SentinelLabs讨论的是通过恶意 Xcode 项目攻击 Apple 开发人员的类似攻击活动。
最近,我们从匿名研究员处获悉,某木马化项目在野攻击 iOS 开发人员。该恶意项目是对 GitHub 上合法且开源项目的篡改版本。该项目为 iOS 开发人员提供了多种高级功能,基于用户交互模拟 iOS Tab Bar。
然而,XcodeSpy 版本被稍作修改,当开发人员的 build 目标发布时就会执行混淆后的 Run Script。该脚本联系攻击者的 C2 并在开发机器上释放 EggShell 后门的自定义变体。该恶意软件安装用户 LaunchAgent 用于实现持久性并记录受害者麦克风、摄像头和键盘信息。
我们发现了该 payload 的两个变体,它们是包含多个加密 C2 URL 和多种文件路径加密字符串的自定义后门。其中一种加密字符串在经篡改的 Xcode 项目和自定义后门之间共享,成为 “XcodeSpy” 攻击活动的一个组成部分。
此时,我们注意到美国某组织机构中的一个 ITW 案例。分析指出,该攻击活动至少活跃于2020年7月至10月期间且可能攻击位于亚洲的开发人员。
截止目前,我们无法发现其它木马化 Xcode 项目样本且无法估测该攻击活动的范围。然而,已知样本所展现的时间线和如下指标说明可能还存在其它 XcodeSpy 项目。我们分享这起攻击活动的目的是希望提高对该攻击向量的意识并强调一个事实:开发人员是攻击者的高价值目标。
隐藏并发布 XcodeSpy 使用的恶意脚本是一种简单技术,它可被部署在任意共享的 Xcode 项目中。因此,所有 Apple 开发人员在使用第三方 Xcode 项目时均应检查恶意 Run Scripts是否存在。如下“检测和缓解“部分为开发人员提供了扫描现有本地 Xcode 仓库的方法。
XcodeSpy 利用Apple IDE 的内置功能,使开发人员能够在发布目标应用程序的实例时运行自定义 shell 脚本。虽然仔细查找可识别出这种技术,但由于控制台上并不存在提示或调试器表明存在恶意脚本,因此新手或经验不足的开发人员如意识不到 Run Script 功能则风险尤大。
我们分析的样本使用的是合法的开源项目副本 TabBarInteraction。为避免引起怀疑,该项目中的代码并未受 XcodeSpy 感染,且也并未有任何证据表明其开发人员 potato04 受感染。
在 TabBarInteraction 的篡改版本中,被混淆的恶意脚本位于 Build Phase 标签中。在默认情况下,Run Script 面板并未展开,从而使得该恶意软件能够避免被检测到。
点击披露按钮可看到被混淆脚本。
混淆非常简单,且通过 echo 替换 eval 并在单独 shell 中运行该脚本,即可安全检测输出。
该脚本在 /tmp 目录中创建了一个名为 “.tag” 的隐藏文件,其中包含一个单独的命令:mdbcmd,并经由反向 shell 被传送给攻击者的C2中。VirusToal 上的所有静态引擎均未检测出该样本。
我们发现该恶意 Xcode 项目时,cralev[.]me 上的 C2 已离线,因此无法直接确认 mdbcmd 命令的结果。不过幸运的是,VirusTotal 上存在两个 EggShell 后门样本,它包含能够说明问题的 XcodeSpy 字符串 /private/tmp/.tag。
6d93a714dd008746569c0fbd00fadccbd5f15eef06b200a4e831df0dc8f3d05b
cdad080d2caa5ca75b658ad102987338b15c7430c6f51792304ef06281a7e134
这些样本都是从日本通过 Web 接口上传到 VirusTotal 上的,第一个和第二个样本分别上传于8月5日和10月13日。
后一个样本还在2020年年末出现在位于美国的受害者的 Mac 上。出于机密性的考虑,我们无法提供关于 ITW 事件的更多详情。然而,受害者反复受到朝鲜 APT 组织的攻击,而且感染是在某次常规威胁捕获活动中发现的。
从日本上传样本的用户并未登录 VirusTotal 账户,因此我们无法判断这两个样本是否为同一个来源。尽管如此,它们之间且和 Xcode 项目之间通过字符串 P4CCeYZxhHU/Hh2apZ6EcXc= 存在关联,而且该字符串是恶意 Xcode 项目中所发现的 /private/tmp/.tag 字符串的加密版本。
EggShell 后门使用了一种简单的字符串加密技术。解密涉及将加密字符串传递给 [StringUtil decode:] 方法。该方法在 base64 中编码加密字符串,并对灭个字节进行迭代,并添加 0xf0。结果生成一个可打印的 ASCII 字符码,之后被拼接生成完整的字符串。
我们可基于如上伪代码,用 Objective-C 执行自己的解码器,解密位于 Mach-O 二进制中的字符串。
解码两个变体中的其它字符串时披露了大量硬编码 URL,它们用于从受害者机器上传数据。
https://www.suppro.co/category/search.php?ts=%@
https://www.liveupdate.cc/preview/update.php?ts=%@
https://www.appmarket.co/category/search.php?ts=%@
https://www.recentnews.cc/latest/details.php?ts=%@
https://www.truckrental.cc/order/search.php?ts=%@
https://www.everestnote.com/sheet/list.php?ts=%@
https://www.alinbox.co/product/product_detail.php?ts=%@
有数据存在的地方,后门二进制中的所有这些域名首次出现于或首次在 “whois” 查询中现身于9月10日或11日。
恶意 Xcode 项目中的域名 cralev[.]me 首次现身于9月10日。
TabBarInteraction Xcode 项目的篡改版本本身在一周前即9月4日出现在 VirusTotal 上。
并列来看这些日期,我们猜测攻击者将 XcodeSpy 项目文件上传到 VirusTotal 上的目的是在激活 C2 前测试是否会被检测到。除了 suppro[.]co 和 cralev[.]me 域名外,其它域名似乎未激活或未注册,可能是为未来使用做准备。有意思的是,VirusTotal 上关于 XcodeSpy 上传位置的国家代码信息是“ZZ”即“未知”。
同时,EggShell 后门变体首次现身在 VirusTotal 上的时间之间相差两个月(8月5日和10月13日)。如果这些后门是由受害者而非攻击者上传的,那么这表明第一个自定义 EggShell 二进制可能是早期 XcodeSpy 样本的payload。然而,我们无法基于现有数据做出如此证实。我们所知道的是第一个 EggShell payload 上传的时间比已知的释放器早整整一个月,比第二个 payload 上传的时间早两个多月。
执行时,自定义 EggShell 二进制或者在 ~/Library/LaunchAgents/com.apple.usagestatistics.plist 或者在 ~/Library/LaunchAgents/com.apple.appstore.checkupdate.plist 释放 LaunchAgent。该 plist 检查原始可执行文件是否在运行;如并未运行,则会从位于 ~/Library/Application Support/com.apple.AppStore/.update 的 ‘master’ 版本创建该可执行文件的副本。
EggShell 还会在/private/tmp/wt0217.lck 处释放一个零字节文件,并在 ~/Library/Application Scripts/com.apple.Preview.stors 处释放一个数据文件。其它文件路径也在二进制中加密。几乎所有的这些路径都被攻击者自定义化。然而,其中一个加密字符串解密到 /tmp/.avatmp 中,该默认路径出现在 EggShell 公开仓库中,用于存储 AV捕获。
EggShell 公开库中的源代码包含多种功能,用于实现持久性、屏幕捕获和 AV 记录等。
分析在野发现的和位于 VirusTotal 上编译后的 XcodeSpy 变体,即可执行变体及其自定义数据编码和键记录方法。
文末列出了所有已知的 IoC。所有 C2、路径名称和加密字符串都被高度自定义化且易于修改,它们的作用可能不如这些特定样本之前的攻陷指标有用。因此,需要我们通过行为检测解决方案来完全检测 XcoeSpy payload 是否存在。
威胁猎人和开发人员如需了解自己是否下载了包含 XcodeSpy 的项目,可运行如下命令手动搜索:
find . -name "project.pbxproj" -print0 | xargs -0 awk '/shellScript/ && /eval/{print "\033[37m" $0 "\033[31m" FILENAME}'
该命令行用于搜索同时包含字符串 shellScript 和 eval 的 Xcode 项目(位于project.pbxproj 文件中)Build Phrases 中的 Run Scripts。如发现,则会打印脚本副本用于检查,并打印出它的来源文件名称。
如下实例搜索的是 Documents 文件夹及其子文件夹中出现的 XcodeSpy。
在运行该命令前,用户应切换到保存 Xcode 项目的适当的父文件夹。
当然,也可通过 Xcode 项目导航中的 Build Phrases 标签查找个体项目中的恶意 Run Scripts。
这并非威胁行动者首次利用 Xcode 作为向量,感染 Apple 平台开发人员。2015年,XcodeGhost 为位于中国的 iOS 开发人员提供了从本地镜像而非Apple 服务器中更快下载的 Xcode版本。但接收者并不知道的是,有人修改了该版本,并把恶意代码插入通过 XcodeGhost 编译的任意 app 中。通过XcodeGhost 编译的应用可被攻击者用于读取并写入设备剪贴板,打开特定的 URL(例如 WhatsApp、Facebook)并将数据提取到 C2。实际上,XcodeGhost 是一起供应链攻击,通过第三方软件感染下游受害者。
对比之下,XcodeSpy 通过木马化 Xcode 项目的形式,使其比 Xcode IDE 的完整版本更轻量且更容易传播。虽然 XcodeSpy 似乎直接针对的是开发人员本身,而非开发人员的产品或客户端,然而,从在开发人员工作环境中开设后门到传播给该开发人员软件用户,距离很短。
虽然XcodeSpy 很可能是针对某个特定的开发人员或开发群体,但也可能存在其它场景。攻击者可拖网式检查高价值目标并收集用于后续攻击,或者试图收集 AppleID 凭据用于其它攻击活动中。另外还有多种可能性,这些可能性也可能互相影响。
IoCs:
找到软件供应链的薄弱链条
GitHub谈软件供应链安全及其重要性
https://labs.sentinelone.com/new-macos-malware-xcodespy-targets-xcode-developers-with-eggshell-backdoor/
题图:Pixabay License
本文由奇安信代码卫士编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的
产品线。