Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RLIMIT_NPROC的正确定义是什么?_Android_Linux_Exploit_Setrlimit - Fatal编程技术网

Android RLIMIT_NPROC的正确定义是什么?

Android RLIMIT_NPROC的正确定义是什么?,android,linux,exploit,setrlimit,Android,Linux,Exploit,Setrlimit,我正在看一看Android攻击框架的实现。其背后的思想是,它创建尽可能多的进程,以到达shellUID的RLIMIT\u NPROC,以便下次Android调试桥(ADB)守护进程尝试将其权限从root删除到shell,调用setuid()失败,并继续作为root执行(在继续之前检查setuid()调用的结果已修复该错误) 根据setrlimit(),RLIMIT\u NPROC定义为: 最大进程数(或者,更准确地说,在Linux上, 线程),可以为 呼叫过程。遇到此限制时,fork(2)失败

我正在看一看Android攻击框架的实现。其背后的思想是,它创建尽可能多的进程,以到达shellUID的
RLIMIT\u NPROC
,以便下次Android调试桥(ADB)守护进程尝试将其权限从root删除到shell,调用
setuid()
失败,并继续作为root执行(在继续之前检查
setuid()
调用的结果已修复该错误)

根据
setrlimit()
RLIMIT\u NPROC
定义为:

最大进程数(或者,更准确地说,在Linux上, 线程),可以为 呼叫过程。遇到此限制时,fork(2)失败 有错误的伊根。此限制不适用于以下情况: 具有CAP_SYS_ADMIN或 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;
    }
  }
}
/*生成许多(僵尸)shell用户进程,以便重新启动
*adb的setuid()将失败。
*整件事有点疯狂,因为我们杀了亚行
*还剩下一个进程槽,我们需要
*在adb到达setuid()之前填充。这就是为什么我们用叉子叉炸弹
*在分离过程中。
*/
如果(fork()==0){/'true'用于子级
关闭(pepe[0]);
对于(;;){
如果((p=fork())==0){
出口(0);//子出口(???)
}如果出现其他情况(p<0){
如果(新的PID){
printf(“\n[+]分叉%d个孩子。\n”,pids);
新的PID=0;
编写(pepe[1],&c,1);
关闭(pepe[1]);
}
}否则{
++pids;
}
}
}
因此,
RLIMIT\u NPROC
被定义为“可以创建的最大进程数”——创建的,而不是“同时执行”——以及通过终止第二个fork创建的每个子进程来实现该定义的秒数

首先,我不明白限制每个UID创建的进程数量是如何起作用的(我们必须不时重新启动机器以重置该计数,不是吗?)。其次,即使是利用该漏洞的人,获得了与上面所示的实现等效的实现,也会对
RLIMIT\u NPROC
进行不同的定义:

它[利用]利用RLIMIT_NPROC max,这是一个定义 给定UID可以运行的进程数


也就是说,RLIMIT_NPROC实际上是如何工作的?哪个定义更精确?

限制实际上是当前进程的数量,而不是自系统启动以来创建的进程总数

利用漏洞代码如何工作的关键是僵尸进程。即使子进程调用了exit(),操作系统仍会保留这些进程,直到父进程放弃它们或调用wait()为止,它们都会一直计数到极限。在这种情况下,父对象不这样做,因此它们会一直挂起,直到父对象本身退出