Всегда ли PID дочернего процесса больше, чем PID его родителя в Linux?

22

Допустим, начиная с ядра 2.6.

Я наблюдаю за всеми запущенными процессами в системе.

Всегда ли PID детей больше, чем PID их родителей?

Возможно ли иметь особые случаи «инверсии»?

Massimo
источник

Ответы:

47

Нет, по той простой причине, что существует максимальное числовое значение, которое может иметь PID. Если у процесса самый высокий PID, ни у какого дочернего процесса он не может быть с большим PID. Альтернативой тому, чтобы дать ребенку более низкий PID, было бы полное неудача fork(), что не было бы очень продуктивным.

PID распределяются по порядку, и после использования старшего из них система переходит к повторному использованию (бесплатных) младших, так что вы можете получить более низкие PID для ребенка и в других случаях.

Максимальный PID по умолчанию в моей системе ( /proc/sys/kernel/pid_max) - всего 32768, поэтому нетрудно достичь условия, когда происходит обход.

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

Если бы ваша система выделяла PID случайным образом ( как это делает OpenBSD ), а не последовательно (например, в Linux), было бы два варианта. Либо случайный выбор был сделан по всему пространству возможных PID, и в этом случае было бы очевидно, что PID ребенка может быть ниже, чем родительский. Или PID ребенка будет выбран случайным образом из значений, превышающих PID родителя, что в среднем поместит его на полпути между PID родителя и максимумом. Процессы рекурсивного разветвления затем быстро достигнут максимума, и мы окажемся в той же точке, что и упомянутая выше: новый форк должен будет использовать более низкий PID для успеха.

ilkkachu
источник
3
FWIW, существуют системы, в которых PID распределяются случайным образом (по умолчанию, например, в OpenBSD), и я уверен, что я видел похожую схему распределения PID в Linux (или, по крайней мере, одну из предложенных).
Кусалананда
@Kusalananda, да, я думаю, что об этом был вопрос и в unix.SE. У меня нет времени, чтобы выкопать его, но, насколько я помню, патч для Linux, который делал случайный выбор PID, был старым и был заброшен как ненужный. Это не имеет значения: пока есть (относительно низкий) максимальный PID, после его использования можно либо выбрать более низкий PID, либо сбросить ошибку на форк.
ilkkachu
unix.stackexchange.com/questions/206096/… и unix.stackexchange.com/questions/401327/… для начинающих
Джефф Шаллер
2
@Massimo, аспект безопасности обсуждается в этом вопросе о security.se: приносят ли рандомизированные PID большую безопасность?
ilkkachu
1
@RonJohn, ну, я не знаю, какие ценности ставят там другие Linux, но его можно изменить, вы можете установить его примерно на 4 миллиона (4194304 или 2 ^ 22) в 64-битных системах. (это число, а не количество байтов)
ilkkachu
8

Также существует вероятность уязвимостей в безопасности с помощью уведомлений ядра и разветвления, чтобы избежать обнаружения при сканировании таблицы процессов; если все сделано правильно, ваш процесс будет иметь более низкий PID, а инструменты процесса не увидят этот процесс.

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

procps-ng, procps уязвим для процесса, скрывающегося в состоянии гонки. Так как ядро ​​proc_pid_readdir () возвращает записи PID в возрастающем числовом порядке, процесс, занимающий высокий PID, может использовать события inotify, чтобы определить, когда сканируется список процессов, и fork / exec, чтобы получить более низкий PID, таким образом избегая перечисления. Непривилегированный злоумышленник может скрыть процесс от утилит procps-ng, используя условие гонки при чтении записей / proc / PID. Эта уязвимость затрагивает procps и procps-ng до версии 3.3.15, также могут быть затронуты более новые версии.

thrig
источник