พบช่องโหว่ (CVE-2022-42896) ในเคอร์เนล Linux ซึ่งอาจนำไปใช้รันโค้ดระดับเคอร์เนลจากระยะไกลได้โดยการส่งข้อมูลแพ็กเก็ต L2CAP ที่สร้างขึ้นเป็นพิเศษผ่านบลูทูธ นอกจากนี้ยังพบปัญหาที่คล้ายกัน (CVE-2022-42895) ใน L2CAP handler ซึ่งอาจนำไปสู่การรั่วไหลของหน่วยความจำเคอร์เนลในแพ็กเก็ตการกำหนดค่า ช่องโหว่แรกพบตั้งแต่เดือนสิงหาคม 2014 (เคอร์เนล 3.16) และช่องโหว่ที่สองพบตั้งแต่เดือนตุลาคม 2011 (เคอร์เนล 3.0) ช่องโหว่เหล่านี้ได้รับการแก้ไขแล้วในเคอร์เนล Linux รุ่น 6.1.0, 6.0.8, 4.9.333, 4.14.299, 4.19.265, 5.4.224, 5.10.154 และ 5.15.78 คุณสามารถติดตามการแก้ไขในการแจกจ่ายได้ที่หน้าต่อไปนี้: Debian, Ubuntu, Gentoo, RHEL, SUSE, Fedora, Arch
เพื่อแสดงให้เห็นถึงความเป็นไปได้ในการโจมตีระยะไกล ได้มีการเผยแพร่ต้นแบบการใช้ประโยชน์ที่ใช้งานได้บน Ubuntu 22.04 การโจมตีนี้ ผู้โจมตีต้องอยู่ภายในระยะการเชื่อมต่อบลูทูธ ไม่จำเป็นต้องทำการจับคู่อุปกรณ์ก่อน แต่จะต้องเปิดใช้งานบลูทูธบนคอมพิวเตอร์ การโจมตีจำเป็นต้องทราบที่อยู่ MAC ของอุปกรณ์ของเหยื่อ ซึ่งสามารถระบุได้โดยการดักจับข้อมูล หรือในบางอุปกรณ์อาจคำนวณจากที่อยู่ MAC ของ Wi-Fi
ช่องโหว่แรก (CVE-2022-42896) เกิดจากการเข้าถึงพื้นที่หน่วยความจำที่ถูกปลดปล่อยแล้วแบบใช้หลังจากปลดปล่อยแล้วในการใช้งานฟังก์ชัน l2cap_connect และ l2cap_le_connect_req หลังจากสร้างช่องสัญญาณผ่านคอลแบ็ก new_connection แล้ว ไม่มีการล็อกช่องสัญญาณ แต่มีการตั้งเวลา (__set_chan_timer) ซึ่งเมื่อหมดเวลา ระบบจะเรียกใช้ฟังก์ชัน l2cap_chan_timeout และล้างช่องสัญญาณโดยไม่ตรวจสอบว่าช่องสัญญาณนั้นทำงานเสร็จสมบูรณ์หรือไม่ในฟังก์ชัน l2cap_le_connect*
ค่าหมดเวลาเริ่มต้นคือ 40 วินาที และสันนิษฐานว่าเงื่อนไขการแข่งขันจะไม่เกิดขึ้นหากเกิดความล่าช้าดังกล่าว อย่างไรก็ตาม พบว่ามีข้อผิดพลาดอีกข้อหนึ่งในตัวจัดการ SMP ที่ทำให้ตัวจับเวลาถูกเรียกใช้งานทันที ส่งผลให้เกิดเงื่อนไขการแข่งขัน ข้อบกพร่องใน l2cap_le_connect_req อาจทำให้เกิดการรั่วไหลของหน่วยความจำเคอร์เนล ในขณะที่ใน l2cap_connect มันสามารถเขียนทับเนื้อหาในหน่วยความจำและรันโค้ดที่ไม่ได้ระบุได้ รูปแบบการโจมตีแบบแรกสามารถทำได้โดยใช้ Bluetooth LE 4.0 (ตั้งแต่ปี 2009) และแบบที่สองโดยใช้ Bluetooth BR/EDR 5.2 (ตั้งแต่ปี 2020)
ช่องโหว่ที่สอง (CVE-2022-42895) เกิดจากการรั่วไหลของหน่วยความจำที่เหลืออยู่ในฟังก์ชัน l2cap_parse_conf_req ซึ่งสามารถถูกใช้ประโยชน์เพื่อรับข้อมูลเกี่ยวกับพอยน์เตอร์โครงสร้างเคอร์เนลจากระยะไกลโดยการส่งคำขอกำหนดค่าที่สร้างขึ้นเป็นพิเศษ ฟังก์ชัน l2cap_parse_conf_req ใช้โครงสร้าง l2cap_conf_efs ซึ่งหน่วยความจำที่จัดสรรไว้ไม่ได้ถูกตั้งค่าเริ่มต้นไว้ล่วงหน้า ด้วยการจัดการแฟล็ก FLAG_EFS_ENABLE ทำให้สามารถรวมข้อมูลสแต็กเก่าไว้ในแพ็กเก็ตได้ ปัญหานี้จะพบเฉพาะในระบบที่คอมไพล์เคอร์เนลด้วยตัวเลือก CONFIG_BT_HS (ปิดใช้งานตามค่าเริ่มต้น แต่เปิดใช้งานในบางระบบปฏิบัติการ เช่น Ubuntu) การโจมตีที่ประสบความสำเร็จต้องตั้งค่าพารามิเตอร์ HCI_HS_ENABLED ผ่านอินเทอร์เฟซการจัดการเป็น true (ไม่ได้ใช้งานตามค่าเริ่มต้น)
ที่มา: opennet.ru
