ช่องโหว่ใหม่หลายรายการสำหรับการหลุดออกจาก sandbox บน macOS
(jhftss.github.io)- ในงานวิจัยการหลุดออกจาก sandbox บน macOS พบว่า PID domain XPC service ซึ่งก่อนหน้านี้ไม่ค่อยถูกมองเป็นเป้าหมาย ได้กลายเป็นพื้นผิวโจมตี และนำไปสู่การค้นพบช่องโหว่ใหม่มากกว่า 10 รายการ
- เป้าหมายหลักไม่ใช่ Mach service ใน System/User domain แต่เป็น XPC service ประเภท Application ที่ถูกลงทะเบียนใน PID domain เมื่อโหลดแอปหรือ framework
- ตัวอย่างช่องโหว่ประกอบด้วย CVE-2023-27944, CVE-2023-32414, CVE-2023-32404, CVE-2023-41077, CVE-2023-42961, CVE-2024-27864, CVE-2023-42977 เป็นต้น โดยบางรายการเชื่อมโยงไปถึง การบายพาส TCC, สิทธิ์ที่เกี่ยวข้องกับ SIP และผลกระทบต่อ iOS
- จุดล้มเหลวที่เกิดซ้ำคือ service ที่ไม่ได้ถูกแยก isolation จัดการไฟล์·ไดเรกทอรี·archive·DMG โดยไม่สามารถจัดการ extended attribute quarantine, สตริงพาธ และการตรวจสอบสิทธิ์ของ client ได้อย่างปลอดภัย
- การตอบสนองของ Apple นำไปสู่การลบ XPC service ที่มีช่องโหว่ การ normalize อินพุต การย้ายการตรวจสอบไปฝั่ง server และการกำหนดให้ต้องมี private entitlement แต่ยังเหลือรายงานอีก 5 รายการที่รอแพตช์อยู่
โมเดล sandbox ของ macOS และเป้าหมายของการหลุดออก
- ใน macOS มี process จำนวนมาก รวมถึง service ของ Apple เองและแอปจาก third party ที่ทำงานอยู่ใน สภาพแวดล้อม sandbox ที่ถูกจำกัด
- แม้ผู้โจมตีจะได้ remote code execution (RCE) ใน process ที่อยู่ใน sandbox ความสามารถในการรันและสิทธิ์เข้าถึงไฟล์ก็ยังถูกจำกัด ดังนั้นขั้นตอนถัดไปคือ การหลุดออกจาก sandbox เพื่อให้ได้สิทธิ์ที่กว้างขึ้น
-
App Sandbox
- ตามข้อกำหนดของ Mac App Store แอปจำนวนมากทำงานภายใต้ข้อจำกัดของ App Sandbox
- แอปที่อยู่ใน sandbox ต้องมี entitlement
com.apple.security.app-sandbox - ข้อจำกัดจะถูกบังคับใช้ในขั้นตอน dyld initialization ซึ่งอยู่ก่อนฟังก์ชัน
mainของแอป - เมื่อเข้าสู่ App Sandbox แอปจะถูกทำให้เป็น container และการทำงานกับไฟล์จะถูกจำกัดไว้ที่พาธของ data container
- ไฟล์ที่แอปใน sandbox สร้างขึ้นจะมี extended attribute
com.apple.quarantineติดมาด้วยโดยค่าเริ่มต้น - ใน sandbox profile มีกฎที่ป้องกันการลบ extended attribute นี้
- สิทธิ์ย่อยของ App Sandbox ถูกกำหนดไว้ใน
/System/Library/Sandbox/Profiles/application.sb - เครือข่าย ฮาร์ดแวร์ filesystem และ Mach service ที่เข้าถึงได้จะถูกจำกัด
- process ลูกที่ถูก
forkจะสืบทอดข้อจำกัดของ App Sandbox จาก process แม่ - process ที่รันผ่าน
LaunchService.frameworkจะไม่สืบทอดข้อจำกัด เช่น สามารถใช้คำสั่งopenของระบบเพื่อรันแอปที่ไม่อยู่ใน sandbox ได้โดยตรง
-
Service Sandbox
- daemon service จำนวนมากของ Apple ทำงานในบริบท Service Sandbox
- service sandbox profile ส่วนใหญ่อยู่ที่
/System/Library/Sandbox/Profiles/*.sbและ/usr/share/sandbox/*.sb - ข้อจำกัดของ Service Sandbox ถูกบังคับใช้แบบ manual โดยเรียก API
sandbox_init_XXXในฟังก์ชันmainของ service - service ที่เข้าสู่ Service Sandbox โดยทั่วไปจะไม่ถูกทำให้เป็น container
- ความแตกต่างสำคัญคือไฟล์ที่สร้างใน Service Sandbox โดยค่าเริ่มต้นจะ ไม่ถูกตั้งค่า quarantine
- หากไม่เรียก API ที่เกี่ยวข้องกับ quarantine เอง ไฟล์ที่สร้างขึ้นจะไม่มี quarantine ติดมา
เส้นทางการหลุดออกจาก sandbox บน macOS ที่มีอยู่เดิม
-
การโจมตี LaunchService.framework
- วิธีที่พบได้บ่อยเดิมวิธีหนึ่งคือการโจมตีแอปที่ไม่อยู่ใน sandbox ผ่าน LaunchService.framework
- CVE-2021-30864 เป็นกรณีที่จัดการ environment variable
$HOMEกับ Terminal.app ซึ่งเป็นแอประบบที่ไม่อยู่ใน sandbox - เมื่อรัน Terminal payload อันตรายที่อยู่ใต้
$HOME/.profileซึ่งควบคุมได้จะถูกรันโดยไม่มีข้อจำกัดของ sandbox - อีกสถานการณ์หนึ่งคือการ drop แอปใหม่ที่ไม่อยู่ใน sandbox แล้วรัน
- อย่างไรก็ตาม แอปใหม่ที่แอปใน sandbox drop ลงมาจะถูกตั้งค่า quarantine ทำให้รันไม่ได้
- หากสามารถ drop ไฟล์หรือโฟลเดอร์โดยไม่มี quarantine ได้ ก็สามารถบายพาส App Sandbox ได้อย่างสมบูรณ์
- CVE-2023-32364 เป็นกรณีที่ใช้ประโยชน์จากข้อเท็จจริงที่ devfs ไม่รองรับ extended attribute เพื่อ drop โฟลเดอร์ที่ไม่มี quarantine
-
การโจมตี Mach service ที่เข้าถึงได้
- วิธีที่พบบ่อยวิธีที่สองคือการโจมตี Mach service ที่ระบุอยู่ใน App Sandbox profile
- ข้อมูล Mach service ของระบบถูกเก็บไว้ใน
/System/Library/xpc/launchd.plist - สามารถใช้ API
bootstrap_look_upเพื่อตรวจสอบจากแอปใน sandbox ว่าเข้าถึง Mach service เฉพาะได้หรือไม่ - Mach service เหล่านี้อยู่ใน System domain หรือ User domain
- จุดเริ่มต้นของงานวิจัยนี้คือมี XPC service ที่เข้าถึงได้จาก App Sandbox อยู่นอกเหนือจากสอง domain นี้ด้วย
พื้นผิวโจมตีใหม่: PID domain XPC service
- XPC service ที่ถูกมองข้ามอยู่ใน PID domain
- ต่างจาก XPC service ใน System/User domain ที่เคยถูกพิจารณาเป็นหลัก service เหล่านี้มี service type เป็น Application
- XPC service ประเภท Application จะถูกเรียกใช้เมื่อแอปร้องขอ และจะปิดไปพร้อมกับแอปที่ร้องขอเมื่อแอปนั้นจบการทำงาน
- XPC service ใน System/User domain จะเข้าถึงได้จากแอปใน sandbox เฉพาะเมื่อถูกกำหนดไว้ใน
application.sbเท่านั้น - XPC service ทั้งหมดที่แอปและ framework ต้องการจะปรากฏใน PID domain ของแอปนั้น
- XPC service จำนวนมากใน PID domain ไม่ได้คาดว่าจะถูกเรียกจากแอปใน sandbox จึงอาจไม่มีการตรวจ entitlement หรือการตรวจ sandbox สำหรับ XPC client ที่เข้ามา
-
กรณี SystemShoveService.xpc
SystemShoveService.xpcเป็น bundle XPC ภายใน private framework ของระบบชื่อShoveService.framework- service type ใน Info.plist คือ Application และ bundle identifier คือ
com.apple.installandsetup.shoveservice.system - เมื่อโหลด
/System/Library/PrivateFrameworks/ShoveService.frameworkจากแอปใน sandbox XPC service ที่เกี่ยวข้องจะถูกลงทะเบียนใน PID domain โดยอัตโนมัติ SystemShoveService.xpcไม่ตรวจสอบ XPC client ที่ร้องขอ จึงถูกใช้โจมตีเพื่อหลุดออกจาก App Sandbox ได้- service นี้มี entitlement ที่เกี่ยวข้องกับ SIP อันทรงพลังชื่อ
com.apple.rootless.installจึงอาจเชื่อมโยงไปถึงการบายพาสการป้องกันของ SIP ได้ด้วย - ช่องโหว่นี้ถูกกำหนดเป็น CVE-2022-26712 และรายละเอียดสรุปไว้ใน บทความก่อนหน้า
-
วิธีสำรวจ
- XPC service ทั้งหมดที่มี Service Type เป็น Application เป็นเป้าหมายที่เป็นไปได้สำหรับการหลุดออกจาก App Sandbox
- สามารถค้นหาได้โดยไล่รายการ XPC service ใน system framework และ private framework
/System/Library/Frameworks/System/Library/PrivateFrameworks
- หากมี PID domain XPC service ที่ไม่ตรวจสอบ XPC client ที่เข้ามา ก็สามารถลองโจมตีด้วยวิธีต่อไปนี้
- drop โฟลเดอร์ แอปโดยไม่มี quarantine เพื่อให้ได้การหลุดออกจาก sandbox อย่างสมบูรณ์
- drop ไฟล์ ZIP หรือ DMG ที่มีแอปที่ไม่อยู่ใน sandbox โดยไม่มี quarantine
ช่องโหว่ 2 รายการที่มีเฉพาะในเบต้า
-
Beta-No-CVE-1: การรันคำสั่งตามอำเภอใจใน StorageKit
- Apple บันทึกช่องโหว่นี้ไว้ใน additional recognitions แต่ไม่ได้กำหนด CVE ให้
- ตามที่ Apple ระบุ CVE จะถูกกำหนดให้เฉพาะช่องโหว่ของซอฟต์แวร์ที่ปล่อยสู่โปรดักชันเท่านั้น และจะไม่ถูกกำหนดให้ช่องโหว่ของ ซอฟต์แวร์ beta-only
- มีผลกระทบเฉพาะ macOS Sonoma Beta เท่านั้น
- พาธของบริการ XPC ที่มีช่องโหว่คือ
/System/Library/PrivateFrameworks/StorageKit.framework/XPCServices/storagekitfsrunner.xpc - บริการนี้สามารถรันได้โดยไม่มีข้อจำกัด sandbox และยอมรับ XPC client ทั้งหมดในเมธอด delegate
- เมธอดเดียวของ
SKRemoteTaskRunnerProtocolคือrunTask:arguments:withReply:ถูกออกแบบมาให้รันคำสั่งตามอำเภอใจด้วยพาธไฟล์ปฏิบัติการและอาร์กิวเมนต์ที่ระบุ - เนื่องจาก sandbox XPC client สามารถควบคุมพาธไฟล์ปฏิบัติการและอาร์กิวเมนต์ได้ จึงสามารถรันคำสั่งระบบตามอำเภอใจโดยไม่มีข้อจำกัด sandbox
- Apple ได้ ลบ บริการ XPC ที่มีช่องโหว่ออกจากระบบปฏิบัติการ ทั้งหมด ก่อนการปล่อย macOS Sonoma 14.0 เวอร์ชันทางการ
-
Beta-No-CVE-2: การใช้ประโยชน์จากการสร้าง ZIP ใน AudioAnalyticsHelperService
- ช่องโหว่นี้ก็ไม่ได้รับการกำหนด CVE ด้วยเหตุผล beta-only เช่นเดียวกัน
- พาธของบริการ XPC ที่มีช่องโหว่คือ
/System/Library/PrivateFrameworks/AudioAnalyticsInternal.framework/XPCServices/AudioAnalyticsHelperService.xpc - บริการนี้สามารถรันได้โดยไม่มีข้อจำกัด sandbox และยอมรับ XPC client ทั้งหมด
- เมธอด
createZipAtPath:hourThreshold:withReply:จะบีบอัดพาธตามอำเภอใจที่ XPC client ระบุ - หากในพาธที่ระบุไม่มีโฟลเดอร์
compressedก็จะสร้างขึ้น ค้นหาไฟล์.jsonย้ายไปยังโฟลเดอร์นั้น แล้วสร้างไฟล์ ZIP - ผู้โจมตีสามารถเปลี่ยนโฟลเดอร์
compressedเป็น symlink เพื่อย้ายไฟล์ตามอำเภอใจไปยังตำแหน่งตามอำเภอใจได้ - ไม่มีการตรวจสอบเนื้อหาของไฟล์ต้นทาง และพาธไฟล์ปลายทางต้องมีส่วนต่อท้าย
.json - ไฟล์ ZIP ที่สร้างขึ้นใหม่จะ ไม่ถูกทำ quarantine เนื่องจากบริการไม่ได้อยู่ใน sandbox
- Apple แพตช์ก่อนการปล่อย macOS Sonoma 14.0 โดยให้ตรวจสอบ entitlement
com.apple.audioanalytics.helper.serviceของ XPC client ที่เชื่อมต่อเข้ามา - ใน macOS รุ่นล่าสุด private
AudioAnalyticsInternal.frameworkและบริการ XPC ที่เกี่ยวข้องถูกลบออกทั้งหมดแล้ว
CVE-2023-27944: TrialArchivingService
- บริการที่มีช่องโหว่คือ
/System/Library/PrivateFrameworks/TrialServer.framework/XPCServices/TrialArchivingService.xpc - บริการนี้เข้าสู่ Service Sandbox ด้วยโปรไฟล์
/System/Library/Sandbox/Profiles/com.apple.trial.TrialArchivingService.sb - เนื่องจากเป็น Service Sandbox ไฟล์ที่ถูกดรอปจึงไม่ถูกทำ quarantine
- บริการยอมรับ XPC client ที่เชื่อมต่อเข้ามาทั้งหมด
- เมธอด
extractArchiveFromHandle:withArchiveName:toDirectory:destDirExtension:postExtractionCompression:completion:จะแตกไฟล์ archive ที่แอป sandbox ส่งมาไปยังตำแหน่งที่ระบุ - quarantine extended attribute ไม่ถูกส่งต่อไปยังคอนเทนต์ที่ถูกแตกออกมา จึงอาจนำไปสู่การดรอปไฟล์โดยไม่มี quarantine
-
เงื่อนไขการใช้ประโยชน์และการเลี่ยงผ่าน
- หากใช้ประโยชน์จากเมธอดนี้ ไฟล์ Mach-O ภายใน archive จะสูญเสียสิทธิ์ execute หลังแตกไฟล์ จึงไม่สามารถรันได้ทันที
- วิธีใช้ symlink แบบเดียวกับเทคนิคของ CVE-2021-30990 อาจเป็นแนวทางเลี่ยงผ่านได้
- อย่างไรก็ตาม เมธอด XPC นี้จะแตกออกมาเฉพาะไดเรกทอรีและไฟล์ปกติเท่านั้น และไม่อนุญาตให้แตก symlink จาก archive
- วิธีเลี่ยงผ่านวิธีหนึ่งคือแตกแอป payload ไปยัง พาธคอนเทนเนอร์ของแอป sandbox
- แอป sandbox มีสิทธิ์อ่าน·เขียนในพาธดังกล่าว จึงสามารถสร้าง symlink โดยตรงหรือให้สิทธิ์ execute ด้วย
chmodได้ - อีกวิธีหนึ่งคือ archive แอป payload ซ้อนสองชั้น
- แตก ZIP ชั้นนอกด้วยเมธอด XPC ที่มีช่องโหว่
- แตก ZIP ชั้นในด้วยคำสั่งระบบ
open
-
แพตช์
- Apple แพตช์ใน macOS Ventura 13.3 โดยให้ตรวจสอบ entitlement
com.apple.TrialArchivingService.internalของ XPC client ที่เชื่อมต่อเข้ามา - หากไม่มี entitlement ดังกล่าว จะปฏิเสธการเชื่อมต่อ XPC
- Apple แพตช์ใน macOS Ventura 13.3 โดยให้ตรวจสอบ entitlement
CVE-2023-32414: ArchiveService
- บริการที่มีช่องโหว่คือ
/System/Library/PrivateFrameworks/DesktopServicesPriv.framework/XPCServices/ArchiveService.xpc - บริการนี้เข้าสู่ Service Sandbox แต่ไฟล์ที่ถูกดรอป ไม่ถูกทำ quarantine
- บริการยอมรับ XPC client ทั้งหมด
- เมธอด
unarchiveItemWithURLWrapper:…จะแตกไฟล์รายการที่แอป sandbox ส่งมาไปยังตำแหน่งที่ระบุ - เนื่องจากไม่ส่งต่อ quarantine extended attribute ไปยังคอนเทนต์ที่ถูกแตกออกมา แอป sandbox จึงสามารถดรอปไฟล์ตามอำเภอใจที่ไม่มี quarantine ได้
- XPC client ถูกอิมพลีเมนต์ไว้แล้วในคลาส Objective-C
DSArchiveServiceของDesktopServicesPriv.framework -
แพตช์
- Apple แพตช์ใน macOS Ventura 13.4 โดยให้ตรวจสอบ entitlement
com.apple.private.ArchiveService.XPCของ XPC client ที่เชื่อมต่อเข้ามา - หากไม่มี entitlement ดังกล่าว จะปฏิเสธการเชื่อมต่อ XPC
- Apple แพตช์ใน macOS Ventura 13.4 โดยให้ตรวจสอบ entitlement
CVE-2023-32404: ShortcutsFileAccessHelper
- บริการที่มีช่องโหว่คือ
/System/Library/PrivateFrameworks/WorkflowKit.framework/XPCServices/ShortcutsFileAccessHelper.xpc - บริการนี้สามารถรันได้โดยไม่มีข้อจำกัด sandbox จึงถูกใช้ในการหลุดออกจาก App Sandbox ได้
- code signing ยังมี TCC entitlement พิเศษสำหรับ Full Disk Access รวมอยู่ด้วย
- ดังนั้นช่องโหว่นี้จึงสามารถใช้เพื่อเลี่ยงการป้องกันของ TCC ได้ทั้งหมดด้วย
- บริการยอมรับ XPC client ทั้งหมด
- เมธอดเดียวของ
WFFileAccessHelperProtocolคือextendAccessToURL:completion:ถูกออกแบบมาเพื่อมอบสิทธิ์อ่าน·เขียน URL ตามอำเภอใจให้กับ XPC client- ภายในจะเรียก API
sandbox_extension_issue_fileเพื่อออกโทเค็นการเข้าถึงไฟล์ - URL ตามอำเภอใจถูกระบุโดย sandbox XPC client
- ภายในจะเรียก API
-
แพตช์
- Apple แพตช์ใน macOS Ventura 13.4 โดยให้ตรวจสอบ entitlement
com.apple.shortcuts.file-access-helperของ XPC client ที่เชื่อมต่อเข้ามา - หากไม่มี entitlement ดังกล่าว จะปฏิเสธการเชื่อมต่อ XPC
- Apple แพตช์ใน macOS Ventura 13.4 โดยให้ตรวจสอบ entitlement
CVE-2023-41077: mscamerad-xpc และการเลี่ยงแพตช์ซ้ำ
- บริการที่มีช่องโหว่คือ
/System/Library/Frameworks/ImageCaptureCore.framework/XPCServices/mscamerad-xpc.xpc - บริการนี้สามารถรันได้โดยไม่มีข้อจำกัดของ sandbox จึงถูกใช้เพื่อหลุดออกจาก App Sandbox ได้
- ใน code signing มี TCC entitlement พิเศษที่อนุญาตให้เข้าถึง Photos และ Removable Volumes ได้โดยไม่ต้องมี prompt จากผู้ใช้
- ดังนั้นจึงสามารถเลี่ยงการป้องกันของ TCC เหล่านี้ไปพร้อมกันได้
-
ลำดับการทำงานที่มีช่องโหว่
- ชื่อบริการพื้นฐานคือ
com.apple.mscamerad-xpc - บริการนี้ยอมรับ XPC client ทุกตัว
openDevice:withReply:ของICXPCDeviceManagerProtocolจะเปิดและตั้งค่าMSCameraDeviceใหม่- ระหว่างการเริ่มต้นอุปกรณ์ใหม่ จะมีการเปิดบริการ XPC แบบไม่ระบุชื่ออีกตัวเพื่อให้บริการ routine สำหรับอุปกรณ์กล้อง
- บริการ XPC แบบไม่ระบุชื่อนั้นก็ยอมรับ XPC client ทุกตัวเช่นกัน
- เมธอด
requestReadDataFromObjectHandle:options:withReply:ของICCameraDeviceProtocolจะอ่านเนื้อหาของรายการไฟล์ที่ร้องขอ แล้วส่งกลับไปยัง XPC client - XPC client สามารถควบคุมพาธของไฟล์ที่ร้องขอได้ ทำให้แอปที่อยู่ใน sandbox สามารถอ่านไฟล์ใดๆ นอกคอนเทนเนอร์ได้
- เนื่องจากบริการมี TCC entitlement ที่ทรงพลัง จึงสามารถอ่าน Photos ของผู้ใช้ได้โดยไม่มี prompt จากผู้ใช้
- ชื่อบริการพื้นฐานคือ
-
การสร้างอุปกรณ์กล้องปลอม
MSCameraDeviceสามารถจำลองได้ด้วยการสร้างและเมานต์ไฟล์ DMG- หากพาธไฟล์ภายในวอลุ่ม DMG ตรงกับ regular expression ที่กำหนด รายการไฟล์นั้นจะถูกทำดัชนีเป็น
ICCameraFile - ตัวอย่างชื่อโฟลเดอร์:
123abcde,DCIM,dcIm - ตัวอย่างชื่อไฟล์:
abcd1234.mp3,1234E5678.HEIC - แอปที่อยู่ใน sandbox สามารถทริกเกอร์ปัญหาได้โดยวางไฟล์ DMG แล้วเปิดเพื่อเมานต์
- XPC client ถูก implement ไว้แล้วในเฟรมเวิร์ก
ImageCaptureCore
-
แพตช์และการเลี่ยง
- Apple เพิ่มการตรวจสอบใหม่ใน
acceptConnection:บน macOS Sonoma 14 - หาก client มี private entitlement
com.apple.private.imagecapturecore.authorization_bypassจะอนุญาต - หรือหาก client เป็น platform binary ก็จะอนุญาต
- เงื่อนไข platform binary สามารถเลี่ยงได้ เพราะสามารถ inject dynamic library เข้าไปในไบนารีที่เซ็นโดย Apple ได้
- เลือกไบนารีที่เซ็นโดย Apple แต่ไม่มี entitlement คือ
/bin/ls - inject dylib ที่มีโค้ด exploit เดิมด้วย environment variable
DYLD_INSERT_LIBRARIES - จากนั้นสื่อสารกับ XPC service เหมือนเดิม
- เลือกไบนารีที่เซ็นโดย Apple แต่ไม่มี entitlement คือ
- Apple กำหนด CVE-2024-23253 ให้กับรายงานการเลี่ยงนี้
- ใน macOS 14.4 เงื่อนไขที่สองถูกเพิ่มความเข้มงวด โดย XPC client ไม่เพียงต้องเป็น platform binary เท่านั้น แต่ยังต้องถูกเซ็นด้วย flag
CS_REQUIRE_LVหรือCS_FORCED_LVด้วย - แพตช์นี้ก็ยังสามารถเลี่ยงได้
- inject dylib เข้าไปใน
/bin/ls - ตั้งค่า flag ที่ต้องการด้วยตนเองที่ runtime ผ่าน API
csops - จากนั้นผ่านการตรวจสอบของ XPC service
- inject dylib เข้าไปใน
- Apple กำหนด CVE-2024-40831 ให้กับการเลี่ยงครั้งที่สองนี้
- ใน macOS Sequoia 15 มีการแพตช์อีกครั้งให้อนุญาตเฉพาะ XPC client ที่มี private entitlement
com.apple.private.imagecapturecore.authorization_bypassเท่านั้น
- Apple เพิ่มการตรวจสอบใหม่ใน
CVE-2023-42961: intents_helper
- ช่องโหว่นี้สามารถถูกใช้โจมตีได้บน iOS ด้วย
- บริการที่มีช่องโหว่คือ
/System/Library/Frameworks/Intents.framework/XPCServices/intents_helper.xpc - บริการนี้สามารถรันได้โดยไม่มีข้อจำกัดของ sandbox และยอมรับ XPC client ทุกตัว
- เนื่องจาก path traversal (การไล่พาธ) ในฟังก์ชัน
filePathForImageWithFileNameจึงสามารถเข้าถึงพาธใดๆ ได้ - พารามิเตอร์
fileNameเป็นสตริงใดๆ ที่ XPC client สามารถควบคุมได้ -
เมธอดที่ได้รับผลกระทบ
- ฟังก์ชันที่มีช่องโหว่สามารถเข้าถึงได้จาก XPC method สองตัว
retrieveImageWithIdentifier:completion:สามารถถูกใช้เพื่ออ่านไฟล์ใดๆ ที่มีนามสกุล.png- ข้อมูลที่อ่านได้จะถูกเก็บในตัวแปรสมาชิกของอินสแตนซ์
INImageแล้วส่งกลับไปยัง XPC client purgeImageWithIdentifier:completion:สามารถถูกใช้เพื่อลบพาธไฟล์ใดๆ ได้
-
แพตช์
- Apple แพตช์ใน macOS Sonoma 14.0 โดยทำ normalization กับสตริงอินพุตจาก XPC client
- ตัดอักขระพิเศษที่ใช้ใน path traversal ออก
CVE-2024-27864: diskimagescontroller
- รายการ CVE นี้ยังรอการเปิดเผยต่อสาธารณะในขณะที่เขียนบทความ
- บริการที่มีช่องโหว่คือ
/System/Library/PrivateFrameworks/DiskImages2.framework/XPCServices/diskimagescontroller.xpc - บริการนี้มี entitlement
com.apple.diskimages.creator-ucใน code signing จึงสามารถทำงานที่มีอำนาจสูงได้ - ความสามารถหลักของ entitlement นี้มีสองอย่าง
- สื่อสารกับ
/usr/libexec/diskimagesiodซึ่งมี FDA entitlement และทำงาน attach จริง - เชื่อมต่อกับ IOKit service
AppleDiskImagesControllerเพื่อสร้างอุปกรณ์สำหรับไฟล์ DMG และจัดการ quarantine
- สื่อสารกับ
-
สาเหตุของช่องโหว่
- บริการนี้ยอมรับ XPC client ทุกตัว
- เมธอด
attachWithParams:reply:ของDIControllerProtocolเป็นจุดโจมตี - ภายในมีการเรียก
checkAttachEntitlementWithErrorแต่ฟังก์ชันนี้กลับคืนค่า TRUE เสมอ ต่างจากชื่อของมัน - ใน
DiskImages2.frameworkมี XPC client ที่ implement ไว้แล้วด้วยคลาส Objective-CDIAttachParams - โค้ด client ของเฟรมเวิร์กตรวจสอบว่า URL อินพุตอยู่ในสถานะ quarantine หรือไม่
- หาก URL อินพุตอยู่ในสถานะ quarantine จะตั้งค่าพารามิเตอร์ quarantine ก่อน attach และพารามิเตอร์นี้จะแจ้งให้ XPC service ทำ quarantine กับอุปกรณ์เป้าหมาย
- หากสร้าง XPC client เอง จะสามารถข้ามการตั้งค่าพารามิเตอร์ quarantine และเรียก
attachWithParams:reply:ได้โดยตรง - ผลคือสามารถ attach ไฟล์ DMG ที่ถูก quarantine โดยไม่ทำ quarantine กับอุปกรณ์ที่สอดคล้องกันได้
-
แพตช์
- Apple ย้ายตรรกะการตรวจสอบจาก ฝั่ง client ไปยังฝั่ง server ใน macOS Sonoma 14.4
- หากพาธไฟล์อินพุตอยู่ในสถานะ quarantine ฝั่ง server จะทำ quarantine กับอุปกรณ์ที่สอดคล้องกันโดยตรง
CVE-2023-42977: PerfPowerServicesSignpostReader
- บริการที่มีช่องโหว่คือ
/System/Library/PrivateFrameworks/PowerlogCore.framework/XPCServices/PerfPowerServicesSignpostReader.xpc - บริการนี้สามารถรันได้โดยไม่มีข้อจำกัดของ sandbox และยอมรับไคลเอนต์ XPC ทั้งหมด
XPCSignpostReaderProtocolมี 6 เมธอด แต่ Apple implement ไว้เพียงเมธอดเดียวคือsubmitSignpostDataWithConfig:withReply:ส่วนอีก 5 เมธอดเป็น implementation ว่าง- ลอจิกหลักของเมธอดนี้คือรวบรวมข้อมูลล็อกแล้ว archive เป็นไฟล์ gzip
- เคยสามารถ hijack พาธ
powerlogไปยังพาธใดก็ได้ด้วยสตริงtagUUIDที่ไคลเอนต์ XPC ควบคุม -
การลบพาธใดก็ได้
- ภายในฟังก์ชันมีการเรียก
archiveDirectoryAt:deleteOriginal:เพื่อลบพาธpowerlog - หากใส่สตริง path traversal ใน
TagUUIDก็จะได้ primitive สำหรับลบพาธใดก็ได้
- ภายในฟังก์ชันมีการเรียก
-
การสร้างไดเรกทอรีใดก็ได้และการหลุดออกจาก sandbox อย่างสมบูรณ์
- ฟังก์ชัน
createSignpostFile:สร้างไดเรกทอรีในพาธpowerlog - ด้วยวิธีนี้จึงสามารถสร้าง ไดเรกทอรีใดก็ได้ที่ไม่มี extended attribute quarantine
- primitive สำหรับสร้างไดเรกทอรีใดก็ได้ที่ไม่มี quarantine อาจนำไปสู่การหลุดออกจาก sandbox อย่างสมบูรณ์
- ในบทความใช้เทคนิคของ CVE-2023-32364
- สร้างโฟลเดอร์
.appที่ไม่มี quarantine - สร้าง symlink ไปยัง
/bin/bashใต้Contents/MacOS - ตั้งค่า
BASH_ENVในLSEnvironment - รันด้วย
open ./poc.app
- สร้างโฟลเดอร์
- ฟังก์ชัน
-
แพตช์
- Apple แพตช์ใน macOS Sonoma 14.0 ให้ normalize สตริง UUID ของไคลเอนต์ XPC
- จัดการให้ฟังก์ชันออกทันทีหากสตริงอินพุตไม่ใช่ UUID ที่ถูกต้อง
รูปแบบที่เกิดซ้ำ
- attack surface หลักไม่ใช่บริการ XPC ใน System หรือ User domain แต่เป็น บริการ XPC ใน PID domain ภายในระบบและ private framework
- บริการ XPC ที่มี Service Type เป็น Application สามารถถูกลงทะเบียนใน PID domain ของแอป sandbox ได้เพียงแค่โหลด framework
- บริการที่มีช่องโหว่จำนวนมากไม่ได้คาดว่าจะมีการเรียกจากไคลเอนต์ sandbox จึงละเว้นการตรวจสอบต่อไปนี้
- การตรวจสอบ entitlement ของไคลเอนต์ XPC
- การตรวจสอบว่าเป็นไคลเอนต์ sandbox หรือไม่
- การ normalize พาธอินพุต
- การตรวจสอบสถานะ quarantine ฝั่งเซิร์ฟเวอร์
- เงื่อนไขที่ถูกนำไปใช้ซ้ำในการโจมตีมีดังนี้
- การวางไฟล์หรือโฟลเดอร์ที่ไม่มี quarantine อาจนำไปสู่การหลุดออกจาก sandbox อย่างสมบูรณ์
- หาก extended attribute quarantine หายไประหว่างการแตกไฟล์บีบอัด อาจนำไปสู่การ bypass Gatekeeper และการหลุดออกจาก sandbox
- ไฟล์ที่ Service Sandbox สร้างขึ้นโดยค่าเริ่มต้นจะไม่ถูก quarantine
- ยังมีรายงานที่รอแพตช์อยู่อีก 5 รายการ
ความเห็นเพิ่มเติมเกี่ยวกับ App Sandbox และ Service Sandbox
- สำหรับรายงานหนึ่ง Apple ตัดสินว่าเป็น expected behavior เนื่องจากแอปพลิเคชันที่เพิ่งรันไม่ได้อยู่ในบริบทของโปรเซสปัจจุบัน และไม่สามารถแชร์ entitlement หรือสิทธิ์ของโปรเซสปัจจุบันได้
- ใน App Sandbox ไฟล์ที่ถูก drop จะถูก quarantine โดยค่าเริ่มต้น
- ใน Service Sandbox ไฟล์ที่ถูก drop จะไม่ถูก quarantine โดยค่าเริ่มต้น
- สรุปว่า ประเด็นที่โปรเซสที่เพิ่งรันไม่ได้อยู่ในบริบทการรันของบริการปัจจุบัน จึงไม่แชร์ entitlement หรือ privilege ของบริการนั้น ไม่ถือเป็น flaw โดยตัวมันเอง
- ในทางกลับกัน การที่ผู้โจมตีได้ RCE ในบริบทของบริการที่ถูกจำกัดด้วย sandbox แล้ว drop และรันแอปใหม่ที่ไม่อยู่ใน sandbox เพื่อหลุดออกจากข้อจำกัด sandbox ของบริการเป้าหมายได้นั้น อาจถือเป็น flaw
- มีการกล่าวถึง IMTranscoderAgent ซึ่งเคยเป็นเป้าหมายของ 0-click exploit ของ NSO Group เป็นตัวอย่าง
com.apple.WebDriver.HTTPService.xpcถูกยกเป็นตัวอย่างของการเรียก APIWBSEnableSandboxStyleFileQuarantineแบบ manual- สรุปว่าการหลุดจาก App Sandbox ไปยัง Service Sandbox บน macOS แทบจะเท่ากับการไปสู่สถานะ Non Sandbox
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
การรับมือด้วยการแพตช์ บริการ XPC ทีละตัวตรงนี้ดูแปลกอยู่หน่อย
มันดูเหมือนเป็นปัญหาการออกแบบของตัวแซนด์บ็อกซ์เอง และก็น่าสงสัยว่าทำไมบริการ XPC ที่ดูเหมือนใช้ภายในแอปถึงถูกเข้าถึงจากแอปที่อยู่ในแซนด์บ็อกซ์ได้มากขนาดนี้
ฝั่ง Windows ก็มีมาตรการคล้าย ๆ กันมากมาย เช่น แซนด์บ็อกซ์ WinRT, แซนด์บ็อกซ์แอป Win32, secure kernel, การป้องกันไดรเวอร์ ฯลฯ แต่ถ้าต้องให้ไฟล์ปฏิบัติการเดียวรันข้ามหลายคอนฟิกได้ ก็ย่อมมีช่องว่างจากความเข้ากันได้ย้อนหลัง
ระบบปฏิบัติการมือถือทำได้ง่ายกว่ามาก เพราะไม่มีภาระความเข้ากันได้ย้อนหลัง และสามารถจำกัดโมเดลการรันได้อย่างเข้มงวด
MacOS ควรมีอะไรอย่างคอนเทนเนอร์ Darwin แบบอิง capability มากกว่าวิธีที่ดูเหมือนก้อน รายการบล็อก ขนาดใหญ่
https://news.ycombinator.com/item?id=37655477
ยังไม่มีโมเดลความปลอดภัยที่ทำงานได้ดีบนเดสก์ท็อป
อย่างที่คอมเมนต์อื่นว่า iOS ไม่มีเศษซากเก่า ๆ จึงสามารถให้โมเดลความปลอดภัยที่สมเหตุสมผลได้
ในทางกลับกัน ถ้า Telegram ขอแชร์รายชื่อติดต่อและรูปภาพทั้งหมด ผู้คนก็ยอมอนุญาตจริง ๆ
เป็นงานที่ดี
แต่ก็สงสัยว่าสถาปัตยกรรมแบบนี้เป็นทิศทางที่ถูกต้องหรือไม่ ทุกครั้งที่สร้างเฟรมเวิร์กความปลอดภัยขึ้นมาเพื่อกันการโจมตีบางอย่าง ก็ดูเหมือนจะมีปัญหาชนิดใหม่โผล่ขึ้นมา และสุดท้ายก็ไม่ได้รู้สึกว่าปลอดภัยขึ้นจริง
มันเป็นโครงสร้างแบบกฎหมายภาษีเนเธอร์แลนด์ ที่มีแพตช์เพื่อกันการเอาไปใช้ในทางที่ผิดสะสมทับกันไปเรื่อย ๆ และอาจมีสติรู้ตัวขึ้นมาแล้วก็ได้
วิธีที่ถูกต้องมักล้มเหลวในตลาดเพราะความเข้ากันได้ย้อนหลัง หรือเพราะนักพัฒนาไม่ยอมรับฟีเจอร์ไปใช้ แซนด์บ็อกซ์ WinRT เป็นตัวอย่างแบบนั้น
ความปลอดภัยบนโทรศัพท์ทำได้ง่ายกว่า เพราะไม่ต้องกังวลเรื่องความเข้ากันได้ย้อนหลัง และจนถึงตอนนี้นักพัฒนาที่อยากเข้าร่วมก็จำเป็นต้องทำตามเพราะการคัดกรองของ App Store
ระบบปฏิบัติการทั้งหมดที่ใช้งานอยู่ในปัจจุบัน หากต้องการให้ปลอดภัยไปจนถึงศตวรรษหน้า ก็ต้องสร้างใหม่ตั้งแต่ต้น และต้องทิ้งโค้ดจำนวนมากระหว่างทาง นั่นคือราคาที่ต้องจ่าย
อาจคาดเดาได้ว่ามีแรงผลักดันที่เข้มแข็งบางกลุ่มที่อยากยัดช่องโหว่เข้าไปในคอมพิวติ้งสำหรับผู้บริโภคให้มากขึ้น
ตัวอย่างที่โด่งดังแต่ละกรณีมีดังนี้
https://en.wikipedia.org/wiki/Dutch_Sandwich
https://en.wikipedia.org/wiki/Intel_Management_Engine#Assert...
MacOS หรือก็คือ NeXTstep ถูกสร้างมาตั้งแต่แรกให้เป็น ระบบปฏิบัติการที่เปิดกว้างและขยายได้สูงมาก
มีวิธีเพิ่มส่วนขยายหรือ hook ของบุคคลที่สามมากจนนับไม่ถ้วน และซอฟต์แวร์สามารถถูกเข้าถึงได้จากหลาย runtime ดังนั้นในยุคนั้น การที่ทั้งหมดนี้ทำงานร่วมกันได้อย่างราบรื่นจึงเป็นความสำเร็จทางเทคนิคที่น่าประทับใจ
Java, Mac แบบคลาสสิก, X11 และฐานโค้ด NeXTstep รันร่วมกันได้อย่างไม่มีปัญหาเพราะจุดเข้าของส่วนขยายหลายจุดในเคอร์เนล
นอกจากนี้แพลตฟอร์มยังมี API ที่ช่วยให้แอปสื่อสารกันได้โดยไม่มีปัญหา
แต่ Apple ค่อย ๆ ถอยออกจากปรัชญานั้น และปิดระบบลงเรื่อย ๆ เป็นเส้นทางที่น่าสนใจทีเดียว
SBPL (sandbox profile language) น่าสนใจ รายละเอียดเพิ่มเติมอยู่ที่นี่: https://github.com/0xbf00/simbple
สงสัยว่ามี Scheme interpreter อยู่ที่ไหนสักแห่งใน macOS เพื่อจัดการสิ่งนี้หรือเปล่า
ป.ล. ดูเหมือนว่า
sandbox-execจะเป็นตัวที่ทำงานนี้ ดูเพิ่มเติม: https://reverse.put.as/wp-content/uploads/2011/09/Apple-Sand...เป็นการค้นพบที่น่าประทับใจ อย่างที่บทความบอกเป็นนัย ดูมีความเป็นไปได้สูงมากว่ายังมีข้อบกพร่องคล้าย ๆ กันหลงเหลืออยู่ในโลกจริง
ถ้า Apple ไม่ออกแบบแนวทางการเสริมความแข็งแกร่งให้บริการเหล่านี้ใหม่ ก็คงจะมี CVE ที่เกี่ยวข้องกับ XPC ออกมาอย่างต่อเนื่อง
ทั้งชอบและเกลียดแซนด์บ็อกซ์
มันเป็น แนวป้องกันชั้นที่สอง ที่ยอดเยี่ยม แต่องค์กรใหญ่ ๆ มักปฏิเสธการแก้ช่องโหว่ remote code execution หากช่องโหว่นั้นไม่สามารถหลุดออกจากแซนด์บ็อกซ์ไปทำอะไรที่มีความหมายได้ ดังนั้นแซนด์บ็อกซ์จึงถูกใช้เหมือนแนวป้องกันหลัก ซึ่งเป็นเรื่องน่าเศร้า
เท่าที่รู้ Apple, Microsoft, Google ต่างก็มี bug bounty และให้รางวัลสูงกว่าสำหรับการหลุดแซนด์บ็อกซ์ แต่ก็ยังจ่ายรางวัลให้ช่องโหว่ที่ถูกแซนด์บ็อกซ์กันไว้
ทุกคนรู้ดีว่าผู้โจมตีจะเก็บช่องโหว่ remote code execution ที่ตอนนี้ยังใช้ไม่ได้ไว้ แล้วนำมาใช้ร่วมกันเมื่อพบวิธีหลุดแซนด์บ็อกซ์
อาจจะออกนอกประเด็นไปบ้าง แต่ถ้ามีผู้เชี่ยวชาญด้านแซนด์บ็อกซ์คนไหนรู้กลยุทธ์ในการเลี่ยงข้อจำกัด maximum "pattern serialization length" ผมปวดหัวกับประเด็นนี้มานานพอสมควรแล้ว: https://github.com/NixOS/nix/issues/4119
น่าเสียดายที่
sandbox-execแทบไม่มีเอกสารเลย และยังมีข่าวว่าจะถูกเลิกใช้ด้วย ทำให้การแก้ปัญหานี้ค่อนข้างชวนปวดหัวใน macOS มีวิธีเลี่ยงออกมาไม่รู้จบ เพราะระบบปฏิบัติการนี้ไม่ได้ถูกออกแบบมาเพื่อ สิทธิ์แบบละเอียด แบบนี้ตั้งแต่แรก
จะเอาไปแปะทีหลังบนเทคโนโลยี Mac OS รุ่นเก่าและ NeXTSTEP เฉย ๆ ไม่ได้
ถึงผมจะไม่ใช่นักวิจัยความปลอดภัย เป็นแค่นักพัฒนาแอปเก่า ๆ แต่ก็ยังเคยเจอวิธีเลี่ยงหลายอย่างด้วยตัวเอง เรียกว่ารู้ว่าศพถูกฝังไว้ตรงไหน
แต่สุดท้ายก็เลิกหาไปแล้ว ระบบรายงานช่องโหว่ด้านความปลอดภัยของ Apple เละเทะไปหมด และดูเหมือนจะสนใจแค่การปิดปากให้นานที่สุดเท่าที่ทำได้ เสียเวลาเปล่า
โดยรวมแล้ว macOS ให้ความรู้สึกเหมือนตกเป็นเหยื่อของ ละครความปลอดภัย ซอฟต์แวร์ที่ถูกทำให้อ่อนแอลงและการขอสิทธิ์ไม่รู้จบทำร้ายทั้งผู้ใช้และนักพัฒนาที่ถูกต้องตามกฎหมาย ขณะที่ผู้โจมตีจริง ๆ สามารถเลี่ยงได้ง่าย ๆ เมื่อต้องการ คล้ายกับโฆษณาล้อเลียน Windows Vista ของ Apple ในอดีต
การที่บริษัทต้องการเวลาให้มากที่สุดในการแก้บั๊กก็เป็นส่วนหนึ่งของเกมเหมือนกัน บริษัทอื่น ๆ อยากให้เปิดเผยช่องโหว่ที่พบโดยเร็วที่สุดจริงหรือ? ในเมื่อควบคุมไม่ได้ว่าผู้ใช้จะอัปเกรดเร็วแค่ไหน การชะลอการเปิดเผยจึงดีกับผู้ใช้ปลายทางเสมอ และควรสำคัญกว่าความต้องการประชาสัมพันธ์ของนักวิจัย
สถาปัตยกรรมแซนด์บ็อกซ์ของ Apple โดยปกติดูเหมือนออกแบบมาค่อนข้างดี กรณีนี้น่าจะมีปัญหาบางอย่างเกิดขึ้นที่สถาปัตยกรรมหรือการสื่อสาร
การมีวิธีเลี่ยงก็เป็นเพราะเราคาดหวังฟีเจอร์จากระบบปฏิบัติการเดสก์ท็อปมากเกินไปด้วย ระบบปฏิบัติการเดสก์ท็อปถือได้ว่าเป็นระบบปฏิบัติการที่ประณีตและซับซ้อนกว่าแพลตฟอร์มเซิร์ฟเวอร์มาก เหตุผลเดียวกันนี้ทำให้เว็บเบราว์เซอร์มี CVE จำนวนมาก เพราะเราต้องการทั้งความปลอดภัยและฟีเจอร์ จึงย่อมมีจุดกึ่งกลางที่ทั้งสองอย่างชนกันอย่างหลีกเลี่ยงไม่ได้
สิ่งที่พิสูจน์คือการที่ตลอด 20 ปีที่ผ่านมา Apple ค่อย ๆ เสริมความแข็งแกร่งให้ซอฟต์แวร์และฮาร์ดแวร์ของ macOS
สำหรับผู้ใช้ปลายทาง ส่วนใหญ่เป็นการเปลี่ยนแปลงแบบค่อยเป็นค่อยไปจนแทบไม่ทันสังเกต แต่เหล่านักพัฒนา macOS รู้ซึ้งดีถึงประเด็นด้านความปลอดภัยที่ต้องรับมือทั้งในการอัปเดตใหญ่และอัปเดตย่อย ตัวอย่างเช่น
https://eclecticlight.co/2024/08/…
https://eclecticlight.co/2024/08/…
https://eclecticlight.co/2024/08/…
https://eclecticlight.co/2024/09/…
มีระบบที่อิง capability อยู่ แต่ไม่มีตัวไหนที่ถูกใช้อย่างแพร่หลายจริง ๆ
ผมก็ไม่แน่ใจว่าทางออกคืออะไร แต่ความพยายามเพิ่มความปลอดภัยเข้าไปก็ดูดีกว่าการไม่ทำอะไรเลยจนช่องโหว่ในแอปพลิเคชันเพียงจุดเดียวกลายเป็นการยึดบัญชีผู้ใช้ทั้งหมดได้ทันที
XPC services ที่หลุดรอดในโดเมน pid เป็นวิธีที่ชาญฉลาดในการเลี่ยงข้อจำกัดแซนด์บ็อกซ์ของ macOS
ทริกฉีด
dyldเพื่อเลี่ยงการตรวจสิทธิ์ก็ดูเนียนดีแพตช์ของ Apple ในจุดนี้ให้ความรู้สึกเหมือนเป็นการแก้เฉพาะหน้า และอาจต้องปรับวิธีการทำงานของการสืบทอดแซนด์บ็อกซ์อย่างจริงจัง