CallStack ของ Shadow

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 ไม่ส่งผลต่อ อุปกรณ์