Mas*_*imo 23 process linux-kernel
比方说,从内核 2.6 开始。
我观察系统上所有正在运行的进程。
孩子的PID总是大于父母的PID吗?
是否可能有“反转”的特殊情况?
ilk*_*chu 47
不,原因很简单,PID 可以有一个最大数值。如果一个进程有最高的 PID,它派生的子进程就不能有更大的 PID。给孩子一个较低的PID的替代方案是fork()
完全失败,这不会很有成效。
PID 是按顺序分配的,在使用最高的 PID 后,系统会重新使用(空闲的)较低的 PID,因此您也可以在其他情况下为孩子获得较低的 PID。
我的系统 ( /proc/sys/kernel/pid_max
)上的默认最大 PID仅为 32768,因此不难达到发生回绕的条件。
$ echo $$
27468
$ bash -c 'echo $$'
1296
$ bash -c 'echo $$'
1297
Run Code Online (Sandbox Code Playgroud)
如果您的系统随机分配 PID(就像 OpenBSD 那样)而不是连续分配(如 Linux),则有两种选择。要么在可能的 PID 的整个空间上进行随机选择,在这种情况下,很明显孩子的 PID 可能低于父母的。或者,孩子的 PID 将从大于父母的 PID 的值中随机选择,这将平均将其置于父母的 PID 和最大值之间的中间。然后递归分叉的进程会很快达到最大值,我们将处于上述同一点:新的分叉需要使用较低的 PID 才能成功。
还存在使用内核通知和分叉自己以避免被进程表扫描检测到的安全漏洞的可能性;如果做得好,这会导致您的流程具有较低的 PID,并且流程工具看不到相关流程。
http://cve.circl.lu/cve/CVE-2018-1121
procps-ng,procps 容易受到通过竞争条件隐藏的进程的影响。由于内核的proc_pid_readdir()是按照数字升序返回PID条目的,占用高PID的进程可以使用inotify事件来判断进程列表何时被扫描,fork/exec来获取较低的PID,从而避免枚举。非特权攻击者可以通过利用读取 /proc/PID 条目中的竞争条件来向 procps-ng 的实用程序隐藏进程。此漏洞会影响 procps 和 procps-ng 直到版本 3.3.15,新版本也可能会受到影响。