网络安全 频道

从“窃听门”事件解读手机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内核首先要确保调用的参数在用户空间应用程序的虚拟地址空间范围之内。

  尽管当用户空间应用程序发出系统调用命令后(如,为确保应用程序不能恶意地涉及系统调用参数中的内核数据),这项检查工作相当重要,但它却会导致内核系统调用的失败。Get fs/set fs调用序列修改了数据段以便于检测系统能够成功调用参数,这就允许内核空间发出系统调用指令。Rootkit则会简单地打开GSM设备,并用适当的参数来定位写操作系统指令序列(例如AT命令),然后关闭该设备。在代码发出的AT命令激活了电话子系统.并成功建立起同攻击者电话之间的连接。然而,AT命令并没有启动智能手机中由声音子系统控制的麦克风。为了激活麦克风,我们使用usermodehelper函数并控制Rootkit发出如下的内核模式命令:

alsactl -f /usr/share/OpenMoko/scenarios/GSMhandset.staterestore

  该命令允许内核运行用户模式命令。

  以下是GSM Rootkit的部分Pseudocode代码:

1. char *atcommand1 = "AT command1";
2. char *atcommand2 = "AT command2";
3. ...
4. mm segment t saved fs = get fs();
5. set fs(KERNEL DS);
6. fd = sys open("/dev/ttySAC0", O RDWR | O NONBLOCK, 0);
7. sys write(fd, atcommand1, sizeof(atcommand1));
8. sys write(fd, atcommand2, sizeof(atcommand2));
9. ...
10. sys close(fd);
11. set fs(saved fs);
0
相关文章