web-dev-qa-db-fra.com

Le PID d'un processus enfant est-il toujours supérieur au PID de son parent sous Linux?

Disons, à partir du noyau 2.6.

Je regarde tous les processus en cours d'exécution sur le système.

Le PID des enfants est-il toujours supérieur au PID de leurs parents?

Est-il possible d'avoir des cas particuliers "d'inversion"?

23
Massimo

Non, pour la raison très simple qu'il existe une valeur numérique maximale que le PID peut avoir. Si un processus a le PID le plus élevé, aucun enfant qu'il forche ne peut avoir un PID supérieur. L'alternative à donner à l'enfant un PID inférieur serait d'échouer complètement la fork(), ce qui ne serait pas très productif.

Les PID sont alloués dans l'ordre, et une fois le plus élevé utilisé, le système se contente de réutiliser les PID inférieurs (gratuits), de sorte que vous pouvez également obtenir des PID inférieurs pour un enfant dans d'autres cas.

Le PID maximum par défaut sur mon système (/proc/sys/kernel/pid_max) n'est que de 32 768, il n'est donc pas difficile d'atteindre la condition où le bouclage se produit.

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

Si votre système devait allouer des PID de manière aléatoire ( comme OpenBSD semble le faire ) au lieu de consécutivement (comme Linux), il y aurait deux options. Soit le choix aléatoire a été fait sur tout l'espace des PID possibles, auquel cas il serait évident que le PID d'un enfant peut être inférieur à celui du parent. Ou, le PID de l'enfant serait choisi au hasard parmi les valeurs supérieures au PID du parent, ce qui le mettrait en moyenne à mi-chemin entre le PID du parent et le maximum. Les processus bifurquant récursivement atteindraient alors rapidement le maximum et nous serions au même point que mentionné ci-dessus: un nouveau fork devrait utiliser un PID inférieur pour réussir.

47
ilkkachu

Il existe également un potentiel de vulnérabilités de sécurité en utilisant les notifications du noyau et en vous forçant à éviter la détection par une analyse de la table des processus; si cela est fait correctement, votre processus aura un PID inférieur et les outils de processus ne verront pas le processus en question.

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

procps-ng, procps est vulnérable à un processus se cachant par condition de concurrence. Étant donné que proc_pid_readdir () du noyau renvoie les entrées PID dans un ordre numérique croissant, un processus occupant un PID élevé peut utiliser des événements inotify pour déterminer quand la liste de processus est analysée, et fork/exec pour obtenir un PID inférieur, évitant ainsi l'énumération. Un attaquant non privilégié peut masquer un processus aux utilitaires de procps-ng en exploitant une condition de concurrence critique dans la lecture des entrées/proc/PID. Cette vulnérabilité affecte procps et procps-ng jusqu'à la version 3.3.15, les versions plus récentes peuvent également être affectées.

8
thrig