Powiedzmy, że od jądra 2.6.
Obserwuję wszystkie uruchomione procesy w systemie.
Czy PID dzieci jest zawsze większy niż PID rodziców?
Czy możliwe są specjalne przypadki „inwersji”?
źródło
Powiedzmy, że od jądra 2.6.
Obserwuję wszystkie uruchomione procesy w systemie.
Czy PID dzieci jest zawsze większy niż PID rodziców?
Czy możliwe są specjalne przypadki „inwersji”?
Nie, z bardzo prostego powodu, że istnieje maksymalna wartość liczbowa, jaką może mieć PID. Jeśli proces ma najwyższy PID, żadne dziecko podrzędne nie może mieć większego PID. Alternatywą dla zapewnienia dziecku niższego PID byłoby fork()
całkowite niepowodzenie , co nie byłoby zbyt produktywne.
Identyfikatory PID są przydzielane w kolejności, a po użyciu najwyższego, system owija się w celu ponownego wykorzystania (bezpłatnych) niższych, dzięki czemu można uzyskać niższe PID dla dziecka również w innych przypadkach.
Domyślny maksymalny PID w moim systemie ( /proc/sys/kernel/pid_max
) to tylko 32768, więc nie jest trudno osiągnąć warunek, w którym następuje obejście.
$ echo $$
27468
$ bash -c 'echo $$'
1296
$ bash -c 'echo $$'
1297
Gdyby twój system przydzielał PID losowo ( jak wydaje się to robić OpenBSD ) zamiast kolejno (jak Linux), byłyby dwie opcje. Albo losowy wybór został dokonany na całej przestrzeni możliwych PID, w którym to przypadku byłoby oczywiste, że PID dziecka może być niższy niż rodzic. Lub też PID dziecka byłby wybierany losowo z wartości większych niż PID rodzica, co średnio umieszczałoby go w połowie między PID rodzica a maksimum. Procesy rozwidlania rekurencyjnie szybko osiągnęłyby maksimum i bylibyśmy w tym samym punkcie, co wspomniano powyżej: nowy widelec musiałby użyć niższego PID, aby odnieść sukces.
Istnieje również możliwość wystąpienia luk w zabezpieczeniach przy użyciu powiadomień jądra i rozwidlania się, aby uniknąć wykrycia przez skanowanie tabeli procesów; jeśli zostanie to właściwie wykonane, proces ma niższy PID, a narzędzia procesu nie widzą danego procesu.
http://cve.circl.lu/cve/CVE-2018-1121
źródło