Bir alt sürecin PID'i her zaman, Linux'taki ebeveyninin PID'sinden daha mı büyük?


22

Diyelim, çekirdekten 2.6 itibaren.

Sistemde çalışan tüm işlemleri izliyorum.

Çocukların PID'i daima ebeveynlerinin PID'lerinden daha mı büyük?

Özel "inversiyon" durumlarına sahip olmak mümkün müdür?

Yanıtlar:


47

Hayır, çok basit bir nedenden dolayı PID'nin sahip olabileceği maksimum sayısal değer var. Bir işlem en yüksek PID'ye sahipse, çatallardan hiçbir çocuk daha büyük bir PID'ye sahip olamaz. Çocuğa daha düşük bir PID vermenin alternatifi;fork() tamamen , ki bu da çok verimli olmazdı.

PID'ler sırayla tahsis edilir ve en yüksek olanı kullandıktan sonra, sistem (ücretsiz) düşük olanları tekrar kullanmak üzere etrafa sarılır, böylece başka durumlarda bir çocuk için daha düşük PID'ler alabilirsiniz.

Sistemimdeki ( /proc/sys/kernel/pid_max) varsayılan maksimum PID ( 32768) olduğundan, paketlemenin gerçekleştiği duruma ulaşmak zor değil.

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

Sisteminiz PID'leri art arda (Linux gibi) yerine rasgele ( OpenBSD gibi görünüyor ) tahsis etse iki seçenek olacaktır. Her iki rastgele seçim olası PID'lerin tüm alanı boyunca yapıldı, bu durumda bir çocuğun PID'sinin ebeveyninkinden daha düşük olabileceği açıktı. Veya, çocuğun PID'si, ebeveynin PID'sinden daha büyük değerlerden rasgele seçilecektir; bu, ortalama olarak ebeveynin PID'i ile maksimumunun arasına koyar. Ardışık olarak çakma işlemleri hızlı bir şekilde maksimuma ulaşır ve yukarıda belirtilenle aynı noktada oluruz: başarılı olmak için yeni bir çatalın daha düşük bir PID kullanması gerekir.


3
FWIW, PID'lerin rastgele tahsis edildiği sistemler var (varsayılan olarak örneğin OpenBSD'de) ve Linux'ta da benzer bir PID tahsisat şeması gördüğümden eminim (veya en azından önerilen bir tane gördüm).
Kusalananda

@Kusalananda, evet, unix.SE'de de bununla ilgili bir soru olduğunu düşünüyorum. Kazmak için zamanım yok, ama hatırladığım kadarıyla, rastgele PID seçimi yapan Linux için yama eskidi ve gereksiz olarak terk edildi. Yine de önemli değil: (nispeten düşük) bir maksimum PID olduğu sürece, bir kez kullanıldıklarında seçimler daha düşük bir PID vermek ya da çatalı bir hata bırakmak demektir.
ilkkachu


2
@Massimo, güvenlik yönü güvenlik sorusu üzerinde security.se üzerinde tartışılmıştır: Randomize PID'ler daha fazla güvenlik getiriyor mu?
ilkkachu

1
@RonJohn, diğer Linux'ların orada koydukları değerlere sahip değilim, ama değiştirilebilir, 64-bit sistemlerde yaklaşık 4 milyon (4194304 veya 2 ^ 22) olarak ayarlayabilirsiniz. (sayı, bayt miktarı değil)
ilkkachu

8

Ayrıca, çekirdek bildirimlerini kullanarak ve bir işlem tablosu taraması tarafından algılanmasını önlemek için kendinizi belirten güvenlik açıkları potansiyeli vardır; Bu doğru yapılırsa işleminizde PID'nin düşük olması ve söz konusu süreci görmeyen işlem araçlarının kullanılması ile sonuçlanır.

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

ilerletilir, ilerletilir, yarış koşullarında saklanan bir sürece karşı savunmasızdır. Çekirdeğin proc_pid_readdir () artan sayısal sırayla PID girişlerini döndürdüğünden, yüksek bir PID'yi içeren bir işlem, işlem listesinin ne zaman tarandığını belirlemek için inotify olaylarını ve daha düşük bir PID elde etmek için çatal / exec'i kullanabilir, böylece sayımdan kaçınır. Ayrıcalıklı olmayan bir saldırgan okuma / proc / PID girişlerinde bir yarış koşulunu kullanarak, işlemlerin faydalarından bir işlemi gizleyebilir. Bu güvenlik açığı aksesuarı etkiler ve 3.3.15 sürümüne kadar olan ilerlemeleri, daha yeni sürümler de etkilenebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.