Odpowiedzi:
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
procps-ng, procps jest podatny na proces ukryty w warunkach rasowych. Ponieważ proc_pid_readdir () jądra zwraca wpisy PID w rosnącej kolejności numerycznej, proces zajmujący wysoki PID może wykorzystywać zdarzenia inotify w celu ustalenia, kiedy skanowana jest lista procesów, i rozwidlać / exec, aby uzyskać niższy PID, unikając w ten sposób wyliczenia. Nieuprzywilejowany atakujący może ukryć proces przed narzędziami procps-ng, wykorzystując warunek wyścigu podczas odczytywania wpisów / proc / PID. Luka ta dotyczy procps i procps-ng do wersji 3.3.15, może to również dotyczyć nowszych wersji.