ระบบปฏิบัติการตรวจพบการละเมิดการเข้าถึงหน่วยความจำอย่างไร


12

ระบบปฏิบัติการ (โดยเฉพาะ Linux) รู้ได้อย่างไรว่าคุณเข้าถึงตำแหน่งหน่วยความจำที่คุณไม่ได้รับอนุญาต

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

ฉันตระหนักดีถึงการแมปหน่วยความจำใน Linux แต่มันฟังดูไร้สาระสำหรับฉันที่เคอร์เนลตรวจสอบว่าตำแหน่งที่คุณพยายามเข้าถึงนั้นอยู่ในช่วงที่ถูกต้องทุกครั้งที่คุณทำการเข้าถึง ดูเหมือนว่าจะเสียเวลามากซึ่งอาจใช้เวลาในการทำสิ่งที่มีประสิทธิผลมากขึ้น (แต่อาจปลอดภัยน้อยกว่าโดยไม่มีการตรวจสอบ!) หรือบางทีมันอาจจะจำการเข้าถึงล่าสุดทั้งหมดและตรวจสอบพวกเขาในทุกติ๊กจับเวลาฮาร์ดแวร์? (แต่นั่นฟังดูไม่ปลอดภัยและช้าอีกครั้ง)

ฉันประหลาดใจที่คำถามนี้ดูเหมือนจะไม่ได้ตอบทุกที่ มันเป็นสิ่งที่ฉันสงสัยมาตลอด มันทำให้ฉันคิดว่ามีส่วนหนึ่งของฮาร์ดแวร์ที่จะทำสิ่งนี้ในนามของระบบปฏิบัติการในระดับที่ดีและสะดวกสบาย แต่ถึงกระนั้นก็อาจจะต้องโหลดหน่วยความจำกระบวนการถัดไปแมปในทุกบริบทสลับซึ่งฟังดูช้า

ดังนั้นใช่แล้วฉันกำลังจะไปสักหน่อย: ระบบปฏิบัติการตรวจพบการละเมิดหน่วยความจำได้อย่างไร

ขอบคุณ

คำตอบ:


11

(คำตอบต่อไปนี้ถือว่าเป็นเดสก์ท็อป "ทันสมัย" เซิร์ฟเวอร์หรือแพลตฟอร์มฝังตัวระดับบน (เช่นสมาร์ทโฟนและระบบที่เล็กลงเรื่อย ๆ เช่นกัน) สำหรับระบบ x86 สมัยใหม่หมายความว่า 386 ขึ้นไปคำตอบต่อไปนี้ก็ถือว่า ระบบปฏิบัติการ“ ทันสมัย” เช่นเกือบทุกยูนิกซ์หรือ Windows ตั้งแต่ 95)

นี้ไม่ได้เกิดขึ้นในระบบปฏิบัติการมันเกิดขึ้นในการประมวลผลโดยเฉพาะในMMU ( หน่วยจัดการหน่วยความจำ ) MMU รองรับการกำหนดแอดเดรสเสมือนโดยบิตที่ประกอบเป็นตัวชี้ไม่ได้ระบุตำแหน่งทางกายภาพของบิตในหน่วยความจำโดยตรง

ใน MMU ทั่วไปเมื่อตัวชี้ถูกยกเลิกการลงทะเบียน MMU จะแบ่งบิตออกเป็นสองกลุ่ม: บิตลำดับสูงประกอบด้วยหมายเลขหน้าและบิตลำดับต่ำจะสร้างที่อยู่ภายในหน้า เครื่องเดสก์ท็อปและเซิร์ฟเวอร์ส่วนใหญ่ใช้หน้าเว็บขนาด 4kB MMU ค้นหาหมายเลขหน้าเสมือนในตารางชื่อTLB (นั่นคือสิ่งที่คุณเรียกว่า "แผนที่หน่วยความจำกระบวนการ") TLB ระบุจำนวนหน้าฟิสิคัลที่สอดคล้องกับเพจเสมือนนี้ MMU จะดึงข้อมูลจากหน้าฟิสิคัลในหน่วยความจำ

หาก TLB ไม่มีรายการสำหรับหมายเลขหน้าเสมือนนี้ MMU จะแจ้งให้หน่วยประมวลผลทราบว่าเกิดการเข้าถึงที่ไม่ถูกต้อง โดยทั่วไปจะเรียกว่าข้อยกเว้น

