【问题标题】:What is the correct definition of RLIMIT_NPROC?RLIMIT_NPROC 的正确定义是什么?
【发布时间】:2014-08-04 04:19:48
【问题描述】:

我正在研究 Android 漏洞利用 Rage Against The Cage 的实现。其背后的想法是,它会为 shell UID 创建尽可能多的进程以到达 RLIMIT_NPROC,以便下次 Android 调试桥 (ADB) 守护进程尝试从 中删除其权限>rootshell,对 setuid() 的调用失败,它继续作为 root 执行(该错误已通过检查 @987654325 的结果修复@call,然后再继续)。

根据setrlimit()documentationRLIMIT_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


    【解决方案1】:

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

    利用代码如何工作的关键是僵尸进程。即使子进程调用了 exit(),它们仍然被操作系统保留并计入限制,直到父进程放弃它们或调用 wait()。在这种情况下,父级不会这样做,因此它们会一直徘徊,直到父级本身退出。

    【讨论】:

      猜你喜欢
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 2016-01-05
      相关资源
      最近更新 更多