我要看一下android对cage的攻击狂怒的实现。其背后的思想是,它创建尽可能多的进程来访问shell uid,以便下次android debug bridge(adb)守护进程尝试将其权限从根目录下放到shell上时,对RLIMIT_NPROC
的调用失败,并以根用户身份继续执行(该错误已通过在继续之前检查setuid()
调用的结果得到修复)。
根据setuid()
documentation,setrlimit()
定义为:
最大的进程数(或者更确切地说,在Linux上)
线程)可以为
调用进程。遇到此限制时,fork(2)失败
因为伊根的错误。此限制不适用于
具有CAP系统管理或
系统资源能力。
此外,利用漏洞的实施方式如下:
/* 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创建的进程的数量(我们需要不时地重新启动机器来重置这个计数,不是吗?)第二,即使是那些利用漏洞获得与上面所示相同的实现的人,也会以不同的方式定义
RLIMIT_NPROC
:它利用了rlimit_nproc max,这是一个定义
给定的uid可以运行多少个进程。
也就是说,rlimit是如何工作的?哪个定义更精确?
最佳答案
限制实际上是当前进程的数量,而不是系统启动后创建的进程总数。
攻击代码如何工作的关键是僵尸进程。尽管子进程调用了EXIT(),但它们仍然由操作系统保持,并且在父进程放弃或调用WAITE()之前计数到限制。在这种情况下,父进程不这样做,所以它们挂起,直到父本身退出。
关于android - RLIMIT_NPROC的正确定义是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24208153/