[하루한줄] BleedingTooth: Zero-Click RCE
URL
BleedingTooth: Linux Bluetooth Zero-Click RCE
Target
Linux kernel 4.19 (with Bluetooth 5)
Linux kernel <= 3.6
Linux kernel >= 4.8
Explain
BleedingTooth라 불리는 취약점 3개의 Write-up이 공개되었습니다. BleedingTooth는 Linux Bluetooth subsystem의 제로 클릭 취약점들로, 해커는 이를 악용해 취약한 시스템에서 커널 권한으로 원격 코드 실행을 할 수 있습니다. 주로 블루투스 취약점들의 영향은 펌웨어 선에 머물거나 데이터 도청 및 조작에 머무는 반면 BleedingTooth는 기기 전체를 완전히 제어할 수 있습니다.
BadVibes(CVE-2020-24490) Heap-based Buffer Overflow
기존 31 bytes 였던 Advertising data의 크기가 블루투스5에선 255 bytes까지 확장되었습니다. 그에 맞춰 255 bytes까지 확장된 Advertisement report를 파싱 하는 함수
hci_le_ext_adv_report()
가 추가되었습니다. 다만 기존hci_le_adv_report()
에 존재하던 size check가 해당 함수에는 없기 때문에 overflow가 가능합니다.
BadChoice(CVE-2020-12352) Stack-Based Information Leak
A2MP 프로토콜의
A2MP_GETINFO_REQ
커멘드로 호출되는a2mp_getinfo_req()
는 HCI device id를 사용 중인 AMP컨트롤러의 정보를 요청합니다. 하지만, 만약HCI_AMP
가 유효하지 않다면 request를 받은 타겟 시스템은A2MP_STATUS_INVALID_CTRL_ID
를 응답합니다. 이 때 초기화 완전히 이루어지지 않은 탓에A2MP_STATUS_INVALID_CTRL_ID
가 16 bytes의 커널 스택 데이터를 포함한 채로 해커에게 전달됩니다.
BadKarma: Heap-Based Type Confusion (CVE-2020-12351)
static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) { ... if ((chan->mode == L2CAP_MODE_ERTM || chan->mode == L2CAP_MODE_STREAMING) && sk_filter(chan->data, skb)) goto drop; ... } static struct amp_mgr *amp_mgr_create(struct l2cap_conn *conn, bool locked) { struct amp_mgr *mgr; struct l2cap_chan *chan; mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); if (!mgr) return NULL; ... chan = a2mp_chan_open(conn, locked); if (!chan) { kfree(mgr); return NULL; } mgr->a2mp_chan = chan; chan->data = mgr; ... return mgr; }
함수
sk_filter()
는struct sock
를 처리하는 반면, argument로 전달되는chan->data
의 타입은struct amp_mgr
입니다. 따라서 remote type confusion 취약점입니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.