我要看一下android对cage的攻击狂怒的实现。其背后的思想是,它创建尽可能多的进程来访问shell uid,以便下次android debug bridge(adb)守护进程尝试将其权限从根目录下放到shell上时,对RLIMIT_NPROC的调用失败,并以根用户身份继续执行(该错误已通过在继续之前检查setuid()调用的结果得到修复)。
根据setuid()documentationsetrlimit()定义为:
最大的进程数(或者更确切地说,在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/

10-09 08:42
查看更多