转自CSDN《程序员杂志》 作者:三金,火点
短信,一个几乎很少有人使用的通信手段,却因为利益的驱使,使得短信木马泛滥,更有一个庞大的黑色产业链在高速运转,短信木马为何屡杀不尽呢?我们为您解密!
近日逛了逛以某西游记人物命名的威客网,看到一个项目需求是要做安卓短信转发的应用。正好笔者对安卓系统安全以及短信都有所涉猎,因此对该项目产生了兴趣。
项目需求主要归结为以下几点:
1)主动告知,应用在被控制手机上安装之后要自动发送一条短信到指定号码(主控手机)。
2)短信拦截,被控手机收到的所有短信都会自动转发给主控手机。
3)拦截开关,主控手机可以通过发送短信命令的方式控制被控手机来开启或关闭短信拦截功能。
4)控制发送,主控手机可以控制被控制手机发送任意内容的短信到任意号码。
5)最重要的一点是,要求能够免杀,至少要过360。
从需求可以看出,此人要做的是一款短信木马。随着和他深入沟通也了解到短信木马背后的巨大黑色产业链。这条产业链主要由木马制造商,包马人,洗钱人构成。木马制造商主要是一些黑客或者程序员。包马人负责从木马制造商处购买木马,并通过网站挂马,诱骗安装、刷机等方式安装到用户的手机里,盗取用户的信息。而盗取来的用户的这些信息,则由洗钱人变现,最后和包马人分赃。
发这个需求的人就是包马人。根据这个包马人的描述,他们每天都会有几百名用户中招,对于他们来讲时间就是金钱。所以哪怕一个木马能够免杀一天他们也愿意花钱购买,用争分夺秒来形容,一点也不为过。而且包马人还很自豪的说,一般情况下一个月他们就可以赚一辆豪车。听起来确实挺暴利的,难怪他们敢冒着被抓的风险从事黑产。
短信木马的种类很多,主要有这么几类:
1)银行支付类木马,这类木马主要盗取用户的网银或支付类应用的账号和密码。
2)恶意订阅付费服务,这类木马主要通过后台静默发送短信订阅付费服务。
3)短信诈骗,这类木马通过后台静默给手机里的联系人发送诈骗短信。
实际中木马可能是多种功能混合的木马。包马人为了尽快得到免杀的木马,还主动发了一份安卓短信木马的源码给笔者,并说明把这款木马改成免杀就可以了。对于笔者来说这份源代码作为研究样本真是再好不过了。
结合代码分析和实际测试,笔者发现短信木马的隐蔽性和危害性做的都非常有技巧。接下来笔者就为各位详细剖析一下:
1)首先谈谈隐蔽性。之前就听过网上报到说网友中了木马,网银密码被盗,造成失窃的事情。笔者一开始就纳闷,被装了短信木马,桌面不是多了一个图标么。这个陌生的图标,谁一看都会怀疑的,怎么会发现不了呢。
原来木马一旦被安装,只要运行一次,那么在桌面上的木马图标就会消失。实现原理是在木马的Activity的onCreate方法里,会调用PackageManagerService的setComponentEnabledSetting方法来禁用当前的Activity。一旦Activity被PackageManagerService禁用,那么它就会从桌面上消失了。这对于普通的用户来说确实很难发现。
2)短信木马不仅在桌面隐藏图标,而且还会防卸载。稍微懂一点安卓的用户就会知道,在系统设置的“应用”里可以卸载安装在手机里的应用。如果木马是安装上去的,当然也应该可以从这里卸载掉。可是很不幸,你很有可能看到的是这样的界面,“卸载”按钮变灰了(如图1)。
图1 木马卸载按钮为灰色
这是怎么回事呢?原来木马的设计者利用了安卓系统里的“设备管理器”的机制。一旦用户不小心将一个申请设备管理的应用激活,那么这个应用就升级为设备管理器了,也就无法通过“卸载”按钮来卸载它。这时只需多做一步,进入“系统设置”,点击“安全”,然后找到“设备管理器”,将列表中的木马应用取消激活即可(如图2)。然后就可以正常卸载了。
图2 如何取消激活“设备管理器”
3)除了防卸载以外,短信木马还做了低内存防杀死。安卓系统在剩余内存比较低的时候,会选择系统中优先级不高的进程,将其杀死以释放内存。这款短信木马后台通过启动一个“前台服务”,来将自己在安卓系统中的优先级提的很高。这样木马进程就不容易被安卓系统杀死了,生存能力大大提升。但“前台服务”必须会在通知栏里留下一个通知,这似乎又违背了木马的隐蔽性要求。“聪明”的木马设计者,将这个通知做成了全透明。
图3 透明的前台服务通知
如图3,不仔细看还真是发现不了这里有个通知。但是如果通知多了,有时木马通知嵌在中间了,还是会引起有心人注意的。
4)隐秘性和健壮性都做的很好了,适配性上也不赖。由于安卓的版本众多,为了适配不同的安卓版本,一款应用一般会做一些适配性的工作,以保证在不同的安卓版本上也能正常运行。就短信拦截而言,在安卓4.4以前,只需要注册一个Receiver并把优先级提高,就可以先收到系统广播的Intent,从而实现拦截。但到了安卓4.4,系统只允许一个应用接收短信广播,而这个应用默认是设为系统短信应用的。所以短信木马无法通过Receiver来拦截。但是它做了很好的适配,对系统SMS URI注册了ContentObserver,一旦系统受到短信,并存入ContentProvider后,短信木马就立刻知道了。它会去立刻读取短信内容,然后转发,并且删除ContentProvider中的短信记录。使得用户无法看到正常的短信。这种修改数据的方式,也变相地做到了拦截短信。但这种方式会产生一次短信提示音,因为毕竟短信时被真实收下来再被删除的。因此安卓4.4的用户如果发现手机响了一下短信提示音,可是却找不到未读短信,那么就要怀疑是否中马了。
可见,这款木马真的很顽强,很隐蔽,功能也很强大。但从技术角度看短信木马的技术含量并不高,实现的门槛比较低。以这款短信木马为例,他涉及到的也就是Service、BroadcastReceiver、DeviceAdmin、ContentObserver等机制,这些都是安卓提供给开发者使用的开放API。而且这款木马也不要求获得root权限,可以在没有root的手机上运行。这意味着,它并没有使用进程注入、钩子等高级技术来实施拦截和破坏。实现成本很低,相信大多数安卓程序员都能开发出来。
也许正因为短信木马的实现难度较低,又不要求设备root,同时还能获得巨大的商业利益,所以导致了短信木马的泛滥。这种形势下,木马的查杀率就显的很重要了。出于对免杀技术的好奇,笔者基于这款木马进行了进一步的研究和试验。
有些用户认为,“安装了安全软件,手机就安全了”。可实际上是不是这样呢?
我们都知道安全软件主要的功能有两个方面,静态扫描和动态监控。动态监控必须获得root权限才能生效,所以对于大多数没有root手机的用户来说。安全软件的动态监控起不了作用。这种情形下我们唯一能依赖的是静态扫描,也就查杀。查杀也分两种,一种是本地查杀,另一种是云查杀。
但两者原理是类似的,都是通过从被扫文件中抽取出特征,然后到特征库(病毒库)中去匹配,如果匹配上了,那么就认定为病毒。基于特征的病毒查杀具有快速、全面的优点,但同时它也有一些不足:
a)更新滞后性。病毒库更新之后才可查杀新型病毒。病毒库收集到特征之前,病毒和木马是完全肆虐横行的。
b)很难有效查杀未知变种。病毒或者木马的编写者,如果一旦确定了被查杀的特征,则可以通过技术手段变换特征,制造出变种病毒和木马,从而达到免杀的目的。
根据这些缺点,笔者做了一些试验并提出了以下若干免杀方案:
1)特征变换法
笔者基于手头上的一款短信木马源代码做试验,选用10款知名安全软件进行测试。
360卫士、安全管家、瑞星手机安全、乐安全、金山手机卫士、LBE安全大师、腾讯手机管家、网秦安全、McAfee Security、百度卫士。
首先将原版的木马源代码编译出apk来,然后安装到装有安全软件但并未root的手机,结果360卫士、安全管家、LBE安全大师、腾讯手机管家、网秦安全、百度卫士报毒了(如图4)。
图4 原版木马可以被查杀
然后笔者将源代码删除一半(不考虑其能否运行,只要能编译成功就行)再安装到手机,如此往复直到不再报毒为止。这样就可以确定最近一次删除的代码中含有病毒特征。接着再逐步添加代码,直到再次报毒,找到这个特征。通过这种类似二分查找的方式,可以将原版源代码中的所有特征都可以找出来。经过笔者的一番努力,最后发现这些特征在java代码里都是以字符串形式存在的。很显然我们只要将这些特征字符串变换一下就产生了新的变种,而且可以避开杀毒软件的查杀了。
变换的方式有很多,例如:
① StringBuilder动态生成特征字符串
② 特征字符串以密文形式存在,需要使用时再动态解密
③ 将特征字符串转移至资源中等等。
变换之后特征字符串以非明文的形式存在。这样杀毒公司在获取这个新变种的样本之前,杀毒软件很难对其进行查杀。但这种方式的免杀时间也不会太长,毕竟对于新变种再次抽取特征是非常方便的。
笔者按照这种方案测试完后(修改了特征字符串、包名、应用名),10款杀毒软件没有1款能查杀(如图5)。
图5 免杀处理之后,木马无法被查杀
2)代码加密法
杀毒软件抽取的特征不仅仅只是字符串,也有可能是调用方法,或者二进制特征。那么这种情况下,需要变换整个APK中的代码。安卓APK里的Java代码都是存放在classes.dex里的。因此如果将含有病毒特征的classes.dex已一种加密形式存在资源文件或者assets中,运行时再解密,那么杀毒软件在没有破解加密算法之前,是无法查杀该类的病毒木马的。其实该方案也可以理解成对APK进行加壳处理。比如木马经过App保护服务提供商的加壳处理后,就可以直接达到免杀目的。如果木马的编写者,技术足够好,那他可以开发出自己的加壳方案,那么对于杀毒软件来说,这将是更大的挑战。要查杀这类病毒更是难上加难。
笔者使用这种方案后,同样10款安全软件也都未能查杀。
3)动态下载法
以上的两种方式,无论怎么变换,病毒的代码其实还是在本地的,也就是在APK内部。如果病毒代码不在APK里呢,是不是就更难查杀了呢。其实这完全可以实现的。木马的编写者可以编写一个正常的APK,然后让这个应用在特殊的条件下触发并从网络下载恶意的代码然后再执行。这种的隐蔽性可以做到非常高,单纯扫描是几乎扫不出来的,因为事实上APK里就是没有恶意代码。
这种方案,效果也是一样,10款安全软件都不能查杀。
|
原版木马 |
特征变换法 |
代码加密法 |
动态下载法 |
360卫士 |
Yes |
No |
No |
No |
安全管家 |
Yes |
No |
No |
No |
瑞星手机安全 |
No |
No |
No |
No |
乐安全 |
No |
No |
No |
No |
金山手机卫士 |
No |
No |
No |
No |
LBE安全大师 |
Yes |
No |
No |
No |
腾讯手机管家 |
Yes |
No |
No |
No |
网秦安全 |
Yes |
No |
No |
No |
McAfee Security |
No |
No |
No |
No |
百度卫士 |
Yes |
No |
No |
No |
表1 原版木马与3种免杀方案查杀结果对比
表1总结了这三个方案的测试结果,Yes表示可以查杀,No表示不能查杀。可见这三种免杀方案都可以使木马躲过杀毒软件的查杀。从中我们可以看出,一个病毒或者木马的编写者,要绕开杀毒软件查杀并不是非常困难。因此,“安装了安全软件,手机就安全了”,这样的观念,其实并不是很科学。实际上安全软件查杀未知变种病毒木马的能力是非常有限的。
既然完全依靠杀毒软件不是很靠谱,那么普通手机用户该如何应对呢?
笔者觉得,首先要做是,每位手机用户都要提高自己的安全意识。不要轻易下载和安装来历不明的应用,即使是自己的朋友推荐的应用链接也不要轻易相信,有可能是朋友中了木马之后,木马应用发过来的。尽量只从正规大型市场或者应用的官方网站下载应用。另外也不要轻易打开来历不明的网页链接,挂马的网站也会对手机安全造成威胁。
其次,国外的一些安全公司已经开始研究如何抵御未知攻击的技术,这样就能解决短信木马通过变换特征绕开查杀的大部分问题,希望国内的安全公司迅速更上,填补这项国内空白。
最后,我们认为终极还是系统级安全解决方案。上文也提到安全软件主要通过静态扫描和动态监控来保障手机安全。既然静态扫描目前不是100%可以依赖,,动态监控一般是基于进程注入方式实现的,需要授予root权限问题是,root是把双刃剑,root手机之后虽然安全软件可以动态监控了,但病毒木马也存在获得root权限的可能了。一旦病毒木马获得root权限,那后果不堪设想。如果动态监控做到系统里可以直接赋予root权限而无需出厂后root手机,当然系统安全还可以做更强大的安全功能,比如芯片安全。去年工信部颁布的安全五级要求,其中一级就要求2013年11月1号后入网的手机本身必须要带有权限监控功能。有了这样的系统级安全解决方案,短信木马所做的敏感操作:发送短信、读写短信数据库等都会被拦截到,用户可以及时发现并禁止或卸载它,因此,在系统级安全解决方案前,短信木马根本不足为惧。不过缺陷是,工信部提出的标准里面并没有对接收短信做权限监控,木马可以在接收短信后通过网络把短信转发出去,从而绕开发送短信的权限监控。
另外,也建议司法部门加大执法力度,一旦发现到木马,可以追踪其控制端手机号,从而跟踪该SIM卡,锁定购买人,然后顺藤摸瓜找到犯罪嫌疑人和犯罪团伙。
短信木马虽然从安全技术角度来说,不是特别有技术含量,但他对用户的隐私以及财产安全造成的危害却不小。想要彻底根治短信木马仅仅是靠安全应用是远远不够的,更要靠全社会的共同协作和努力。用户需要自己提高安全意识,手机和芯片厂商要提供更好的系统安全方案,杀毒软件公司要为用户提供更好的杀毒服务,法制部门则应对犯罪行为进行更加严厉的打击。