การใช้“ อาถรรพณ์อาถรรพณ์” ในการเรียกระบบรีบูตระบบ Linux คืออะไร?


10

ขณะที่ผมกำลังอ่านรหัสที่มาลินุกซ์และอื่น ๆ โดยเฉพาะรหัสสายระบบผมมาในsys_rebootการดำเนินงาน: http://lxr.free-electrons.com/source/kernel/reboot.c#L199

199 SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
200                 void __user *, arg)
201 {
202        ...
...    
286 }

ตรงกลางมีโค้ดเฉพาะส่วนนี้:

209 
210         /* For safety, we require "magic" arguments. */
211         if (magic1 != LINUX_REBOOT_MAGIC1 ||
212                         (magic2 != LINUX_REBOOT_MAGIC2 &&
213                         magic2 != LINUX_REBOOT_MAGIC2A &&
214                         magic2 != LINUX_REBOOT_MAGIC2B &&
215                         magic2 != LINUX_REBOOT_MAGIC2C))
216                 return -EINVAL;

ฉันสงสัยว่ามันปลอดภัยแค่ไหน ฉันหมายความว่ามันเป็นการป้องกันการใช้ผิดวัตถุประสงค์หรือไม่? ในกรณีนี้เนื่องจากพารามิเตอร์เป็นสาธารณะไลบรารีหรือแอ็พพลิเคชันใด ๆ อาจใช้การโทรของระบบในทางที่ผิดแม้ว่าพวกเขาจะต้องผ่านพารามิเตอร์ ฉันพลาดอะไร?


อาจเป็นการโทรโดยไม่ตั้งใจจากตัวอย่างเช่นความเสียหายของหน่วยความจำหรือการพิมพ์ผิดในหมายเลข syscall ไม่ว่าจะเป็นเรื่องที่น่ากังวลก็ไม่รู้
Derobert

@derobert เหมาะสม แต่ ... การเรียกใช้ระบบทั้งหมดไม่ต้องการการป้องกันเช่นนี้หรือไม่? ยกเว้นgetpidและสิ่งที่ชอบแน่นอนว่าพวกเขาทุกคนสามารถมีผลกระทบที่คาดเดาไม่ได้หากใช้ผิดวัตถุประสงค์ หรือบางที syscalls อื่น ๆ ทั้งหมดมีพารามิเตอร์เพียงพอที่จะตรวจสอบเพื่อให้ไม่เป็นอันตรายหากถูกเรียกผิด มันให้ความรู้สึกเหมือนความคิดที่แปลกประหลาดของ "ความปลอดภัย" ให้ฉัน แต่ ...
lgeorget

จริง ฉันไม่แน่ใจว่า ณ จุดหนึ่งไลนัสไล่ล่าบั๊กที่เก็บ # $ & #! รีบูทเครื่องของเขาหรือถ้ามีคนเพิ่งเพิ่มเพราะพวกเขาหวาดระแวง ฯลฯ สิ่งที่ควรจะป้องกันนั้นค่อนข้างชัดเจน ทำไมการป้องกันจากสิ่งนั้นจึงเป็นคำถามที่ดี
Derobert

@derobert อาจเป็นโฮลด์จากใครบางคนที่เคยใช้กับวงจรรวมซึ่งชิปจำนวนมากใช้ยามบางชนิดเพื่อเปิดใช้งานฟังก์ชั่นการปิด (คุณต้องเขียนบิต XYZ ไปยังการลงทะเบียนพิเศษก่อนที่คำสั่งปิดทำงานจะทำงาน) ไม่แน่ใจว่าระยะเวลาสำหรับการทำให้รู้สึกว่า
mbrig

คำตอบ:


10

คำถามนี้ได้รับการตอบในคำถามผู้ใช้ขั้นสูงนี้:

โดยพื้นฐานแล้วการพลิกที่อยู่เล็กน้อยอาจทำให้โปรแกรมคิดว่ากำลังเรียกการเรียกระบบหนึ่งครั้งเมื่อที่จริงแล้วมันกำลังเรียกการเรียกของreboot()ระบบ เนื่องจากreboot()เป็นการดำเนินการที่ทำลายล้างและไม่ซิงค์ซึ่งจะลบสถานะของระบบ - ดังนั้นจึงลบหลักฐานของปัญหาบิต - ฟลิปที่อาจถูกเปิดเผยเป็นข้อผิดพลาดของโปรแกรมหรือความตื่นตระหนก - Linux มีการป้องกันพิเศษรอบการใช้งานที่ประสบความสำเร็จ .

ที่น่าสนใจก็คือตัวเลขเวทย์มนตร์ชุดที่สองนั้นสอดคล้องกับวันเกิดของไลนัสและลูกสาวสามคนของเขา:


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