c 源码 编译 dll-深入剖析CCleaner的侧门代码——环境污染供应链攻击编译案例

审查

2017年9月18日,Piriform官方发布安全公告,称该公司开发的CCleaner版本5.33.6162和CCleaner Cloud版本1.07.3191中的32位应用程序被植入恶意代码。 植入后门代码的软件版本被公开下载一个月左右,导致数百万用户深受影响,泄露与机器相关的敏感信息,甚至极少数恶意代码被执行。

CCleaner是由独立软件工作室Piriform开发的一款系统优化和隐私保护工具。 它已经被杀毒软件制造商 Avast 竞标。 主要用于清除Windows系统不再使用的垃圾文件,以释放更多的硬盘空间。 另一大功能是清除用户的上网记录。 自2004年2月发布以来,CCleaner的用户数量迅速下降,并迅速成为排名第一的系统垃圾清除和隐私保护软件。 但就是这样一款隐私保护软件,却被曝在正式版中被植入恶意代码,并且该恶意代码具有执行任意代码的功能。

这是继Xshell被植入侧门代码后,针对软件供应链的又一次严重攻击。 360威胁情报中心进一步分析相关技术细节,推测这是一起罕见的基于编译环境污染的软件供应链攻击,值得安全界分享讨论。

后门技术细节分析

恶意代码功能

植入恶意代码的CCleaner版本主要具有以下恶意功能:

攻击者在CRT初始化函数__scrt_get_dyn_tls_init_callback()中插入函数调用,并指示该函数调用执行另一段恶意代码。

收集主机信息(主机名、安装的软件列表、进程列表、网卡信息等)经过加密编码后,尝试通过HTTPS合约的POST请求发送到远程IP:216.126.225.148:443c 源码 编译 dll,以及伪造的HTTP头的HOST数组为:speccy.piriform.com,下载执行第二阶段的恶意代码。

如果IP失败,会根据月份生成一个DGA域名,并再次尝试相同的信息。 如果成功,第二阶段的恶意代码将被下载并执行。

植入方法推论

360威胁情报中心分析,该事件极有可能是攻击者入侵开发者机器,污染了开发环境中的CRT静态库函数所致。 从而导致在开发环境中开发的程序可能被人为植入恶意代码,相应的证据和结论如下:

1.植入的代码位于用户代码main函数之前

main函数之前的红色代码块是编译器引入的CRT代码,这部分代码不是用户编码的。

2、植入的恶意代码调用进程

c 源码 编译 dll-深入剖析CCleaner的侧门代码——环境污染供应链攻击编译案例

可以看出,CRT代码sub_4010CD中插入了恶意调用。

3、植入恶意代码的CRT代码源码调用过程

通过分析,我们发现用VS2015编译的Release版本程序的CRT反汇编代码与本次分析的代码一致,调用过程为:

_mainCRTStartup --> __scrt_common_main_seh --> __scrt_get_dyn_tls_dtor_callback --> 恶意调用

4、CCleaner中修改后的__scrt_get_dyn_tls_init_callback()与源码对比

综合以上证据,可以确定攻击者将恶意源码植入__scrt_get_dyn_tls_init_callback()中并重新编译成OBJ文件,然后替换开发环境中静态链接库中对应的OBJ文件,提示各个EXE编译在此过程中,编译器会通过被污染的恶意LIB/OBJ文件手动链接到恶意代码中,最终感染编译后的可执行文件。

__scrt_get_dyn_tls_init_callback() 函数位于源代码文件 dyn_tls_init.c 中。

攻击技术重现验证

编译环境的功能方面

通过分析发现,如果想要在程序的CRT代码中植入恶意代码,最好的办法就是攻击编译过程中引入的CRT静态链接库文件。 有以下三种方法:

修改CRT库文件源代码,重新编译并替换编译环境中的CRT静态库文件(LIB)

修改CRT库文件中某个OBJ文件对应的C源代码,重新编译并替换LIB中对应的OBJ文件。

修改CRT库文件中OBJ文件的二进制代码,替换LIB中对应的OBJ文件。

CRT运行库

c 源码 编译 dll-深入剖析CCleaner的侧门代码——环境污染供应链攻击编译案例

C运行时库函数的主要功能是初始化程序、为全局变量赋值、加载用户程序的入口函数等。

找到 CRT 源代码

我们以VS2008为例,编写一个简单的main函数如下:

#include“stdafx.h”

int main(int argc, _TCHAR* argv[])

printf("%dn", 1);

返回0;

在main函数末尾设置断点,使用/MD编译选项进行编译和调试

切换到反汇编代码,执行到main函数返回:

返回后查看源码可以看到对应的CRT源码为:crtexe.c

源码路径:

D:Program Files (x86)Microsoft Visual Studio 9.0VCcrtsrccrtexe.c

找到CRT静态链接库

