【发布时间】:2014-08-04 04:19:48
【问题描述】:
我正在研究 Android 漏洞利用 Rage Against The Cage 的实现。其背后的想法是,它会为 shell UID 创建尽可能多的进程以到达 RLIMIT_NPROC,以便下次 Android 调试桥 (ADB) 守护进程尝试从 中删除其权限>root 到 shell,对 setuid() 的调用失败,它继续作为 root 执行(该错误已通过检查 @987654325 的结果修复@call,然后再继续)。
根据setrlimit()documentation,RLIMIT_NPROC定义为:
最大进程数(或者,更准确地说,在 Linux 上, 线程)可以创建 [emphasis mine] 调用过程。遇到此限制时,fork(2) 失败 错误EAGAIN。此限制不适用于 具有 CAP_SYS_ADMIN 或 CAP_SYS_RESOURCE 能力。
此外,这就是漏洞的实现方式:
/* generate many (zombie) shell-user processes so restarting
* adb's setuid() will fail.
* The whole thing is a bit racy, since when we kill adb
* there is one more process slot left which we need to
* fill before adb reaches setuid(). Thats why we fork-bomb
* in a seprate process.
*/
if (fork() == 0) { // 'true' for the child
close(pepe[0]);
for (;;) {
if ((p = fork()) == 0) {
exit(0); // child exits (???)
} 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;
}
}
}
因此,RLIMIT_NPROC 被定义为“可以创建的最大进程数”——创建,而不是“同时执行”——并且实现通过终止由第二个分叉创建的每个子进程来秒该定义.
首先,我无法理解如何限制每个 UID 创建的进程数量(我们必须不时重新启动机器才能重置该数量,不是吗?)。其次,即使是reverse engineered 漏洞利用的人,获得了与上面显示的实现等效的实现,对RLIMIT_NPROC 的定义也不同:
它[漏洞利用]利用了 RLIMIT_NPROC 最大值,这是一个定义 给定的 UID 可以运行多少个进程。
也就是说,RLIMIT_NPROC 实际上是如何工作的?哪个定义更准确?
【问题讨论】:
标签: android linux exploit setrlimit