EverMars

Member of GoSSIP & Member of 0ops

[Paper Reading Notes]Bittersweet ADB: Attacks and Defenses

本篇文章发表在今年的ASIACCS上,作者均来自韩国科学技术院,介绍了如何在Android平台的恶意软件如何上利用ADB完成多种越权攻击,文章内容偏向于实用性,理论内容很少,这也符合我对韩国安全研究人员的一贯印象。

0x00

简单的来说,这篇文章就是教你如何在一个Android应用程序中使用ADB来进行各种越权的行为,比如在不申请权限的情况下监控短信、电话记录等隐私信息;监控/模拟屏幕点击事件;访问其他应用程序私有目录;对Android设备进行DoS攻击。
在我们介绍这些ADB黑科技之前,我们先探究一下这种安全隐患出现的原因。之所以恶意程序能够通过ADB进行如此之多的越权行为,本质原因在于通过adb shell执行的系统命令拥有shell UID(2000)的权限。在Android中,Google开发了大量的native程序来提供不同的系统功能,这些native程序一般放在/system/bin目录下,正常的app UID是无法调用这些程序的,而shell UID却可以。虽然这些native程序中有一些进行了额外的权限检查,如mount、remount这种直接操作文件系统的命令。但是仍然有一些漏网之鱼存在,这些程序在提供敏感的功能时,并没有进行第二次严格的身份识别和权限检查,导致了获取了shell UID的应用可以通过调用这些native程序来实现本身app UID没有权限实现的功能。
基于这样的情况,只要一个Android应用程序能够在程序内获取到shell UID,这就意味这该应用程序能够在不申请相关权限的情况下实现越权行为。在Android 4.2.2之前的版本中,应用程序可以通过adb connect localhost:port 指令来连接到本地的adbd服务, 之后使用adb shell命令就能将自己的app UID提权为shell UID,实现这个操作的前提仅仅是Android设备打开了USB调试功能。在4.2.2之后的版本中,Google为adb加入了RSA指纹认证,每一个试图连接adbd服务的adb客户端,都需要通过用户的确认(就是第一次把Android设备连接到电脑时,Android设备上弹出的RSA指纹认证框),确认之后会将客户端的RSA指纹写入/data/misc/adb/adb_keys文件,之后就能够正常通过客户端访问Android设备上的adbd服务,即可以使用adb shell进行连接。虽然4.2.2对adb进行了安全增强,但是Google并没有教育用户shell UID的有多么危险,大部分用户在手机上弹出RSA指纹认证提示的时候并不了解接受会给自己的设备带来怎样的风险。更不用说现实生活中有很多情况用户会将自己的Android设备通过USB连接到未知设备上,即使在设备没有被root的情况下,这样的行为也存在相当大的风险。

0x01

讨论清楚了adb攻击的所需的前提和带来的风险后,我们回到这篇论文,来看看通过adb究竟能够实现哪些越权行为。以下的攻击均通过能够获取shell UID的Android应用程序(只需要申请INTERNET权限),或是能adb连接到Android设备的PC来实现。

dumpsys

adb shell dumpsys
dumpsys提供了大量和Android设备当前状态有关的信息,比较有价值的是下拉框提示(短信通知、未接来电通知等)。

pic1

上图是一份dumpsys的内容,可以看到最下面是一条接收到的短信提醒,内容是”hello world!!*“。正常程序要读取短信需要有READ_SMS的权限。

dumpstate

adb shell dumpstate
dumpstate的功能和dumpsys类似,内容上有区别,不过都是和系统有关的信息。在dumpstate出的内容中可以找到ICCID、电话号码、IMSI等需要申请READ_PHONE_STATE权限才能读取到的信息:

pic2

run-as

adb shell run-as
run-as本身是用于Android应用程序调试的接口,在拥有shell UID的情况下,run-as可以将UID切换为任意允许debug的程序,是否允许debug可以通过AndroidManifest.xml里的android:debuggable键值进行声明。下图中我们可以看到我们的shell成功的从shell UID切换为了对应的app UID,此时就能够访问该app的私有目录。一般来说对私有目录的访问需要获取root权限。

pic3

对于开发者来说,在发布app时切记发布release版本来避免上述问题。

input

adb shell input
input指令可以用来做两件事,一个是开启一些设备的工程菜单,工程菜单一般会提供一些比较强力的功能,例如dump3G/4G流量。另一个就是模拟用户对屏幕的点击事件或是按键操作,例如input keyevent 3可以实现Home键的触发。基于第二个功能,可以实现很多需要点击屏幕的攻击,例如恶意应用可以首先通过am start命令打开系统发送短信的activity,配合一些参数填写好恶意的信息(如订阅服务,购买增值产品等),最后使用input进行屏幕点击,实现恶意信息的发送。

getevent

adb shell getevent
getevent返回了当前系统中发生的各类事件,比如对屏幕的点击。

pic4

通过对keylog的解析,可以还原出用户对屏幕的点击操作。

pm

adb shell pm
pm是大家比较熟悉的命令了,通过该命令可以实现对设备中包的管理,最简单的就是app的安装和卸载。

wz

adb shell wz
wz命令可以用来更改屏幕大小,以此来实现类似DoS的效果。值得注意的是更改屏幕大小后,重启也无法恢复正常,除非再次通过wz重新设定屏幕大小。通过下图可以看到,这个屏幕几乎没法使用了,UI已经崩溃。

pic5

0x02

除了上述的功能,论文还引用了一些之前的工作,例如Xiaofeng Wang之前做过的使用adb进行截屏,配合对用户操作的分析,从而窃取用户密码的攻击。
论文余下的部分介绍了作者开发的针对adb攻击的检测工具,包括了静态分析和动态taint分析。这也是一般安全问题的老套路了,“发现问题&解决问题”能够让文章看起来更加完整。
总的来说本文传达了一种想法,就是adb所拥有的权限远远超过普通用户的认知,大家可以提醒身边的朋友,尽量避免手机连接陌生设备。

Comments