รหัสเครื่อง JIT และบิต Execution Disable


10

รหัสเครื่องที่สร้างจากรันไทม์เป็นอย่างไร (เช่นผลลัพธ์ของ JIT) ซึ่งดำเนินการโดย CPU จริง ๆ ถ้า CPU / OS มีบิต Execution Disable?

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

แต่เครื่องยนต์ของ JIT เช่น LLVM ซึ่งสร้างรหัสเครื่องจักรแบบไดนามิกได้รับสิ่งนี้ได้อย่างไร


ดูการใช้งานของ Memory :: allocateMappedMemory เพื่อดูว่ามันทำใน LLVM อย่างไร - สำหรับ * ระวัง - สำหรับ Windows
zr01

คำตอบ:


6

บน Linux และระบบ Posix หลายแอปพลิเคชันสามารถเปลี่ยนการป้องกันพื้นที่ที่อยู่กระบวนการบางช่วงในหน่วยความจำเสมือนโดยใช้mmap (2)และmprotect (2) syscalls

ดังนั้นเครื่องยนต์ JIT สามารถใช้สิ่งเหล่านี้ (อาจเป็นไปได้ก่อนที่จะปล่อยรหัสเครื่อง แต่อาจหลังจากนั้น)

BTW สำหรับสถาปัตยกรรมบางประเภทคุณอาจต้องแจ้ง CPU แคชเกี่ยวกับเซ็กเมนต์รหัสเครื่องที่มีใหม่เช่น__builtin_clear_cacheGCC

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