深入分析CCleaner后门代码-编译环境污染供应链攻击案例 (深入分析的近义词)
整理分享深入分析CCleaner后门代码-编译环境污染供应链攻击案例 (深入分析的近义词),希望有所帮助,仅作参考,欢迎阅读内容。
内容相关其他词:深入分析问题是申论文章的重要组成部分,深入分析南水北调工程面临的新形势心得体会,深入分析的成语,深入分析南水北调工程面临的新形势心得体会,深入分析博腾股份,深入分析换一种说法,深入分析的成语,深入分析换一种说法,内容如对您有帮助,希望把内容链接给更多的朋友!
main函数之前的绿色代码块为编译器引入的CRT代码,这部分代码非用户编写的代码。 2.植入的恶意代码调用过程 可以看到CRT代码sub_CD内部*入了一个恶意call调用。 3.被植入恶意代码的CRT代码源码调用过程 通过分析,我们发现运用VS编译的Release版本程序的CRT反汇编代码与本次分析的代码一致,调用过程为: _mainCRTStartup-->__scrt_common_main_seh-->__scrt_get_dyn_tls_dtor_callback-->Maliciouscall 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静态链接库文件,方式有如下三种: 1.修改CRT库文件源码,重新编译并替换编译环境中的CRT静态库文件(LIB) 2.修改CRT库文件中某个OBJ文件对应的C源码,重新编译并替换LIB中对应的OBJ文件。 3.修改CRT库文件中某个OBJ文件的二进制代码,并替换LIB中对应的OBJ文件。CRT运行时库 C运行时库函数的主要功能为进行程序初始化,对全局变量进行赋初值,加载用户程序的入口函数等。定位CRT源代码 我们以VS为例,编写一个功能简单的main函数如下: 在main函数结尾处设置断点,运用/MD编译选项编译调试运行 切换到反汇编代码并执行到main函数返回: 返回后查阅源码可以看到对应的CRT源代码为:crtexe.c源代码路径: D:\ProgramFiles(x)\MicrosoftVisualStudio9.0\VC\crt\src\crtexe.c定位CRT静态链接库 参考MSDN我们知道,在VS中,运用/MD编译选项编译Release版本的程序引用的CRT静态库为msvcrt.lib,文件路径为: D:\ProgramFiles(x)\MicrosoftVisualStudio9.0\VC\lib\msvcrt.libLIB/OBJ文件介绍 以VS中的msvcrt.lib为例LIB 这里介绍静态库LIB文件,是指编译器链接生成后供第三方程序静态链接调用的库文件,其实是单个或多个OBJ通过AR压缩打包后的文件,内部包含OBJ文件以及打包路径信息,比如msvcrt.lib文件解压后得到的部分OBJ文件路径如下: 可以看到,msvcrt.lib解压后确实也有CRT对应的OBJ文件:crtexe.obj等OBJ 源代码编译后的COFF格式的二进制文件,包含汇编代码信息、符号信息等等,编译器最终会将需要运用的OBJ链接生成PE文件,crtexe.obj文件格式如下:攻击CRT运行时库 了解了CRT运行时库的编译链接原理,我们可以知道,运用/MD编译选项编译的main函数前的C运行时库函数在静态链接过程中是运用的msvcrt.ib中的crcexe.obj等进行编译链接的,并且源代码中定义不一样的main函数名称,编译器会链接msvcrt.lib中不一样的OBJ文件,列举部分如下表所示:修改crcexe.obj 我们以VS中编译main()函数为例,如果修改msvcrt.lib中的crcexe.obj的二进制代码,比如修改源码并重编译crcexe.c或者直收到故障机改crcexe.obj,再将编译/修改后的crcexe.obj替换msvcrt.lib中对应的OBJ,最后将VS中的msvcrt.lib替换,那么运用/MD编译选项编译的所有带有main()函数的EXE程序都会运用攻击者的crcexe.obj编译链接,最终植入任意代码。 为展示试验效果,我们通过修改crcexe.obj中main函数调用前的两个字节为0xCC,试验效果将展示编译的所有EXE程序main调用前都会有两条int3指令:crcexe.obj在msvcrt.lib中的路径: f:\dd\vctools\crt_bld\SELF_X\crt\src\build\INTEL\dll_obj\crcexe.obj 替换msvcrt.lib中的crcexe.obj 替换msvcrt.lib中的OBJ文件需要两步,这里直接给出方式: 1.移除msvcrt.lib中的OBJ文件 运用VS自带的LIB.EXE移除crcexe.obj: lib/REMOVE:f:\dd\vctools\crt_bld\SELF_X\crt\src\build\INTEL\dll_obj\crcexe.objmsvcrt.lib 2.向msvcrt.lib中*修改后的crcexe.obj文件 运用VS自带的LIB.EXE*污染后的crcexe.obj: libmsvcrt.libf:\dd\vctools\crt_bld\SELF_X\crt\src\build\INTEL\dll_obj\crcexe.obj 编译过程自动植入恶意代码 将替换了crcexe.obj的msvcrt.lib覆盖VS编译器中的msvcrt.lib: D:\ProgramFiles(x)\MicrosoftVisualStudio9.0\VC\lib\msvcrt.lib 重新编译执行我们的测验程序,可以看到在main函数执行前的两条*的int3指令:结论与思考 年9月初威胁情报中心发布了《供应链来源攻击分析报告》,总结了近几年来的多起知名的供应链攻击案例,发现大多数的供应链攻击渠道为软件*。通过污染软件的编译环境的案例不多,最出名的就是年影响面巨大的Xcode开发工具恶意代码植入事件,从当前的分析来看,CCleaner也极有可能是定向性的编译环境污染供应链攻击。以下是一些相关的技术结论: 1.针对LIB文件攻击方式可以通过重编译源码或者修改OBJ二进制代码这两种方式实现。 2.修改OBJ二进制代码实现对LIB文件的代码注入不一样于修改源码,此方式理论上可用于注入任何静态链接库LIB。 3.只需按照OBJ文件格式规范即可注入任意代码(shellcode),比如在OBJ中新增/扩大节,填充shellcode并跳转执行。 4.此攻击方式可以在用户代码执行前(CRT)、执行中(调用库函数)、甚至执行结束后执行植入的恶意代码,并且由于恶意代码并不存在于编写的源代码中,所以很难被开发人员发现。 5.攻击者完全可以植入某个深层次调用的开发环境下的静态库文件,以达到感染大部分开发程序并持久化隐藏的目的。 6.运用源代码安全审查的方式无法发现这类攻击 由于这类定向的开发环境污染攻击的隐蔽性及影响目标的广泛性,攻击者有可能影响CCleaner以外的其他软件,我们有可能看到攻击者造成的其他供应链污染事件。