Answers:
不可以,因为非常简单的原因,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
如果您的系统是随机分配PID(而不是像OpenBSD那样),而不是连续分配(例如Linux),则有两种选择。要么在可能的PID的整个空间上进行随机选择,在这种情况下,很明显,孩子的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版,较新的版本也可能会受到影响。