โปรดทราบว่าฉันยังไม่ได้กล่าวถึงระบบปฏิบัติการ นั่นเป็นเพราะการดำเนินการทั้งหมดนี้เป็นอิสระจากระบบปฏิบัติการ ระบบปฏิบัติการเข้าสู่การเล่นเพราะมันกำหนดค่าสิ่งต่าง ๆ ได้สองวิธี:

  • ระบบปฏิบัติการมีหน้าที่ในการสลับงาน เมื่อเป็นเช่นนั้นอย่างที่คุณสงสัยมันจะบันทึก TLB ปัจจุบันและแทนที่ด้วย TLB ที่บันทึกไว้สำหรับงานที่กำหนดเวลาไว้ถัดไป ด้วยวิธีนี้แต่ละกระบวนการมี TLB ดังนั้นที่อยู่0x123456ในกระบวนการ X อาจไม่ได้ชี้ไปที่สถานที่จริงเดียวกันใน RAM เหมือนกับที่อยู่เดียวกันในกระบวนการ Y หรืออาจไม่ถูกต้อง หากกระบวนการพยายามยกเลิกการอ้างอิงตัวชี้นอกพื้นที่ที่อยู่ของกระบวนการนั้นจะไม่เข้าถึงในพื้นที่ของกระบวนการอื่น แต่จะไปถึงที่ใดก็ได้

  • ระบบปฏิบัติการจะตัดสินใจว่าจะเกิดอะไรขึ้นเมื่อมีการยกข้อยกเว้น มันสามารถยุติกระบวนการในการเข้าถึงหน่วยความจำที่ไม่ถูกต้อง นี่เป็นวิธีที่ใช้ในการแลกเปลี่ยน: ตัวจัดการข้อยกเว้นอาจตัดสินใจดึงข้อมูลบางอย่างจากพื้นที่สว็อปอัปเดต TLB ตามนั้นและทำการเข้าถึงอีกครั้ง

โปรดทราบว่า MMU ให้ความปลอดภัยเนื่องจากกระบวนการไม่สามารถเปลี่ยน TLB ของตัวเองได้ เคอร์เนลระบบปฏิบัติการเท่านั้นที่สามารถเปลี่ยน TLB ได้ TLB เปลี่ยนสิทธิ์ทำงานอย่างไรนั้นเกินขอบเขตของคำตอบนี้


6

1) Segfaults ตรวจพบโดยหน่วยจัดการหน่วยความจำ เมื่อคุณขอหน่วยความจำระบบปฏิบัติการจะขอให้หน่วยจัดการหน่วยความจำได้รับบางส่วนจากฮาร์ดแวร์ จะต้องมีสิ่งที่ติดตามหน่วยความจำขนาดใหญ่ทั้งหมดที่ระบบปฏิบัติการมอบให้คุณ มือประเภท OS ที่ปิดการ MMU เนื่องจากมันรู้หน่วยความจำทั้งหมดที่มอบให้คุณมันจึงสามารถบอกคุณได้เมื่อคุณพยายามเข้าถึงตำแหน่งหน่วยความจำที่คุณไม่ได้รับจากการจัดสรรระบบปฏิบัติการจึงมีกิจกรรมสำหรับสิ่งนี้โดยเฉพาะหน่วยความจำที่คุณไม่ได้เป็นเจ้าของ ในที่สุดระบบปฏิบัติการของคุณก็จะฆ่าแอปของคุณทำให้เกิด segfault หรือเทียบเท่ากับ OS อื่น ๆ

ระบบปฏิบัติการบางระบบเท่านั้นที่มีการป้องกันนี้ MacOS ถึง 9 ไม่มีสิ่งใดสิ่งนี้แม้ว่า MMU จะสนับสนุนสิ่งนี้ ไม่ชนะ 3.1 Win95 มีการป้องกันบางอย่างเนื่องจากมีการเปลี่ยนแปลงระหว่างไม่มีการป้องกันและเพิ่มบางอย่าง

2) ระบบปฏิบัติการไม่ทราบรายละเอียดอื่น ๆ นอกเหนือจากนี้ หากคุณมีตัวชี้จรจัดที่เข้าถึงหน่วยความจำที่คุณไม่เคยจัดสรรมันจะรู้ หากคุณมีส่วนหนึ่งที่เข้าไปในส่วนอื่นของใบสมัครของคุณก็ไม่ทราบแน่นอน มันช่วยให้คุณเสียหายได้ นี่คือที่ที่คุณได้รับสแต็คที่เสียหายโดยมีพอยน์เตอร์ชี้ทางจากแอพของคุณเขียนทับส่วนอื่น ๆ ของแอพของคุณ

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

คุณสามารถลองเข้มงวดกว่า 'ไม่มีการป้องกัน' มีเครื่องมือที่เรียกว่า Electric Fence ( http://perens.com/FreeSoftware/ElectricFence/ ) ที่จะหลอก MMU ของคุณให้ทำงานมากขึ้นและทำให้มันตรวจจับได้มากขึ้น ความผิดพลาด


โอเคคุณจะเจาะจงมากขึ้นเกี่ยวกับวิธีการทำงานของมันได้หรือไม่? เช่นจะทราบได้อย่างไรว่ากระบวนการเฉพาะไม่สามารถเข้าถึงตำแหน่งที่ต้องการได้อย่างไร อะไรบอกกระบวนการที่สามารถเข้าถึงได้ที่ไหน มันแตกต่างอย่างไร ขอบคุณ
Doddy

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