从“窃听门”事件解读手机Rootkit攻击
在今年五月讲述了手机流氓软件危害与防治(http://chenguang.blog.51cto.com/350944/557191)文章后,收到了网友的广泛关注,此文为揭示手机后门的又一力作。
最近《世界新闻报》因深陷“窃听门”而被迫关闭,一幕幕窃听丑闻被公之于众,并引一系列不良连锁反应,各国政界名流、影视明星等纷纷自危。所谓“窃听门”就是雇佣私人侦探、用窃听电话的非法手段获取内幕新闻。现在公众们质疑手机安全的呼声越来越大。无独有偶的是苹果手机利用后台隐蔽程序后台收集数据 用户行踪轻易易被泄露, Alasdair Allan和Pete Warden两名程序员发现,其操作系统里有个Consolidated.db是一个缓存文件,其中保存了用户行踪的信息,而且在处理这些数据时,苹果也并未采用任何加密措施,也就是说能轻易被其他人截获。
实际上这种潜伏在手机中的卧底软件我们叫它Rootkit,它是最早来源于计算机系统。在1994年2月的一篇安全咨询报告中首先使用了Rootkit这个名词。这种程序的出现立刻引起计算机安全人员的注意,无论是做恶意行为的攻击者,还是进行安全监视的维护人员,这种能够“隐身”运行的程序都是一个非常好的解决办法。由于Rootkit使用了多种复合技术,使其不被传统安全软件检测出,相比于桌面操作系统平台,移动手机平台上的安全软件严重匮乏,加上垃圾短信和浏览有安全隐患的网站致使手机会频繁“中招”, 对监听者而言现在的智能手机是极佳的目标。它既能打电话又能访问互联网络。这样恶意软件编写者就更加注视对智能手机的攻击,也正是由于Rootkit程序可以成功地将自己隐藏于系统之中,为此,它必须与运行的操作系统紧密相连,利用一些十分底层的核心技术来实现“隐身”。利用这些技术的时候,往往需要程序运行时具有系统最高权限,这样Rootkit程序就具有了最高权限。
一、Rootkit的危害
对于任何的手机病毒程序来说,它首先需要成功地将自己存储在被感染的手机存储器上,也就是手机自带的内存或者存储卡。如果被感染的目标手机系统上安装有杀毒软件或者安全软件,这些软件往往会带有对手机文件系统监视的功能。当手机上的存储器中的文件数目发生变化的时候,这些软件就会马上发现这种变化,进和VJ自己到被感染手机的存储器上时,杀毒软件或者安全软件发现此时的手机文件系统正在创建一个新的文件,它们就会马上启动扫描程序,扫描程序开始检查这个新的文件是不是一个病毒程序,如果是,那么病毒刚刚复制完毕自己到手机上时,它就会被杀毒软件或者安全软件删除了,根本不可能得到运行的机会。
然而,杀毒软件以及安全软件的这种文件系统监视功能,在一般情况下,会存在一个时间差。手机系统公布出来的一些系统函数或者方法由于一定的经济利益以及安全限制,并没有将系统底层的核心技术公布出来,当杀毒软件以及安全软件的开发者采用这些“不完整”的系统函数或者方法开发软件的时候,这些被开发出来的功能很可能就不够反应迅速,存在一定的弊端。例如对于Symbian系统使用的一些文件系统监视方法,它就会有一定的延迟。
并且对于杀毒软件以及安全软件来说,病毒的种类千差万别,不可能对每一种新出现的病毒程序都有特征记录,于是病毒程序还是能够成功创建自己到目标手机的存储器上。到了这一步,一般的病毒程序就开始运行自己,然后进行工作。但是,对Rootkit程序来说,它的情况就与众不同了。Rootkit程序最核心的目的就是在于能够利用手机系统的底层技术,来达到一些“高级”的目的。这其中,隐藏自己的存在就是一个高级目的。
很多时候,手机的使用者会检查自己的手机状态,例如他会看看自己的手机究竞存放了哪些文件,如果没用或者没见过,他就会删除这些他认为是“垃圾”的文件。而对于杀毒软件以及安全软件来说,它们很可能会进行定期扫描,例如在每天的12点对手机内存上的所有文件进行一次扫描,目的是发现可能存在的病毒程序。这些情况往往会导致一些病毒程序会被发现,不能够继续工作。那么,如果一个病毒程序采用了某种技术,将自己从手机上的文件系统上“隐藏”起来,让手机使用者以及手机杀毒软件乎全软件都无法发现自己,那么病毒程序就可以为所欲为的进行破坏与感染了。Rootkit就是这样一种可怕的病毒程序。
在设计手机系统时,很可能也采用了一些未公开的方法来实现一些特殊目的,通常这些方法都是极其保密的。但是,对于手机病毒的制造者来说,他们会深入分析手机系统的内部实现原理,从而找出这些未公开的方法。这些未公开的方法中很可能就涉及到文件系统的一些底层技术。Rootkit将这些文件系统的底层技术利用起来,让自己从系统中“消失”,甚至会迷惑了手机系统本身。
二、现代智能手机攻击案例分析
攻击1:通过GSM监视通话信息
本次攻击的目标是让远程攻击者隐蔽地监听或记录用感染Rootkit的智能手机进行通话的隐私数据。无论何时只要发生Rootkit感兴趣的事件,Rootkit就会激活。例如,当受害者智能手机的日历程序显示备注时(如会议),Rootkit可能就会激发恶意操作。当Rootkit激活时,它会悄悄地拨打攻击者的电话(这个可预先在Rootkit程序中设置,或者通过攻击者发送的短信发送给Rootkit程序),这样攻击者就可以远程监听或记录当前通话信息。另外,当受害者拨打电话时,Rootkit也会激活,从而记录通话信息。Freerunner手机配有通过串行总线连接的GSM收音机,因此其可作为串行设备用于应用程序。在正常的手机操作中,用户空间应用程序将请求访问GSM设备的系统调用发送给系统内核。内核响应该请求,反过来应用程序也能够访问该设备提供的通讯功能。GSM设备使用一系列AT (attention)命令.其使得内核和用户空间应用程序调用特定的GSM 功能。例如,GSM设备通常支持AT命令拨打电话、获取SMS消息等功能。为了恶意操作GSM设备(例如,给远程攻击者打电话).Rootkit程序必须从内核执行AT命令。Rootkit程序原型是通过拦截用户设置的警报来运行。如图1显示,警报可与用户空间日历程序中的关键字“会议相关联。一旦检测到会议 关键字.则警报激活,Rootkit就会拦截此警报并进行恶意攻击。攻击程序则悄悄地拨打远程攻击者电话,这样攻击者就能窥探或记录受害者的秘密通信信息。Rootkit拨打的电话号码可能通过程序写入Rootkit代码,也可能通过短信发送,Rootkit截取该短信并获取攻击者号码(在攻击2描述了基于短信的Rootkit控制)。
图2 GSM Rootkit拦截报警信号,如会议通知,并向攻击者发送信息以监听通话隐私Rootkit触发。Rootkit必须有能力拦截报警信号(如来自日历程序的警报)才能触Rootkit。Rootkit程序通过hook系统调用表和用Rootkit恶意写操作地址替换真实写操作系统调用地址来达到此目的。当报警信号发出时,屏幕上将显示具体的消息。Rootkit程序中恶意写操作拦截显示在屏幕上的消息,并检查三个子字符串。首先检查消息中的“window Prop子字符串,该字符串显示当前消息为通知类型。然后,检查是否存在 Clock“子字符串该字符串用来验证消息是否来自时钟程序(更多字符串用于检查其它用户空间程序的警报)。最后,必须出现NETWM TYPE子字符串,此字符串出现代表产生了报警信号。通过研究未感染内核中的警报发送给方式,研究人员了解到这些字符串的重要意义。
拨打电话,当Rootkit激活时.其会模拟用户空间通信应用程序拨打电话。特别是像Qtopia软件这样的用户空间,应用程序会向内核发送一系列系统调用,该软件栈与Freerunner手机的OpenMoko Linux分发版一起发送。这些系统调用启动GSM设备,并指示其拨打指定号码。具体来说,像Qtopia这样的应用程序利用写操作系统调用给GSM设备发送AT命令(这些命令为参数),所要拨打的电话也可作为系统调用参数。Rootkit程序通过发送与内核AT命令相同的序列来达到同样的目的。
通过研究Qtopia软件栈.我们获得了必须用来拨打电话的AT调用序列。当拨打电话时 我们使用strace方法跟踪Qtopia发送的写操作系统调用的参数。然后,我们设计了一个激活后,能发送与内核空间AT命令相同序列的Rootkit程序。为了发出与AT调用相同的序列,Rootkit首先使用下代码所示的get fs/set fs调用序列,并修改数据段边界来指向内核寻址空间而不是指向用户寻址空间。get fs/set fs序列允许内核从内核模式中发出系统调用(如代码所示的sysopen sys write and sys close调用)。当发出系统调用后,Linux内核首先要确保调用的参数在用户空间应用程序的虚拟地址空间范围之内。
本文转自 李晨光 51CTO博客,原文链接:http://blog.51cto.com/chenguang/673420,如需转载请自行联系原作者