ความสมบูรณ์ของระบบปฏิบัติการ
ซอฟต์แวร์ระบบปฏิบัติการของ Apple ได้รับการออกแบบมาโดยยึดถือความปลอดภัยเป็นสิ่งสำคัญ การออกแบบนี้ประกอบไปด้วยรากของความเชื่อถือฮาร์ดแวร์ซึ่งถูกนำมาใช้เพื่อเปิดใช้งานการบูตอย่างปลอดภัยและกระบวนการอัปเดตซอฟต์แวร์ที่ปลอดภัยซึ่งรวดเร็วและปลอดภัย ระบบปฏิบัติการของ Apple ยังใช้ความสามารถของฮาร์ดแวร์ที่ใช้ Silicon ที่สร้างขึ้นตามจุดประสงค์เพื่อช่วยป้องกันไม่ให้เกิดการใช้ประโยชน์ขณะที่ระบบทำงานอีกด้วย คุณสมบัติรันไทม์เหล่านี้จะปกป้องความสมบูรณ์ของโค้ดที่เชื่อถือแล้วในขณะที่โค้ดนั้นถูกเรียกใช้ สรุปแล้ว ซอฟต์แวร์ระบบปฏิบัติการของ Apple จะช่วยลดการโจมตีและเทคนิคการใช้ประโยชน์ต่างๆ ไม่ว่าจะมาจากแอปที่ประสงค์ร้าย จากเว็บ หรือผ่านช่องทางอื่นใดก็ตาม การปกป้องที่ระบุในที่นี้มีให้ใช้งานบนอุปกรณ์ที่มี SoC ที่ Apple ออกแบบและที่รองรับ ซึ่งรวมถึง iOS, iPadOS, tvOS, watchOS และตอนนี้รวมถึง macOS บน Mac ที่ใช้ Apple Silicon
คุณสมบัติ | A10 | A11, S3 | A12, S4 | A13, S5 | A14, A15, S6, S7 | ตระกูล M1 |
---|---|---|---|---|---|---|
| ||||||
|
| |||||
|
| |||||
| ดูหมายเหตุด้านล่าง |
หมายเหตุ: ระดับชั้นการปกป้องหน้า (PPL) กำหนดให้แพลตฟอร์มเรียกใช้เฉพาะโค้ดที่ลงชื่อและเชื่อถือแล้ว นี่เป็นโมเดลความปลอดภัยที่ไม่สามารถใช้ได้บน macOS
การปกป้องความสมบูรณ์ของเคอร์เนล
หลังจากที่เคอร์เนลของระบบปฏิบัติการเริ่มต้นทำงานแล้ว การปกป้องความสมบูรณ์ของเคอร์เนล (KIP) จะถูกเปิดใช้งานเพื่อช่วยป้องกันการแก้ไขโค้ดของเคอร์เนลและไดรเวอร์ ตัวควบคุมหน่วยความจำมอบพื้นที่หน่วยความจำทางกายภาพที่มีรหัสปกป้องซึ่ง iBoot ใช้ในการโหลดเคอร์เนลและส่วนขยายเคอร์เนล หลังจากที่การเริ่มต้นระบบเสร็จสมบูรณ์แล้ว ตัวควบคุมหน่วยความจำจะปฏิเสธการเขียนบนพื้นที่หน่วยความจำทางกายภาพที่มีรหัสปกป้อง หน่วยการจัดการหน่วยความจำ (MMU) ของหน่วยประมวลผลแอปพลิเคชันจะถูกกำหนดค่าเพื่อช่วยป้องกันการเทียบผังโค้ดที่มีสิทธิ์พิเศษจากหน่วยความจำทางกายภาพที่อยู่นอกพื้นที่หน่วยความจำที่มีรหัสปกป้อง และเพื่อช่วยป้องกันการเทียบผังแบบเขียนได้ของหน่วยความจำทางกายภาพภายในพื้นที่หน่วยความจำเคอร์เนล
ในการป้องกันไม่ให้กำหนดค่าอีกครั้ง ฮาร์ดแวร์ที่ใช้ในการเปิดใช้งาน KIP จะถูกล็อคหลังจากที่กระบวนการบูตเสร็จสมบูรณ์
การจำกัดสิทธิ์อย่างรวดเร็ว
เริ่มต้นด้วย A11 Bionic SoC และ S3 SoC ของ Apple พื้นฐานฮาร์ดแวร์ใหม่ได้มีการนำมาใช้ โดยพื้นฐานนี้ ซึ่งเรียกว่าการจำกัดสิทธิ์อย่างรวดเร็ว จะมีรีจิสเตอร์ CPU ที่จำกัดสิทธิ์ต่อเธรดอย่างรวดเร็ว ด้วยการจำกัดสิทธิ์อย่างรวดเร็ว (หรือเรียกอีกอย่างว่ารีจิสเตอร์ APRR) ระบบปฏิบัติการที่รองรับสามารถเอาสิทธิ์การดำเนินการออกจากหน่วยความจำได้โดยไม่ต้องใช้โอเวอร์เฮดของการเรียกระบบและ Page Table Walk หรือ Page Table Flush รีจิสเตอร์เหล่านี้ให้การเยียวยาอีกขั้นสำหรับการโจมตีจากเว็บ โดยเฉพาะกับโค้ดที่รวบรวมในระหว่างรันไทม์ (การรวบรวมแบบ Just In Time) เนื่องจากหน่วยความจำไม่สามารถเรียกใช้ได้อย่างมีประสิทธิภาพขณะที่มีการอ่านและเขียนไปพร้อมกัน
การปกป้องความสมบูรณ์ของหน่วยประมวลผลร่วมของระบบ
เฟิร์มแวร์ของหน่วยประมวลผลร่วมจะจัดการงานที่สำคัญของระบบเป็นจำนวนมาก ตัวอย่างเช่น Secure Enclave, หน่วยประมวลผลเซ็นเซอร์ภาพ และหน่วยประมวลผลร่วมของการเคลื่อนไหว ดังนั้นความปลอดภัยของเฟิร์มแวร์นี้จึงถือเป็นส่วนสำคัญของความปลอดภัยของระบบโดยรวม ในการป้องกันการแก้ไขเฟิร์มแวร์ของหน่วยประมวลผลร่วม Apple จะใช้กลไกที่เรียกว่าการปกป้องความสมบูรณ์ของหน่วยประมวลผลร่วมของระบบ (SCIP)
SCIP ทำงานคล้ายกับการปกป้องความสมบูรณ์ของเคอร์เนล (KIP) มาก: ในระหว่างการบูต iBoot จะโหลดเฟิร์มแวร์ของหน่วยประมวลผลร่วมแต่ละรายการไปยังพื้นที่หน่วยความจำที่มีรหัสปกป้อง ซึ่งเก็บรักษาและแยกออกจากพื้นที่ KIP โดย iBoot จะกำหนดค่า Memory Management Unit ของหน่วยประมวลผลร่วมแต่ละรายการเพื่อช่วยป้องกันดังต่อไปนี้:
การเทียบผังที่สามารถเรียกใช้ได้นอกเหนือส่วนพื้นที่หน่วยความจำที่มีรหัสปกป้อง
การเทียบผังแบบเขียนได้ภายในส่วนพื้นที่หน่วยความจำที่มีรหัสปกป้อง
นอกจากนี้ในระหว่างการบูต ในการกำหนดค่า SCIP สำหรับ Secure Enclave ระบบปฏิบัติการ Secure Enclave จะถูกใช้งาน หลังจากที่กระบวนการบูตเสร็จสมบูรณ์ ฮาร์ดแวร์ที่ใช้ในการเปิดใช้งาน SCIP จะถูกล็อค วิธีนี้ได้รับการออกแบบมาป้องกันการกำหนดค่าอีกครั้ง
รหัสการตรวจสอบสิทธิ์ตัวชี้
รหัสการตรวจสอบสิทธิ์ตัวชี้ (PAC) จะใช้เพื่อป้องกันการใช้ประโยชน์จากข้อผิดพลาดที่ทำให้หน่วยความจำเสียหาย ซอฟต์แวร์ระบบและแอปในตัวจะใช้ PAC เพื่อช่วยป้องกันการแก้ไขตัวชี้ฟังก์ชั่นและที่อยู่ส่งกลับ (ตัวชี้รหัส) PAC จะใช้ค่าลับแบบ 128 บิตห้าค่าเพื่อลงชื่อคำสั่งเคอร์เนลและข้อมูล และกระบวนการพื้นที่ผู้ใช้แต่ละกระบวนการจะมีกุญแจ B ของตัวเอง รายการจะได้รับการ salt และลงชื่อตามที่ระบุด้านล่างนี้
รายการ | กุญแจ | Salt |
---|---|---|
ที่อยู่ส่งกลับฟังก์ชั่น | IB | ที่อยู่พื้นที่จัดเก็บข้อมูล |
ตัวชี้ฟังก์ชั่น | IA | 0 |
ฟังก์ชั่นปิดกั้นการเรียกใช้ | IA | ที่อยู่พื้นที่จัดเก็บข้อมูล |
แคชวิธี Objective-C | IB | ที่อยู่พื้นที่จัดเก็บข้อมูล + คลาส + ตัวเลือก |
รายการ C++ V-Table | IA | ที่อยู่พื้นที่จัดเก็บข้อมูล + แฮช (ชื่อวิธีไม่สมบูรณ์) |
ป้าย Goto ที่มีการคำนวณ | IA | แฮช (ชื่อฟังก์ชั่น) |
สถานะเธรดของเคอร์เนล | GA | • |
รีจิสเตอร์สถานะเธรดของผู้ใช้ | IA | ที่อยู่พื้นที่จัดเก็บข้อมูล |
ตัวชี้ C++ V-Table | DA | 0 |
ค่าลายเซ็นจะถูกจัดเก็บในบิตการเติมเต็มที่ไม่ได้ใช้ที่ด้านบนของตัวชี้ 64 บิต โดยลายเซ็นดังกล่าวจะได้รับการตรวจสอบยืนยันก่อนการใช้งาน และการเติมเต็มจะถูกกู้คืนเพื่อช่วยให้การรับรองที่อยู่ตัวชี้ฟังก์ชั่น การตรวจสอบยืนยันผลลัพธ์ในการยกเลิกไม่สำเร็จ การตรวจสอบยืนยันนี้จะทำให้การโจมตีในหลากหลายรูปแบบดำเนินการได้ยากขึ้น เช่น การโจมตีการเขียนโปรแกรมแบบย้อนกลับ (ROP) ซึ่งจะพยายามหลอกอุปกรณ์ให้เรียกใช้โค้ดที่มีอยู่โดยมีประสงค์ร้ายโดยการควบคุมที่อยู่ส่งกลับฟังก์ชั่นที่จัดเก็บอยู่บนสแต็ค
ระดับชั้นการปกป้องหน้า
ระดับชั้นการปกป้องหน้า (PPL) ใน iOS, iPadOS และ watchOS ได้รับการออกแบบมาเพื่อป้องกันไม่ให้มีการแก้ไขโค้ดพื้นที่ผู้ใช้หลังจากตรวจสอบยืนยันลายเซ็นโค้ดเสร็จ ด้วยการสร้างบนการปกป้องความสมบูรณ์ของเคอร์เนลและการจำกัดสิทธิ์อย่างรวดเร็ว PPL จัดการสิทธิ์การแทนที่ Page Table เพื่อให้แน่ใจว่ามีเพียง PPL เท่านั้นที่สามารถเปลี่ยนหน้าที่มีการปกป้องที่มีโค้ดผู้ใช้และ Page Table ระบบช่วยลดพื้นหน้าของการโจมตีเป็นอย่างมากด้วยการรองรับการบังคับใช้ความสมบูรณ์ของโค้ดทั้งระบบแม้ในขณะที่เคอร์เนลถูกโจมตี การปกป้องนี้จะไม่มีให้ใช้ใน macOS เนื่องจาก PPL สามารถใช้ได้บนระบบที่มีการลงชื่อโค้ดทั้งหมดที่เรียกใช้เท่านั้น