参考MSDN,我们知道在VS2008中,Release版本使用/MD编译选项编译的程序引用的CRT静态库是msvcrt.lib,文件路径为:

c 源码 编译 dll-深入剖析CCleaner的侧门代码——环境污染供应链攻击编译案例

D:Program Files (x86)Microsoft Visual Studio 9.0VClibmsvcrt.lib

LIB/OBJ 文件简介

以VS2008中的msvcrt.lib为例

锂离子电池

这里介绍的静态库LIB文件是指生成编译链接后静态链接并由第三方程序调用的库文件。 其实就是AR压缩打包后的单个或多个OBJ文件。 包含OBJ文件和打包路径信息,如msvcrt.lib文件解压后得到的一些OBJ文件的路径如下:

可以看到,msvcrt.lib解压后,确实有CRT对应的OBJ文件:crtexe.obj等。

OBJ

源代码编译后的COFF格式的二进制文件包含汇编代码信息、符号信息等。编译器最终会链接要用来生成PE文件的OBJ。 crtexe.obj文件的格式如下:

攻击CRT运行库

了解了 CRT 运行时库的编译和链接原理后,我们可以知道,使用 /MD 编译选项编译的 main 函数之前的 C 运行时库函数,在静态链接过程中是使用 msvcrt.ib 中的 crcexe.obj 编译链接的,并且源代码中定义了不同的主函数名,编译器会链接msvcrt.lib中不同的OBJ文件,枚举部分如下表所示:

主函数名称

对应的OBJ文件

阐明

主要的()

crcexe.obj

c 源码 编译 dll-深入剖析CCleaner的侧门代码——环境污染供应链攻击编译案例

控制台应用程序的启动例程

_tmain()

wcrcexe.obj

具有宽字符的控制台应用程序的启动例程

WinMain()

crcexew.obj

Windows 应用程序的启动例程

wWinMain()

wcrcexe.obj

具有宽字符的 Windows 应用程序的启动例程

修改crcexe.obj

我们以在VS2008中编译main()函数为例。 如果更改了msvcrt.lib中crcexe.obj的二进制代码c 源码 编译 dll,例如更改源代码重新编译crcexe.c或直接更改crcexe.obj,则编译/修改crcexe.obj替换msvcrt.lib中对应的OBJ,并且最后替换VS2008中的msvcrt.lib,那么所有使用/MD编译选项编译的具有main()函数的EXE程序都会使用攻击者的crcexe.obj进行编译链接,最终植入任意代码。

为了证明实验的效果,我们将crcexe.obj中main函数调用前的两个字节改为0xCC。 实验效果会发现,所有编译后的EXE程序的主调用之前都会有两条int3指令:

msvcrt.lib中crcexe.obj的路径:

f:ddvctoolscrt_bldSELF_X86crtsrcbuildINTELdll_objcrcexe.obj

替换msvcrt.lib中的crcexe.obj

c 源码 编译 dll-深入剖析CCleaner的侧门代码——环境污染供应链攻击编译案例

替换msvcrt.lib中的OBJ文件需要两步,这里是直接方法:

删除 msvcrt.lib 中的 OBJ 文件

使用VS自带的LIB.EXE删除crcexe.obj:

lib /删除:f: dd vctools crt_bld SELF_X86 crt src build INTEL dll_obj crcexe.obj msvcrt.lib

将修改后的crcexe.obj文件插入msvcrt.lib中

使用VS自带的LIB.EXE插入被污染的crcexe.obj:

lib msvcrt.lib f:ddvctoolscrt_bldSELF_X86crtsrcbuildINTELdll_objcrcexe.obj

编译时手动植入恶意代码

替换crcexe.obj的msvcrt.lib覆盖VS编译器中的msvcrt.lib:

D:Program Files (x86)Microsoft Visual Studio 9.0VClibmsvcrt.lib

重新编译并执行我们的测试程序,我们可以看到在main函数执行之前插入了两条int3指令:

结论与思考

2017年9月初,360威胁情报中心发布了《供应链源头攻击分析报告》(阅读原文),总结了近年来多起著名的供应链攻击案例,发现大部分供应链攻击渠道是捆绑软件。 污染软件编译环境的案例并不多。 最著名的就是2015年影响巨大的Xcode开发工具恶意代码植入事件。从目前分析来看,CCleaner也极有可能是定向编译环境污染源。 连锁攻击。 以下是一些相关的技术推论:

由于此类定向开发环境污染攻击的隐蔽性和受影响的目标范围广泛,攻击者可能会影响除CCleaner之外的其他软件,我们也可能会看到攻击者引发的其他供应链污染事件。

参考链接

(v=vs.90).aspx

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 c 源码 编译 dll-深入剖析CCleaner的侧门代码——环境污染供应链攻击编译案例 https://www.wkzy.net/game/163649.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务