[하루한줄] 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 취약점입니다.