ShadowCallStack (SCS) คือโหมดการวัดคุม LLVM ที่ป้องกัน ที่อยู่ส่งกลับจะเขียนทับ (เช่น การล้นของบัฟเฟอร์สแต็ก) ด้วยการบันทึกฟังก์ชัน ส่งคืนที่อยู่ไปยัง ShadowCallStack ที่จัดสรรแยกต่างหากใน ส่วนคำบรรยายฟังก์ชันของฟังก์ชันที่ไม่ใช่รายละเอียด และการโหลดที่อยู่ส่งกลับจาก ShadowCallStack ใน Epilog ของฟังก์ชัน จัดเก็บที่อยู่สำหรับคืนสินค้าด้วย ในสแต็กปกติเพื่อให้เข้ากันได้กับโปรแกรมคลายการไขปริศนา แต่ไม่มีการใช้งาน ซึ่งทำให้มั่นใจว่าการโจมตีที่แก้ไขที่อยู่สำหรับคืนสินค้าในสแต็กปกติ ก็จะไม่กระทบต่อกระบวนการควบคุมโปรแกรม
ใน aarch64 เครื่องมือจะใช้ x18
ลงทะเบียนเพื่ออ้างอิง ShadowCallStack ซึ่งหมายความว่าการอ้างอิง
ไปยัง ShadowCallStack โดยไม่ต้องจัดเก็บไว้ในหน่วยความจำ
วิธีนี้จะช่วยให้ใช้งานรันไทม์ที่หลีกเลี่ยงการเปิดเผย
ที่อยู่ของ ShadowCallStack ไปยังผู้โจมตีที่สามารถอ่าน
หน่วยความจำที่กำหนดเอง
การใช้งาน
Android รองรับ ShadowCallStack สำหรับทั้งเคอร์เนลและพื้นที่ผู้ใช้
เปิดใช้ SCS สำหรับเคอร์เนล
หากต้องการเปิดใช้ ShadowCallStack สำหรับเคอร์เนล ให้เพิ่มบรรทัดต่อไปนี้ในส่วน ไฟล์การกำหนดค่าเคอร์เนล:
CONFIG_SHADOW_CALL_STACK=y
เปิดใช้ SCS ในพื้นที่ผู้ใช้
หากต้องการเปิดใช้ ShadowCallStack ในคอมโพเนนต์พื้นที่ผู้ใช้ ให้เพิ่มเมธอด ต่อบรรทัดต่อไปนี้ไปยังไฟล์พิมพ์เขียวของคอมโพเนนต์
sanitize: { scs: true }
SCS ถือว่าการจดทะเบียน x18
สงวนไว้เพื่อเก็บที่อยู่ของ
ShadowCallStack และไม่ใช้เพื่อวัตถุประสงค์อื่นใด แม้ว่าทุกระบบ
ได้รับการรวบรวมขึ้นเพื่อสงวนการลงทะเบียน x18
ซึ่งอาจเป็น
จะเกิดปัญหาหากเปิดใช้ SCS สำหรับคอมโพเนนต์พื้นที่ผู้ใช้ที่ทำงานร่วมกับ
โค้ดเดิมในกระบวนการ (เช่น ไลบรารีที่บุคคลที่สามสามารถโหลดได้
) ซึ่งอาจลบล้างการลงทะเบียน x18
เราจึงแนะนำ
การเปิดใช้ SCS ในคอมโพเนนต์ที่มีในตัวที่จะไม่โหลดลงในไฟล์เดิม
ไบนารี
การตรวจสอบความถูกต้อง
ไม่มีการทดสอบ CTS สำหรับ SCS โดยเฉพาะ แต่ให้ตรวจสอบว่าการทดสอบ CTS ทั้งที่มีและไม่มีการเปิดใช้ SCS เพื่อยืนยันว่า SCS ไม่ส่งผลต่อ อุปกรณ์