随着移动端安全软件对APK的查杀能力趋于成熟以及Google对Android安全性重视的提高,病毒与反病毒的主战场已逐渐从APP层扩展到Linux底层。而且病毒作者也开始把PC端的病毒自我保护手段运用到移动端上,在移动端大量使用了免杀、加密、隐藏、反虚拟机等传统PC端病毒自我保护技术。但是之前一直还未出现过通过感染技术实现自我保护的病毒,此次,360安全团队首次发现了在Android系统中通过感染方式隐藏自身恶意代码的木马病毒——长老木马之四。
0x00 长老四之前世今生
去年11月份,360安全团队截获了恶意手机木马“长老三代”,详细剖析挖掘了长老木马的整个有机生态链。并从传播源头开始进行强力打击,致使猖狂一时的长老木马迅速地消声灭迹。近期360安全团队发现改头换面的新版长老木马又“重出江湖”。
分析后发现,木马与“长老三代”有紧密的关系,在长老木马三代“疯狂崛起”时,以其子模块的形式存在,功能有限,而且也不具备对抗安全软件的能力,因此,我们将其命名为“长老四代”。
长老木马三代核心主体模块debuggerd与此子模块耦合度非常高。比如子模块由虚假debuggerd来启动,而且子模块运行时需要访问由假冒debuggerd下载生成的文件读取远程服务器地址,下载地址等。经过木马作者的“精心改进”后,子模块从“私生子”华丽“蜕变”为长老木马核心模块。
0x01 进化篇
与之前老版本相比,虽然在恶意行为特征上仍然以隐私劫取、恶意扣费为主,但是自我保护与对抗安全软件方面有较大技术突破。例如,在移动安全领域首次采用了静态感染技术,感染系统运行依赖的lib文件,加大了查杀难度。此外,还采用相似文件路径欺骗法、 样本MD5自变化等传统PC端的病毒技术。下图的文件MD5分别为778ff1b54aaf88075523f1a8b7c233f9、3a93af95ec45aabb44018fdc4dd34243。
图1 两个长老4代 ELF可执行文件的对比
对比可以看出,是文件末尾嵌入32位长度的字符串,导致同一版本长老四,出现几十万个变种。进一步分析发现,长老四会读取这段字符,解密后当作KEY,用于私有数据库等配置文件的AES/DES加密与解密。代码如下:
图2 获取AES密钥的部分代码
长老木马的进化如下:
图3 长老四代进化图
经过一段时间的观察与分析,我们梳理了“长四”的发现过程及关键的时间节点,如图所示:
图4 长老四代发现过程及响应
0x02 行为分析
长老木马四代主要分为launcher和核心作恶的ELF可执行模块。ELF可执行模块又包括distillery、plugins及redbean三个主要部分。 redbean模块会注入系统Phone进程,具有Phone进程权限,可以在未经用户允许下,后台私自订购SP业务,屏蔽订购确认和成功短信,给用户造成经济上的损失。
长老木马四代作恶流程如下:
图5 长老四代流程图
从启动方式来看,长老三代主要以替换系统原生文件为自身镜像,随系统启动时执行,由于安全软件对于这种类型的查杀方法已比较成熟,长老木马四代采用更加隐蔽的“静态感染”启动方式,将恶意代码插入到被感染的系统文件,在被感染系统文件中完成长老木马四代的启动工作。长老四代是在Android系统中首次采用感染技术的木马。
“长老四代”静态感染启动原理如下:
1、感染守护进程启动时依赖的正常库文件。在库文件的导入表里添加launcher的路径,使守护进程随操作系统启动时,加载并执行launcher的恶意代码。如下图所示,被感染的系统库文件的导入表中包含恶意库文件libs6x.so的路径。
图6 被感染的系统库文件\system\bin\libglog.so
2、Linux的动态链接器在加载ELF可执行文件或动态链接库时完成装载、映射、重定向后,首先依次执行pre_init、init、init_array节中描述地址指向的函数。这些函数都是早于入口点执行的。
图7 Launcher的init_array节
Linux的动态连接器执行这些函数的初衷原来是为了程序执行前初始化C++静态构造函数,C库的IO等等。木马作者巧妙利用Linux动态链接器对ELF文件的装载原理,在init_array段里写入了启动病毒长老四代的代码。
图8 启动长老木马可执行文件的代码片段
这种“静态感染”方式加大了我们的查杀难度。首先,增强了长老四代的隐蔽性,被感染的系统文件装载时加载恶意launcher,接着launcher启动ELF可执行文件。由于被感染的系统库文件除了导入表多了一行字符串(launcher的路径)之外,与其他正常系统库文件完全相同,容易躲过安全软件的“火眼金睛”。其次,增加杀毒软件的修复难度,由于被感染的库文件随系统进程启动时尝试加载导入表中的所有so文件,可能会因为安全软件的暴力删除导致手机系统挂机。
长老四代被launcher调度启动后,会生成隐藏的空文件“/data/local/tmp/.l1
”和“/data/local/tmp/.l6
”。根据长老木马版本,这些隐藏的空文件名有所不同。随后,生成加密的主体模块“distillery-1.0.7.drk
”,解密后生成“distillery.dex.jar
”,并加载执行其中的函数“com.alkohol.Main.main
”。
主要模块说明如下:
distillery
distillery.dex.jar
为长老木马四代病毒的核心主体框架,实现长老四代的核心功能。distillery模块的“com.alkohol.Main.main
”函数,运行时接受4个参数:arg0=长老木马路径、arg1=null、arg2=长老木马版本、arg3=null。
图9 长老木马运行时实际传递的参数值
distillery框架运行后生成的主要文件及文件夹:
图10 长老四代生成的主要文件及文件夹
图11 实际运行时留下的的文件及文件夹
核心插件
distillery主体框架启动后会解密plugins下的所有加密drk文件,并加载到内存中。
这些插件实现了接受远程服务端指令、恶意扣费、短信拦截监控、心跳、日志提交、下载和更新插件等长老木马四代的所有核心功能。
图12 插件列表
其中,具备核心功能的插件有mojito、margarita和gin。
mojito插件:完成手机短信监控的功能,过滤关键词由远程服务器下发,主要屏蔽SP扣费业务订购成功或确认短信,使用户无法察觉到自己订购了SP业务,短信监控相关部分代码如下:
图13 短信监控插件部分代码
Margarita插件:完成手机扣费功能,实现扣费功能的代码片段如下:
图14 付费插件部分关键代码
Gin插件:注入相关核心模块,解密后是
redbean.dex.jar
。redbean.dex.jar
打包了whitebean和libblackbean模块。whitebean和libblackbean的最终目的是把readbean.dex.jar
注入到Phone进程中。注入成功后readbean.dex.jar
可以实现读取拦截短信内容,后台拨号等敏感恶意行为。长老四代的注入流程是,whitebean在远程进程中加载libblackbean.so,libblackbean.so调用JNI_CreateJavaVM实现加载核心模块
readbean.dex.jar
。whitebean启动时接受6个参数:
arg0=待注入的目标进程、arg1=负责加载jar的so模块、arg2=核心模块、arg3=保存临时dex文件(jar运行时生成的临时dex存放路径)、arg4=运行模式(Debug模式和Release模式)、arg5=服务端日志存放路径。
运行时实际传递的参数值:
./whitebean com.android.phone libblackbean.so /data/usr/readbean.dex.jar /data/usr/cache Release /data/usr/server.log
whitebean运行后在远程进程
com.android.phone
的导入表中搜索获取dlopen、 dlsym、dlclose、dlerror等函数的调用地址,通过这些函数实现远程加载libblackbean.so,并调用libblackbean.so的inject_entry函数,把其余的参数(redbean.dex.jar
、/data/usr/cache Release
、/data/usr/server.log
)全部传递给它。libblackbean.so的inect_entry导出函数被执行后,调用JNI_CreateJavaVM加载
redbean.dex.jar
,并且调用redbean.dex.jar
中com.android.phone.os.Program
的Main函数。以此整个注入过程结束,下图为注入过程相关运行日志。图15 注入过程相关运行日志
Redbean
Redbean模块注入到Phone进程后具备了与Phone进程相同权限,可以获取敏感短信内容(比如手机验证支付密码)、私自订购SP业务、拦截短信(拦截删除SP订购成功短信)、后台拨号、关闭WIFI、打开G网等。
其函数
com.android.phone.os.Programs.main
被调用时接受2个参数:arg0=运行日志保存路径、arg1=日志输出级别。
main函数首先会初始化16个Command类。这些类会根据远程服务端下发的指令实现IMSI获取、短信发送与拦截、短信读取、切换APN、获取用户地里位置等指令。
图16 初始化16个Command类
注入后,发送用户手机信息(包括病毒版本、IMEI、IMSI、MAC地址等)到远程服务器(
v9bt.heycould.org/crutch
):图17 发送的用户信息
接着监听本地3549端口,等待远程服务端下发指令:
图18 握手连接过程
0x03 长老四背后的阴谋
我们在跟进长老木马四代时,发现了疑似作者开发的木马测试程序。主要有注入测试程序和SP业务订购测试程序。
1、注入测试程序
通过该测试程序我们能更加清晰的了解木马作者的意图。木马作者编写调试工具对自己编写的所有模块的功能进行了全面测试,如获取手机信息、注入行为成功与否、短信屏蔽与拦截、短信发送、APN切换等多种功能。
下图中可以看到几个非常敏感的功能,比如“后台通话”、“编辑屏蔽内容”、“注入”等:
图19 redbean注入测试程序
后台通话功能可以在后台给某特定电话号码拨号。在测试程序中发现了木马作者用作测试用的手机号,该手机号是否为木马作者本人还无法确定。
图20 后台通话测试相关代码
2、SP业务订购测试程序
木马作者为了方便测试SP业务订购模块,还做了SP业务订购测试工具。从该测试工具中可以看到木马作者事先已开通了SP业务通道,通过发送短信验证订购SP业务,并屏蔽掉SP提供商发送的确认短信和定制成功短信等。
图21 SP业务订购测试程序
测试程序的开发期时间线:
图22 木马测试工具开发时间线
测试程序的IP地址主要集中在北京与天津,美国也曾出现过,从开发的频率中可以看出,在2015年春节的时候,是开发版本最少的,5月和8月的高峰期,是主要功能的开发,作者对10多个手机品牌进行了病毒兼容性测试,在测试程序开发初期的2014年6月到2015年初进行了大量的兼容性测试,开发者主要使用的手机有ZTE_P6、 TCL_S960、 VOTO_V6、Sony_S39h。从这些数据推测病毒开发者应该是团队合作,具有测试流程的专业团队。
0x04 感染数据统计
我们从360安全中心后台统计该木马总感染量已经超过80万,近半年感染趋势如下图所示:
图23 长老四代感染数量
受长老四代影响的手机用户机型和系统也是非常的广泛,感染该木马的机型和系统分布如下图所示:
图24 木马感染机型分布
图25 木马感染系统分布
从地域分布来看,广东省是受到该木马影响最大,分布图如下图所示:
图26 木马感染地域分布
0x05 解决方案
随着360手机急救箱用户数的增长,被查杀到的木马越来越多,360手机急救箱独有的深度完整扫描,可以深度扫描和完美清除底层ELF病毒和APK病毒,目前市场上的主流手机安全产品几乎没有支持ELF完整深度扫描的功能,如果您的手机刷过第三方ROM或者手机已经Root,建议您采用360手机急救箱进行一次完整的深度扫描,帮助您安全用机。
附录一:长老木马四伪装的系统文件
/system/bin/playlpn | /system/bin/tinycapr |
/system/bin/sdiokit | /system/bin/racdvd |
/system/bin/kyexe | /system/bin/mkaswap |
/system/bin/setfatr | /system/bin/tunefs |
/system/bin/chcomn | /system/bin/s6xd |
/system/bin/getnforce | /system/bin/swaproff |
/system/bin/bcdcmd | /system/bin/md2pd |
/system/bin/rstrcon | /system/bin/dtfexe |
/system/bin/lpnkey | /system/bin/ftmdmn |
/system/bin/thrmal | /system/bin/tinyplayr |
/system/bin/hvdcpy | /system/bin/setnforce |
/system/bin/lowcat | /system/bin/ipoctl |
/system/bin/setsebl | /system/bin/dhdp6s |
/system/bin/rildm2 | /system/bin/npsobex |
/system/bin/confwexe | /system/bin/ccaptst |
/system/bin/hciattch | /system/bin/ntfsfixr |
/system/bin/mc640d | /system/bin/srvcext |
/system/bin/getsebl | /system/bin/clatdc |
/system/bin/smdiexe | /system/bin/ddcexe |
附录二:长老木马四代launcher的文件名
/system/lib/libbcd.so | /system/lib/libkye.so | /system/lib/libs6xd.so |
/system/lib/libbcdcmd.so | /system/lib/libkyexe.so | /system/lib/libsdi.so |
/system/lib/libcca.so | /system/lib/liblan.so | /system/lib/libsdioki.so |
/system/lib/libccapts.so | /system/lib/liblow.so | /system/lib/libsetfat.so |
/system/lib/libchc.so | /system/lib/liblowcat.so | /system/lib/libsetnfo.so |
/system/lib/libcon.so | /system/lib/liblpn.so | /system/lib/libsetseb.so |
/system/lib/libchcomn.so | /system/lib/liblpnkey.so | /system/lib/libsim.so |
/system/lib/libcla.so | /system/lib/liblsm.so | /system/lib/libsimg2l.so |
/system/lib/libclatdc.so | /system/lib/liblsm3cm.so | /system/lib/libsmd.so |
/system/lib/libcon.so | /system/lib/libmc6.so | /system/lib/libsmdiex.so |
/system/lib/libconfwe.so | /system/lib/libmc640d.so | /system/lib/libsrv.so |
/system/lib/libddc.so | /system/lib/libmd2.so | /system/lib/libsrvcex.so |
/system/lib/libddcexe.so | /system/lib/libmd2pd.so | /system/lib/libthr.so |
/system/lib/libddd.so | /system/lib/libmka.so | /system/lib/libthrmal.so |
/system/lib/libdhd.so | /system/lib/libmkaswa.so | /system/lib/libtin.so |
/system/lib/libdhdp6s.so | /system/lib/libnps.so | /system/lib/libtinyca.so |
/system/lib/libdtf.so | /system/lib/libnpsobe.so | /system/lib/libtinypl.so |
/system/lib/libdtfexe.so | /system/lib/libntf.so | /system/lib/libtun.so |
/system/lib/libftm.so | /system/lib/libntfsfi.so | /system/lib/libtunefs.so |
/system/lib/libftmdmn.so | /system/lib/libpla.so | /system/lib/libswa.so |
/system/lib/libgetnfo.so | /system/lib/libplaylp.so | /system/lib/libswapro.so |
/system/lib/libgetseb.so | /system/lib/libracdvd.so | /system/lib/libget.so |
/system/lib/libgeu.so | /system/lib/librac.so | /system/lib/libset.so |
/system/lib/libhci.so | /system/lib/libril.so | /system/lib/libs6x.so |
/system/lib/libhciatt.so | /system/lib/librildm2.so | /system/lib/librim.so |
/system/lib/libhvd.so | /system/lib/librstrco.so | /system/lib/libipoctl.so |
/system/lib/libhvdcpy.so | /system/lib/librst.so | /system/lib/libipo.so |
附录三:长老木马四代MD5
329846b610c76e884095ea9d5f5c8834 |
082bf566cc352c394577af7f1f797ae5 |
4659b1400f48318d0f63c47dc2b9b72e |
a86827029a76240557e6c30b2792df14 |
789295e3d7887a4c3c32b3a6e75e554f |
cef52d7da4882ab0a0501842d394295a |
2dab85922133d23af30daa3d77d09476 |
f7ba67aa8d5675f18990375e3454235b |
eac6a1cbae6f58a44cdbf7238ef91fa2 |
0dbf5bdfc6dd1bca39cff140e4fc7d59 |
d4e4e3f6cbef3808f8ad917a540f836d |
da7a39444869e39264f8f1ddc9c42a97 |
e42b6ce6c3931989c975ce59c457d66a |
e111dcc031a84ef725bcf3e81ed71f36 |
8de2c6ae586916cba989e0019105d274 |
ad18e3a36d3a67e1ecbc2220cae1483f |
8e2b79548050e4b9ad60d1d984f12d9d |
933a65e0105c4c0f5440aeffb3c1a764 |
8b2bd87da31254ef4ecb4ffcb8f26aa6 |
ae4936e5aad44b320f2bf5d698c92db4 |
706c4b63184a2ab2f809169a2b8fe9eb |
803573b88583e4b81dec39643d6f41b7 |
09ba245c80582cf115a870f43f3bc053 |
09dbbc772799723e43c34c9fae2f4ad8 |
0ae3e4a351cfe9d6228296537db418ec |
0fd672c1f0333403a59bbdf04c0af05e |
148c7874455c10834f0e7937f15dbddf |
18d8f5803e1f580c2410bb98b59a127d |
22046f82b2a72e5686603ab538b3a08a |
24af8fc3faf1a488d444e9a4de066073 |
25e881576d9c389e445787626f6cf43f |
2cce7a5f8d1b64b8f5b2e2760cc85894 |
33d5e3e723d3873420fc70a767de5e40 |
37fc9630b0dabe98b6d23bf6e5cc3aa2 |
3b2d947123032f130938fb361d2bd2cd |
3feab5d93fe5ff6a17f43ecfccd52274 |
45bf3cd32b9926ad516dd114c2f86fd2 |
5562b855d6355c963e12a66bea648c9e |
55eb106019a630b89b506feda186c287 |
5e9053e17e962cbbd8b36d6b1077684a |
5ff96879be23ac965bc2e2b6ded9234e |
60bab93a8a7930334283aee53089c746 |
6289059110505539e2feb61aecfcafee |
6405d4d65e2a7e124f6b067a87e2a3c3 |
691fe3e6f56fc2dcb2acd67c68c95c16 |
73f98eaa2ce77a5027a5dbff80841b90 |
79f1d3d921279777a0922e09c579815c |
7b8dfae2e5bedec452af3c2187d3dfdf |
8bb83547ec903cbb272ec21e6ff8c11e |
99b246167b11d9aa912a346a3f976486 |
9ded2e0b0557a18412ff8d17141594df |
9fdc479b76099b099ad85fafb3d80d17 |
a5dcad67df52793cc72a706697ddfb00 |
a91fb51b9ecaff59e0aa3f9131ae9f0d |
b7a29b102f332dc7ddc94c86d514e9fc |
bf12b4062293e553878e5a8ed5e5c8ee |
c372ab758d39e6e03ac544c053dba011 |
c4a942a1b5cffd89f79b9ed9c0dc7fc1 |
360本身就是个窃取用户信息的大病毒