ช่องโหว่การฉีดคีย์อินพุตผ่าน Bluetooth บน Android, Linux, macOS และ iOS
(github.com/skysafe)- CVE-2023-45866 เป็นช่องโหว่การข้ามการยืนยันตัวตนใน Bluetooth stack ของหลายระบบปฏิบัติการ ที่ทำให้สามารถเชื่อมต่อคีย์บอร์ดปลอมและฉีดคีย์อินพุตได้โดยไม่ต้องมีการยืนยันจากผู้ใช้
- ผู้โจมตีที่อยู่ใกล้สามารถลองทำงานอย่างการติดตั้งแอป รันคำสั่งตามอำเภอใจ และส่งข้อความได้ โดยใช้เพียง คอมพิวเตอร์ Linux และอะแดปเตอร์ Bluetooth ทั่วไป โดยไม่ต้องมีอุปกรณ์พิเศษ
- เงื่อนไขของการโจมตีแตกต่างกันไปในแต่ละแพลตฟอร์ม โดย Android ขึ้นอยู่กับการเปิดใช้งาน Bluetooth, Linux/BlueZ ขึ้นอยู่กับสถานะ discoverable/connectable และ iOS กับ macOS ได้รับผลจากการจับคู่ Magic Keyboard
- Android 11-14 บรรเทาปัญหาได้ด้วย ระดับแพตช์ความปลอดภัย 2023-12-05 แต่ Android 4.2.2-10 ไม่มีการแก้ไข และ BlueZ เคยมีการแก้ในปี 2020 ที่ถูกปิดไว้เป็นค่าเริ่มต้น
- งานที่ต้องใช้รหัสผ่านหรือการยืนยันตัวตนด้วยชีวมิติไม่สามารถทำได้ด้วยการฉีดคีย์อินพุตเพียงอย่างเดียว แต่เครื่องที่ยังไม่ได้แพตช์อาจเปิดช่องให้ถูกโจมตีผ่าน Bluetooth ในระยะใกล้
การฉีดคีย์อินพุตผ่าน Bluetooth โดยไม่ต้องยืนยันตัวตน
- CVE-2023-45866 เป็นช่องโหว่ที่เปิดให้เกิดการฉีดคีย์สโตรกผ่าน Bluetooth โดยไม่ต้องยืนยันตัวตนบน Android, Linux, macOS และ iOS
- ใน Bluetooth stack หลายตัว มีการ ข้ามการยืนยันตัวตน ที่ทำให้ผู้โจมตีเชื่อมต่อกับโฮสต์ที่อยู่ในสถานะ discoverable และฉีดคีย์อินพุตได้โดยไม่ต้องมีการยืนยันจากผู้ใช้
- ผู้โจมตีที่อยู่ใกล้สามารถสร้างการเชื่อมต่อ Bluetooth ที่ไม่ได้รับการยืนยันกับอุปกรณ์ที่มีช่องโหว่ และใช้คีย์อินพุตเพื่อทำสิ่งต่อไปนี้ได้
- ติดตั้งแอป
- รันคำสั่งตามอำเภอใจ
- ส่งข้อความ
- การโจมตีไม่ต้องใช้อุปกรณ์ฮาร์ดแวร์พิเศษ และสามารถทำได้ด้วยคอมพิวเตอร์ Linux และ อะแดปเตอร์ Bluetooth ทั่วไป
- รายละเอียด exploit ทั้งหมดและสคริปต์ PoC มีกำหนดเปิดเผยในช่วงสัปดาห์ของ ShmooCon วันที่ 12-14 มกราคม
เงื่อนไขการโจมตีแยกตามแพลตฟอร์ม
- ช่องโหว่นี้ทำงานโดยหลอก Bluetooth host state machine ให้จับคู่กับ คีย์บอร์ดปลอม โดยไม่ต้องมีการยืนยันจากผู้ใช้
- กลไกการจับคู่แบบไม่ต้องยืนยันตัวตนที่เป็นรากฐานนั้นมีอยู่ในข้อกำหนดของ Bluetooth และบั๊กในแต่ละ implementation ทำให้มันกลายเป็นพื้นผิวการโจมตี
- เงื่อนไขที่ต้องมีบนอุปกรณ์ที่ยังไม่ได้แพตช์แตกต่างกันไปตามระบบปฏิบัติการ
- Android: มีช่องโหว่ถ้าเปิด Bluetooth อยู่
- Linux/BlueZ: Bluetooth ต้องอยู่ในสถานะ discoverable/connectable
- iOS และ macOS: Bluetooth ต้องเปิดอยู่ และมีการจับคู่ Magic Keyboard กับโทรศัพท์หรือคอมพิวเตอร์ไว้
- หลังจากผู้โจมตีจับคู่กับโทรศัพท์หรือคอมพิวเตอร์เป้าหมายแล้ว ก็สามารถฉีดคีย์อินพุตด้วยสิทธิ์ของเหยื่อได้
- การกระทำที่ต้องใช้รหัสผ่านหรือการยืนยันตัวตนด้วยชีวมิติไม่สามารถทำได้ด้วยการฉีดคีย์อินพุตเพียงอย่างเดียว
ช่องโหว่เก่าที่ถูกเปิดเผยหลังยุค MouseJack
- งานวิจัย MouseJack ที่เปิดเผยในปี 2016 มุ่งเป้าไปที่โปรโตคอลไร้สายแบบกำหนดเองของอุปกรณ์ต่อพ่วง ไม่ใช่ Bluetooth
- งานวิจัยครั้งนี้เริ่มต้นจากการตรวจสอบ Bluetooth และสภาพแวดล้อมของ Apple โดยใช้ Apple Magic Keyboard เป็นเป้าหมาย
- พบการฉีดคีย์สโตรกผ่าน Bluetooth โดยไม่ต้องยืนยันตัวตนบน macOS และ iOS และทั้งสองแพลตฟอร์มยังถูกโจมตีได้แม้อยู่ใน Lockdown Mode
- ต่อมาพบช่องโหว่ลักษณะคล้ายกันใน Linux และ Android ด้วย ทำให้ดูเหมือนเป็นข้อบกพร่องระดับโปรโตคอลมากกว่าบั๊ก implementation แบบง่าย ๆ และเมื่อตรวจสอบข้อกำหนด Bluetooth HID ก็พบว่าเป็นทั้งสองอย่าง
- ช่องโหว่บางส่วนเก่ากว่า MouseJack และสามารถทำซ้ำการฉีดคีย์สโตรกได้ย้อนไปถึง Android 4.2.2
ผลกระทบต่อ Android และสถานะแพตช์
- อุปกรณ์และเวอร์ชัน Android ที่ทดสอบแล้วพบว่ามีช่องโหว่มีดังนี้
- Pixel 7, Android 14
- Pixel 6, Android 13
- Pixel 4a (5G), Android 13
- Pixel 2, Android 11
- Pixel 2, Android 10
- Nexus 5, Android 6.0.1
- BLU DASH 3.5, Android 4.2.2
- ระดับแพตช์ความปลอดภัย 2023-12-05 ช่วยบรรเทาช่องโหว่ใน Android 11-14
- Android 4.2.2-10 ไม่มีการแก้ไขที่ใช้งานได้
- กำหนดการเปิดเผยมีดังนี้
- 2023-08-05: รายงานช่องโหว่ต่อ Google
- 2023-12-06: เปิดเผยสู่สาธารณะ
- Google ระบุว่าได้ส่งมอบการแก้ไขปัญหาที่กระทบ Android 11-14 ให้กับ OEM ที่ได้รับผลกระทบแล้ว และอุปกรณ์ Pixel ที่ยังอยู่ในการสนับสนุนทั้งหมดจะได้รับการแก้ไขผ่านอัปเดต OTA เดือนธันวาคม
ผลกระทบต่อ Linux/BlueZ และแพตช์
- เวอร์ชัน Ubuntu ที่ทดสอบแล้วพบว่ามีช่องโหว่คือ 18.04, 20.04, 22.04, 23.10
- ตามข้อมูลจาก Google, ChromeOS ไม่ได้รับผลกระทบ และแม้จะไม่ได้ทดสอบโดยตรง แต่ดูเหมือนว่าการตั้งค่า BlueZ ช่วยบรรเทาช่องโหว่นี้ได้
- ช่องโหว่บน Linux ถูกแก้ไปแล้วในปี 2020 ภายใต้ CVE-2020-0556 แต่การแก้ไขนั้นถูกปิดไว้เป็นค่าเริ่มต้น
- ChromeOS เป็น Linux-based OS เพียงรายเดียวที่ทราบว่าได้เปิดใช้การแก้นี้
- แพตช์ BlueZ สำหรับ CVE-2023-45866 เปิดใช้การแก้ไขจากปี 2020 เป็นค่าเริ่มต้น
- แพตช์ BlueZ ที่เกี่ยวข้อง:
- ข้อมูลที่เกี่ยวข้องกับ Ubuntu:
- ข้อมูลที่เกี่ยวข้องกับ Debian:
- ข้อมูลที่เกี่ยวข้องกับ Fedora:
- กำหนดการเปิดเผยมีดังนี้
- 2023-08-10: รายงานช่องโหว่ต่อ Canonical
- 2023-09-25: รายงานช่องโหว่ต่อ Bluetooth SIG
- 2023-10-02: เปิดเคสกับ CERT/CC
- 2023-12-06: เปิดเผยสู่สาธารณะ
ผลกระทบต่อ macOS และ iOS
- อุปกรณ์ที่ทดสอบบน macOS และพบว่ามีช่องโหว่มีดังนี้
- 2022 MacBook Pro, macOS 13.3.3, M2
- 2017 MacBook Air, macOS 12.6.7, Intel
- Lockdown Mode บน macOS ไม่สามารถป้องกันการโจมตีนี้ได้
- macOS Sonoma 14.2 แก้ไขช่องโหว่นี้แล้ว
- กำหนดการเปิดเผยสำหรับ macOS มีดังนี้
- 2023-08-01: รายงานช่องโหว่ต่อ Apple
- 2023-12-06: เปิดเผยสู่สาธารณะ
- อุปกรณ์ที่ทดสอบบน iOS และพบว่ามีช่องโหว่คือ iPhone SE ที่รัน iOS 16.6
- Lockdown Mode บน iOS ก็ไม่สามารถป้องกันการโจมตีนี้ได้เช่นกัน
- กำหนดการเปิดเผยสำหรับ iOS มีดังนี้
- 2023-08-04: รายงานช่องโหว่ต่อ Apple
- 2023-12-06: เปิดเผยสู่สาธารณะ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ผมต้องไปค้นดูอยู่บ้างเพื่อยืนยันเรื่องนี้ แต่ถ้าอยากใช้งานให้ปลอดภัย บน Android ควร ปิด Bluetooth เมื่อไม่ได้ใช้ อย่างไรก็ตาม ระหว่างที่ใช้งานอยู่ก็ยังมีช่องโหว่
Pixel ของผมได้รับอัปเดตความปลอดภัยวันที่ 2023-12-05 และปัญหานี้ได้รับการแก้ไขแล้ว แต่สำหรับอุปกรณ์ที่ไม่ใช่ Pixel ผมไม่แน่ใจ
บน Linux ให้เปิด
/etc/bluetooth/input.confแล้วตั้งค่าClassicBondedOnly=trueในกรณีของผมไม่ต้องเพิ่มใหม่ แค่เอาคอมเมนต์ออกก็พอ ในbluetoothdเวอร์ชันถัดไป ค่าเริ่มต้นจะเป็นtrueแต่ตอนนี้ก็ตั้งค่าเองได้ และหลังจากนั้นต้องรีสตาร์ตบริการ Bluetoothส่วน macOS หรือ iOS ผมไม่มีอุปกรณ์พวกนั้นเลยไม่ทราบ
Wi-Fi ก็อยู่ในสภาพเหมือนชีสพรุน ๆ เพราะปิดให้สนิทจาก Control Center ไม่ได้
trueตั้งแต่วันที่ 7 ธันวาคมแล้ว$ rpm -q --changelog bluez | grep CVE-2023-45866 -C1* Thu Dec 07 2023 Peter Robinson - 5.70-4- Add mitigation for CVE-2023-45866หลังย้ายมาจาก Android ผมพยายามอยู่พักหนึ่ง แต่สุดท้ายก็ยอมแพ้
ถ้าไม่ใช้โทรศัพท์ก็ล็อกเครื่องอย่างจริงจัง และถ้าขณะใช้งานมีการส่งคีย์อินพุตเข้ามาก็คงเห็นบนหน้าจอ ดังนั้นการเปิด Bluetooth ไว้ก็ไม่ได้ดูเลวร้ายขนาดนั้น
ถ้า GrapheneOS แก้แล้วก็คงเป็นแรงจูงใจให้ย้ายไปใช้ในที่สุด แต่โทรศัพท์ตอนนี้ยังใช้งานได้ดี เลยหาเหตุผลมารองรับการซื้อเครื่องใหม่ได้ยาก
ผมสงสัยที่ไม่มีการกล่าวถึง Windows เลย ฟังเผิน ๆ เหมือนเป็นข่าวดี แต่ต้องรู้ว่าทำไม Windows ถึงไม่ได้รับผลกระทบจริง ๆ จึงจะ ประเมินความเสี่ยง ได้
เช่น ถ้ารู้ว่าใน Bluetooth stack ของ Windows มีโครงสร้างที่เทียบได้กับ
ClassicBondedOnly=falseของ BlueZ หรือไม่ ก็จะตัดสินใจได้ว่าควรจับตาดูค่านั้นให้เป็นtrueในสภาพแวดล้อมที่ต้องการเสริมความแข็งแกร่งหรือไม่ stack ก็อาจทำงานต่างกันโดยสิ้นเชิง จนสิ่งที่ต้องพิจารณาก็ต่างออกไปทั้งหมด
ผมตั้งตารอวิดีโอที่มี PoC และเดโมเยอะ ๆ แต่ Windows มีส่วนแบ่งตลาดสูง และคงมีผู้ดูแลระบบจำนวนมากที่ตกใจ ดังนั้นถ้ามีข้อมูลก็คงดี แม้แต่ “ยังไม่ได้ลองโจมตี Windows” ก็เป็นข้อมูลที่มีประโยชน์
แต่ถ้าใช้ Flipper Zero สร้างอุปกรณ์ Bluetooth ทันทีที่ไคลเอนต์ Windows เชื่อมต่อ มันจะถูกมองว่าเป็นคีย์บอร์ดและทำให้รัน คำสั่ง PowerShell ที่ต้องการได้ ผมเองลองแค่เปิด YouTube เพื่อ RickRoll เท่านั้น ไม่ได้ลองอะไรที่ผิดกฎหมาย
ตอนนี้ผมปิด Bluetooth ทั้งหมดแล้ว แต่ไม่รู้วิธีลบ bluez โดยไม่ทำให้ Linux พัง
ClassicBondedOnly=falseของ BlueZ นี่หมายถึงClassicBondedOnly=trueหรือเปล่า?ดีจริง ๆ ที่มีข่าวแบบนี้ออกมาในตอนที่อุตสาหกรรมเอาการเชื่อมต่อเสียงแบบกายภาพออกจากโทรศัพท์ แล้วผลักดันให้ใช้ไร้สายกัน เก่งมาก
[1] https://git.kernel.org/pub/scm/bluetooth/bluez.git/commit/pr...
ช่องโหว่นี้ทำงานโดยหลอก state machine ฝั่งโฮสต์ของ Bluetooth ให้จับคู่กับคีย์บอร์ดปลอมโดยไม่ต้องมีการยืนยันจากผู้ใช้ กลไกพื้นฐานของ การจับคู่โดยไม่มีการยืนยันตัวตน ถูกกำหนดไว้ในสเปก Bluetooth และบั๊กในแต่ละ implementation ทำให้ผู้โจมตีใช้ประโยชน์ได้
แต่ทำไมถึงอยากให้จับคู่กันแบบเงียบ ๆ กันนะ ผมอยากรู้รายละเอียดเพิ่มเติมเกี่ยวกับวัตถุประสงค์ที่ตั้งใจไว้ของกลไกที่เป็นปัญหานี้
ส่วนในอุปกรณ์ที่ได้รับผลกระทบจริง ๆ ผมไม่รู้ว่าทำไมถึงปล่อยไว้แบบนั้น
ปัญหานี้ได้รับการแก้ไขแล้วใน macOS 14.2 และ iOS 17.2
https://support.apple.com/en-us/HT214036
https://support.apple.com/en-us/HT214035
บน Arch Linux แก้ไขแล้วตั้งแต่ bluez 5.70-2 [1]
[1]: https://gitlab.archlinux.org/archlinux/packaging/packages/bl...
ประโยคที่ว่า “ตอนนั้น Bluetooth ดู intimidating เลยคิดเอาเองว่าปลอดภัย” โดนใจมาก ดูเหมือนว่า มายาคติ ที่ว่า ณ จุดใดจุดหนึ่งบนสแต็กเทคโนโลยีอันซับซ้อนนั้นมีคนที่รู้จริงอยู่ และคงไม่ได้เอาไม้ค้ำปราสาทที่สร้างบนทรายไว้เฉย ๆ เกิดขึ้นจากความน่าเกรงขามแบบนั้น
ยังสงสัยอยู่ว่าจะใช้ได้จริงแค่ไหนกับโทรศัพท์หรือคอมพิวเตอร์ แต่ถ้าต้องอยู่ในฐานะที่ต้องดูแล คีออสก์ ไม่ให้ใครมาแตะต้อง ชีวิตก็คงน่าสนใจขึ้นอีกหน่อย
ถ้าฝังแบ็กดอร์ได้สำเร็จสักตัว หลังจากนั้นก็ทำงานต่อได้แล้ว
ถ้าเป็นการโจมตีแบบเจาะจงเป้าหมาย แค่ส่งการกดปุ่ม Shift ทุก 1 นาทีเพื่อไม่ให้หน้าจอล็อก แล้วค่อยไปที่หน้าเครื่องเองทีหลังเพื่อทำอะไรบางอย่าง ก็อาจเพียงพอแล้ว
sudoหรือsuที่ถูกวางยาพิษไว้ที่ไหนสักแห่ง แล้วเพิ่มเข้าไปใน$PATHUSB ก็คล้ายกัน ถ้าเสียบคีย์บอร์ดเข้ากับพอร์ต “ชาร์จอย่างเดียว” มันก็ทำงาน ผมลองเองบน Android แล้ว และโดนตำหนิว่ากรณีนี้เอาไปโจมตีจริงไม่ได้
ถึงอย่างนั้น ผมก็ไม่มองว่านี่เป็นช่องโหว่ มันเป็นแค่ฟีเจอร์ที่มีประโยชน์ ปัญหาตรงนี้คือมีใครบางคนสามารถทำสิ่งนี้ได้โดยที่ผู้ใช้ไม่ทันรู้ตัว แม้ระหว่างทำงานที่อ่อนไหวอยู่ก็ตาม
โปรเจกต์เจ๋ง ๆ ที่โพสต์เมื่อวาน https://mitxela.com/projects/smsc ก็ใช้งานกับโทรศัพท์ด้วยวิธีแบบนี้ได้เช่นกัน
ช่องโหว่ของ Linux ถูกแก้ไปแล้วในปี 2020 (CVE-2020-0556) แต่แพตช์นั้นยังคงถูกปิดใช้งานไว้เป็นค่าเริ่มต้น มีรายงานว่าเฉพาะ ChromeOS เท่านั้นที่เปิดใช้แพตช์ดังกล่าว ทั้งที่ Ubuntu, Debian, Fedora, Gentoo, Arch, Alpine ต่างก็ออกประกาศแล้ว
แต่ถ้าประกาศของดิสโทรบอกว่าแค่อัปเกรดก็แก้แล้ว[2] ผมก็ไม่เข้าใจว่า “การแก้ไขถูกปิดไว้เป็นค่าเริ่มต้น” หมายความว่าอะไร หมายความว่าหลังอัปเกรดแล้วยังต้องเปลี่ยนการตั้งค่าด้วยมืออีกหรือ? การแก้ของ NixOS ดูเหมือนเป็นการสลับค่าเริ่มต้น
ถ้าหมายถึงผู้ใช้ที่ตั้ง
ClassicBondedOnly=falseไว้อย่างชัดเจนต้องไปเปลี่ยน ก็น่าจะเขียนให้ชัดกว่านี้ได้มาก[1] https://github.com/NixOS/nixpkgs/blob/3dda6d5ed56af34534dd4c...
[2] https://ubuntu.com/security/notices/USN-4311-1