วิธีป้องกัน BadUSB บน macOS ด้วย Swift และ CGEventTap
เจาะลึกวิธีบล็อก BadUSB บน macOS ในเวลาไม่ถึง 500 มิลลิวินาที ด้วยการสร้างระบบกักกันคีย์บอร์ดเสมือนจริงโดยใช้ Swift และ CGEventTap

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- สายชาร์จ OMG Cable สามารถจำลองเป็นคีย์บอร์ดและรันคำสั่งโจมตีได้ภายใน 500 มิลลิวินาที
- macOS Ventura มีระบบแจ้งเตือนการเชื่อมต่ออุปกรณ์ แต่ช้าเกินกว่าจะรับมือกับการพิมพ์อัตโนมัติ
- โซลูชันของ RoamSwitch ใช้ IOHIDManager ร่วมกับ CGEventTap เพื่อดักจับและทำลายคีย์บอร์ดปลอมทันทีในระดับผู้ใช้
- นอกจากบล็อกคีย์บอร์ดแล้ว ระบบยังมีความสามารถในการตัดการเชื่อมต่อ USB แฟลชไดรฟ์ที่ไม่ได้รับอนุญาตอัตโนมัติ
การสาธิตการโจมตีเครื่อง Mac ด้วยสายชาร์จ OMG Cable เผยให้เห็นความน่ากลัวของช่องโหว่ทางกายภาพ รูภายนอกของสายชาร์จนี้ดูเหมือนสาย USB-C มาตรฐานทุกประการ แต่วรรคตอนที่เชื่อมต่อเข้ากับแล็ปท็อป ไมโครคอนโทรลเลอร์ที่ซ่อนอยู่จะแสดงตัวเป็นคีย์บอร์ด USB เสมือน และส่งคำสั่งแป้นพิมพ์รวดเร็วกว่า 1,000 คำต่อนาที
กระบวนการเจาะระบบทั้งหมดเกิดขึ้นในเวลาน้อยกว่า 500 มิลลิวินาที โดยไม่มีหน้าต่างดาวน์โหลดไฟล์ให้กดดับเบิลคลิกและไม่มีการแจ้งเตือนจากเบราว์เซอร์ ผู้ใช้จะสังเกตเห็นเพียงหน้าต่าง Spotlight กระพริบชั่วพริบตา หน้าต่าง Terminal เด้งขึ้นมา และคำสั่งเพย์โหลดบรรทัดเดียวถูกรันอย่างรวดเร็วเพื่อดาวน์โหลดสคริปต์อันตรายผ่านคำสั่ง curl

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
ในระหว่างการพัฒนา RoamSwitch ยูทิลิตี้รักษาความปลอดภัยบน macOS นักพัฒนาพบว่าขอบเขตความปลอดภัยดิจิทัลมีความหมายน้อยลงทันทีหากมีผู้ประสงค์ร้ายเข้าถึงพอร์ตเชื่อมต่อทางกายภาพได้โดยตรง ด้วยเหตุนี้จึงเป็นที่มาของการพัฒนาเกราะป้องกันคีย์บอร์ดชั่วคราวด้วยภาษา Swift เพื่อบล็อกคีย์บอร์ด BadUSB ก่อนที่ระบบปฏิบัติการ macOS จะประมวลผลทัน
แม้ว่า Apple จะเปิดตัวกล่องข้อความถามยืนยันการเชื่อมต่ออุปกรณ์ใน macOS Ventura แต่กลไกดังกล่าวเผชิญกับอุปสรรคสำคัญสองประการ ระบบปฏิบัติการมองว่าทุกแป้นพิมพ์ที่เชื่อมต่อคือเจตนาอันบริสุทธิ์ของผู้ใช้ และหากต้องรอให้มนุษย์อ่านและคลิกปุ่มบล็อก การโจมตีก็เสร็จสิ้นไปนานแล้ว
"Before your brain even registers that a device was plugged in, you see Spotlight flicker for a fraction of a second, Terminal pops up, and a one-line payload is executed."
แนวทางแก้ไขที่ได้ผลคือระบบกักกันแบบ Fail-closed เมื่อมีการเชื่อมต่อคีย์บอร์ด USB ใหม่ ตัว IOHIDManager Callback จะตรวจจับอุปกรณ์ที่ไม่ได้รับอนุญาต ตั้งค่าสถานะการบล็อกเป็นใช้งานอยู่ และใช้ CGEventTap Callback เพื่อคืนค่าเป็น nil สำหรับเหตุการณ์กดแป้นพิมพ์ทั้งหมดในทันที
บริบทเพิ่มเติม: การใช้ DriverKit System Extension ของ Apple เป็นแนวทางที่เป็นทางการสำหรับการรักษาความปลอดภัย USB แต่สำหรับนักพัฒนาอิสระหรือโปรเจกต์ขนาดเล็ก การทำเช่นนั้นสร้างความยุ่งยากสูงมาก การใช้การผสมผสานระหว่าง IOHIDManager และ CGEventTap ในพื้นที่ผู้ใช้ (User Space) จึงเป็นทางเลือกที่ชาญฉลาดและยืดหยุ่นกว่า โดยไม่ต้องรีสตาร์ทเครื่องและไม่ต้องขอสิทธิ์พิเศษระดับเคอร์เนล
นอกจากปัญหาคีย์บอร์ดปลอมแล้ว การป้องกันพอร์ตทางกายภาพยังต้องครอบคลุมถึงการเสียบแฟลชไดรฟ์ USB โดยไม่ได้รับอนุญาต RoamSwitch จึงได้เพิ่มระบบตรวจสอบการเชื่อมต่อไดรฟ์ผ่าน NSWorkspace เพื่อถอดการเชื่อมต่อและอีเจ็ทหน่วยความจำภายนอกที่ไม่มีรายชื่อใน UUID ที่เชื่อถือได้ทันที ก่อนที่ macOS จะทำการจัดทำดัชนีข้อมูล
ท้ายที่สุด การใช้ปรัชญา Zero-Trust กับฮาร์ดแวร์ภายนอกที่เชื่อมต่อเข้ามา ถือเป็นมาตรการที่ช่วยปิดช่องโหว่ที่มักถูกมองข้าม แม้ทีมวิศวกรจะทุ่มเทแรงกายแรงใจในการป้องกันเครือข่ายอย่างแน่นหนา แต่พอร์ต USB ยังคงเป็นทางด่วนที่เปิดเข้าสู่เซสชันของผู้ใช้โดยตรงหากไม่มีการป้องกันที่รัดกุม
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น