CVE-2011-1149 (KillingInTheNameOf)
这个漏洞是2011年发现的。利用它能让ADB获取root权限。这个漏洞存在于Android<=2.2。
从adb的源码中,可以看到db的权限由属性ro.secure
来控制。
property_get("ro.secure", value, "1");
if (strcmp(value, "1") == 0) {
// don't run as root if ro.secure is set...
要让adb获得系统权限,就要将ro.secure
设置为0。
adb运行时,ro.secure
的值已经被写入到adb进程虚拟地址空间中。而低版本的Android系统并没有对进程地址空间中的ro.secure
内容做读写限制。
我们可通过linux的/proc/self/maps
来查看进程的虚拟地址空间是如何使用的。而ro.secure
的值被存储在进程地址空间的system_properties
区域。只要找到这个区域,将ro.secure
的值改为0,adb就能运行在root权限。
所以,这个漏洞的Vulnerability(描述)为:
Vulnerability: Android 2.3之前的版本,没有限制system property space(系统属性空间)的访问。
Exploit(利用这个漏洞的描述)为:
Exploit: (1) 通过linux的/proc/self/maps
来查看进程的虚拟地址空间是如何使用的。找到这个区域system_properties
,将ro.secure
的值改为0。(2) 重启adb。(3) adb运行在了root权限。
这个exploit
名称为KillingInTheNameOf
。可以从参考3中找到如何利用这个漏洞的源代码。这个漏洞是Android匿名共享内存ashmem机制的处理缺陷导致的。
参考
- (1) p21. http://www.slideshare.net/scovetta/android-attacks
- (2) CVE-2011-1149. http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2011-1149
- (3) KillingInTheNameOf. http://c-skills.blogspot.com/2011/01/adb-trickery-again.html