it-swarm.com.de

Ist die PID eines untergeordneten Prozesses unter Linux immer größer als die PID seines übergeordneten Prozesses?

Nehmen wir an, ab Kernel 2.6.

Ich beobachte alle laufenden Prozesse auf dem System.

Ist die PID der Kinder immer größer als die PID ihrer Eltern?

Ist es möglich, Sonderfälle der "Inversion" zu haben?

23
Massimo

Nein, aus dem sehr einfachen Grund, dass die PID einen maximalen numerischen Wert haben kann. Wenn ein Prozess die höchste PID hat, kann kein Kind, das er gabelt, eine größere PID haben. Die Alternative, dem Kind eine niedrigere PID zu geben, wäre, die fork() insgesamt nicht zu bestehen, was nicht sehr produktiv wäre.

Die PIDs werden der Reihe nach zugewiesen, und nachdem die höchste verwendet wurde, verwendet das System die (freien) niedrigeren wieder, sodass Sie auch in anderen Fällen niedrigere PIDs für ein Kind erhalten können.

Die standardmäßige maximale PID auf meinem System (/proc/sys/kernel/pid_max) ist nur 32768, daher ist es nicht schwer, den Zustand zu erreichen, in dem der Wraparound stattfindet.

$ echo $$
27468
$ bash -c 'echo $$'
1296
$ bash -c 'echo $$'
1297

Wenn Ihr System PIDs zufällig ( wie OpenBSD zu tun scheint ) anstatt nacheinander (wie Linux) zuweisen würde, gäbe es zwei Optionen. Entweder wurde die zufällige Auswahl über den gesamten Bereich möglicher PIDs getroffen. In diesem Fall wäre es offensichtlich, dass die PID eines Kindes niedriger sein kann als die des Elternteils. Oder die PID des Kindes wird zufällig aus den Werten ausgewählt, die größer als die PID des Elternteils sind, wodurch sie im Durchschnitt auf halbem Weg zwischen der PID des Elternteils und dem Maximum liegt. Prozesse, die rekursiv gegabelt werden, würden dann schnell das Maximum erreichen und wir wären am gleichen Punkt wie oben erwähnt: Eine neue Gabel müsste eine niedrigere PID verwenden, um erfolgreich zu sein.

47
ilkkachu

Es besteht auch das Potenzial für Sicherheitslücken, wenn Kernel-Benachrichtigungen verwendet werden und Sie sich selbst dazu zwingen, die Erkennung durch einen Prozesstabellen-Scan zu vermeiden. Wenn dies richtig gemacht wird, hat Ihr Prozess eine niedrigere PID und Prozesswerkzeuge sehen den fraglichen Prozess nicht.

http://cve.circl.lu/cve/CVE-2018-1121

procps-ng, procps ist anfällig für einen Prozess, der sich durch Rassenbedingungen versteckt. Da proc_pid_readdir () des Kernels PID-Einträge in aufsteigender numerischer Reihenfolge zurückgibt, kann ein Prozess, der eine hohe PID belegt, mithilfe von inotify-Ereignissen bestimmen, wann die Prozessliste gescannt wird, und fork/exec, um eine niedrigere PID zu erhalten, wodurch eine Aufzählung vermieden wird. Ein nicht privilegierter Angreifer kann einen Prozess vor den Dienstprogrammen von procps-ng verbergen, indem er eine Race-Bedingung beim Lesen von/proc/PID-Einträgen ausnutzt. Diese Sicherheitsanfälligkeit betrifft procps und procps-ng bis Version 3.3.15, möglicherweise sind auch neuere Versionen betroffen.

8
thrig