ShadowCallStack

ShadowCallStack (SCS) เป็น LLVM วัด โหมดที่ป้องกันการเขียนทับที่อยู่ผู้ส่ง (เช่นสแต็คบัฟเฟอร์ล้น) โดยการบันทึกอยู่ส่งกลับฟังก์ชั่นที่จะจัดสรรแยก ShadowCallStack ในการเปิดฉากการทำงานของฟังก์ชั่น nonleaf และโหลดอยู่กลับมาจาก ShadowCallStack ในฟังก์ชั่น บทส่งท้าย ที่อยู่ผู้ส่งยังถูกเก็บไว้ในสแต็กปกติเพื่อความเข้ากันได้กับตัวคลาย แต่ไม่ได้ใช้ เพื่อให้แน่ใจว่าการโจมตีที่แก้ไขที่อยู่ผู้ส่งกลับบนสแต็กปกติจะไม่มีผลต่อโฟลว์การควบคุมโปรแกรม

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

การดำเนินการ

Android รองรับ ShadowCallStack สำหรับทั้งเคอร์เนลและพื้นที่ผู้ใช้

การเปิดใช้งาน SCS สำหรับเคอร์เนล

ในการเปิดใช้งาน ShadowCallStack สำหรับเคอร์เนล ให้เพิ่มบรรทัดต่อไปนี้ในไฟล์กำหนดค่าเคอร์เนล:

CONFIG_SHADOW_CALL_STACK=y

การเปิดใช้งาน SCS ใน userspace

ในการเปิดใช้งาน ShadowCallStack ในส่วนประกอบ userspace ให้เพิ่มบรรทัดต่อไปนี้ในไฟล์พิมพ์เขียวของส่วนประกอบ:

sanitize: {
  scs: true
}

SCS สันนิษฐานว่า x18 ทะเบียนลิขสิทธิ์ในการจัดเก็บที่อยู่ของ ShadowCallStack และไม่ได้ใช้เพื่อวัตถุประสงค์อื่นใด ในขณะที่ทุกระบบห้องสมุดจะถูกรวบรวมเพื่อสำรอง x18 ทะเบียนนี้เป็นปัญหาที่อาจเกิดถ้า SCS เปิดใช้งานสำหรับส่วนประกอบ userspace ที่ทำงานร่วมกับรหัสในกระบวนการแบบเดิม (เช่นห้องสมุดที่สามารถโหลดโดยการใช้งานของบุคคลที่สาม) ซึ่งอาจบังคับ x18 ทะเบียน ด้วยเหตุนี้ เราจึงแนะนำให้เปิดใช้งาน SCS ในส่วนประกอบที่มีอยู่ในตัวเท่านั้น ซึ่งจะไม่ถูกโหลดลงในไบนารีแบบเดิม

การตรวจสอบความถูกต้อง

ไม่มีการทดสอบ CTS สำหรับ SCS โดยเฉพาะ ตรวจสอบให้แน่ใจว่าการทดสอบ CTS ผ่านทั้งที่มีและไม่มีการเปิดใช้งาน SCS เพื่อตรวจสอบว่า SCS ไม่ส่งผลกระทบต่ออุปกรณ์