PID ของกระบวนการลูกนั้นใหญ่กว่า PID ของพาเรนต์บน Linux เสมอหรือไม่?


22

สมมุติว่าจากเคอร์เนล 2.6 เป็นต้นไป

ฉันดูกระบวนการทำงานทั้งหมดในระบบ

PID ของเด็ก ๆ นั้นดีกว่า PID ของผู้ปกครองหรือไม่?

เป็นไปได้หรือไม่ที่จะมีกรณีพิเศษของ "การผกผัน"?

คำตอบ:


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 ที่ต่ำกว่าเพื่อให้ประสบความสำเร็จ


3
FWIW มีระบบที่มีการจัดสรร PID แบบสุ่ม (โดยค่าเริ่มต้นบน OpenBSD เป็นต้น) และฉันแน่ใจว่าฉันเคยเห็นรูปแบบการจัดสรร PID ที่คล้ายกันบน Linux เช่นกัน (หรืออย่างน้อยก็เห็นข้อเสนอแนะหนึ่งข้อ)
Kusalananda

@ Kusalananda ใช่ฉันคิดว่ามีคำถามเกี่ยวกับเรื่องนี้ในยูนิกซ์เช่นกัน ฉันไม่มีเวลาที่จะขุดมัน แต่เท่าที่ฉันจำได้ว่าแพทช์สำหรับ Linux ที่เลือก PID แบบสุ่มนั้นเก่าและถูกทอดทิ้งตามที่ไม่จำเป็น มันไม่สำคัญว่า: ตราบใดที่มี PID สูงสุด (ค่อนข้างต่ำ) เมื่อมีการใช้ตัวเลือกจะให้ PID ที่ต่ำกว่าหรือวางข้อผิดพลาดบนทางแยก
ilkkachu


2
@Massimo, ด้านความปลอดภัยถูกกล่าวถึงในคำถามนี้ในเรื่องความปลอดภัย.: PID แบบสุ่มนำมาซึ่งความปลอดภัยมากกว่าหรือไม่?
ilkkachu

1
@ RonJohn เอาล่ะผมไม่ได้ให้คุณค่าอะไรกับ Linuxes อื่น ๆ แต่มันสามารถแก้ไขได้คุณสามารถตั้งค่าเป็น 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 ซึ่งอาจมีผลกระทบต่อเวอร์ชันที่ใหม่กว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.