
BLURtooth: Bluetooth Classic 및 Bluetooth Low Energy에서 교차 전송 키 유도(Cross-Transport Key Derivation) 악용 [CVE-2020-15802] [CVE-2022-20361]
AsiaCCS'22에서 발표된 BLUR 공격에 관한 저장소입니다. 논문 제목: BLURtooth: Bluetooth Classic 및 Bluetooth Low Energy에서의 크로스-트랜스포트 키 유도(Cross-Transport Key Derivation) 악용.
유용한 링크: pdf, video, slides, website.
BibTex 항목:
@inproceedings{antonioli22blur,
author={Antonioli, Daniele and Tippenhauer, Nils Ole and Rasmussen, Kasper
and Payer, Mathias},
title={{BLURtooth: Exploiting Cross-Transport Key Derivation in
Bluetooth Classic and Bluetooth Low Energy}},
booktitle={Proceedings of the Asia conference on computer and
communications security (ASIACCS)},
month={May},
year={2022}
}
BLUR 공격에는 CVE-2020-15802 및 CVE-2022-20361이 할당되었습니다.
이 README의 나머지 부분에서는 *Bluetooth Classic (BR/EDR)*을 BT로, Bluetooth Low Energy를 BLE로, Cross-Transport Key Derivation을 CTKD로 표기합니다. 또한 공격 장치와 피해 장치가 BT, BLE 및 CTKD를 지원한다고 가정합니다. 이는 장치들이 Bluetooth 4.2+ 및 BT/BLE 보안 연결(Secure Connections)을 지원한다는 의미입니다.
공격을 수행하는 가장 쉬운 방법은 하나의 장치를 피해자이자 공격 장치로 동시에 사용하는 것입니다. 예를 들어, Linux 노트북을 피해자/공격 장치로 사용하고 다른 장치를 다른 피해자로 사용하는 것을 권장합니다.
우리는 bluez 및 bluez tools를 실행하는 Linux 시스템을 사용합니다. btmgmt 도구에 의존하며, 그 소스 코드를 훑어보면 도움이 될 수 있습니다. 특히 pair 하위 명령어를 사용하는데, 이 명령어는 임의의 입출력 기능을 선언하면서 BT/BLE를 통해 임의의 페어링 요청을 보낼 수 있게 해줍니다.
Usage: pair [-c cap] [-t type] <remote address>
논문에 제시된 정확한 공격 시나리오를 재현하려면 추가 작업을 수행해야 합니다. 구체적으로는 BIAS attack에 제시된 설정을 재현해야 합니다. 설정이 준비되면 개발 보드를 BT/BLE 컨트롤러로, Linux 노트북을 호스트로 사용할 수 있어야 합니다. 또한 호스트의 링크 계층 패킷(예: BT LMP 트래픽)을 스니핑하고 internalblue를 사용하여 개발 보드의 펌웨어를 런타임에 동적으로 패치할 수 있어야 합니다.
이 단계는 선택 사항이며 자체 Linux 커널에 패치를 적용해야 합니다.
btmgmt -c 3을 사용하면 bluez가 자동으로 MitM 보호 플래그를 해제합니다. 예를 들어 AuthReq 바이트를 0x03이 아닌 0x02로 설정합니다.
그러나 BLUR 공격은 이 플래그를 해제할 필요가 없으며, 원격 장치가 입출력 기능을 지원할 때 NoInputNoOutput 기능만 선언하면 됩니다. 이렇게 하면 MitM 플래그를 해제하지 않고도 페어링 절차가 Just Works로 다운그레이드됩니다.
이 설정을 구현하려면 Linux 커널을 약간 수정해야 합니다. 특히 /net/bluetooth/hci_event.c에서 다음을:
cp.authentication = conn->auth_type;
다음으로 변경합니다:
cp.authentication = 0x03;
이렇게 하면 선언하는 입출력 기능과 관계없이 AuthReq 플래그가 0x03으로 하드코딩됩니다.
피해 장치들을 평소처럼 페어링합니다. 예를 들어 스마트폰을 대상으로 하는 경우 노트북(피해자이자 공격 장치 역할을 수행)과 페어링합니다. 페어링 과정에서 사용자 상호 작용(예: 숫자 비교(Numeric Comparison))이 필요할 수 있습니다.
REMOTE-BTADD로 표시됩니다.hciconfig를 실행하고 자신의 hci 인덱스(예: 0)를 기록합니다.sudo btmgmt -i 0을 실행합니다.[hci0] #이 포함된 파란색 터미널 프롬프트가 표시되어야 합니다.여기서는 피해 장치가 공개 BLE 주소를 사용한다고 가정합니다. 임의 주소를 사용하는 경우 -t 옵션을 2로 변경하세요.
btmgmt CLI에서 다음을 실행합니다:
pair -t 1 REMOTE-BTADD
연관(association)을 Just Works로 다운그레이드해야 하는 경우 다음을 실행합니다:
pair -c 3 -t 1 REMOTE-BTADD
-c 플래그는 공격자의 입출력 기능을 설정하며, 0x3 값은 NoInputNoOutput에 매핑됩니다. 반면 랩톱/스마트폰의 기본값은 0x1로 Display Yes/No에 매핑됩니다.
이 경우 BLE Peripheral을 사칭하더라도 Central로서 BT를 통해 페어링합니다.
btmgmt CLI에서 다음을 실행합니다:
pair -t 0 REMOTE-BTADD
연관을 Just Works로 다운그레이드해야 하는 경우 다음을 실행합니다:
pair -c 3 -t 0 REMOTE-BTADD
피해자에게 현재 알려지지 않은(즉, 페어링되지 않은) 장치를 사칭하면서 위에서 설명한 공격을 반복합니다.
bluetoothctl CLI에서 discoverable을 on 또는 off로 설정하고 pairable을 설정할 수 있습니다. btmgmt CLI에서도 connectable 플래그를 설정할 수 있습니다.
bluetoothctl에서 discoverable-timeout을 사용하여 검색 가능 시간 제한을 제어할 수 있습니다. 예를 들어 0으로 설정하면 장치가 항상 검색 가능 상태가 됩니다.
BT의 경우 Central 또는 Peripheral로서 원격 장치와 페어링하는 동안 페어링이 허용되지 않음(오류 코드: 0x18)을 나타내는 다음 LMP 패킷을 수신하게 됩니다: LMP not accepted ext (opcode: 0x02)
BLE의 경우 Central 또는 Peripheral로서 원격 장치와 페어링하는 동안 Pairing Not Supported(이유: 0x05)를 나타내는 다음 SMP 패킷을 수신하게 됩니다: SMP Pairing Failed Command (opcode 0x05).
BT의 경우 원격 장치와 페어링하는 동안 LMP 기능 패키지에서 호스트와 컨트롤러의 Secure Connections 지원 여부를 확인합니다. 예를 들어 다음 Wireshark 표시 필터를 사용합니다: btbrlmp.efeat.scc or btbrlmp.efeat.sch.
BLE의 경우 원격 장치와 페어링하는 동안 SMP 페어링 요청(Pairing Request) 또는 응답(Response)에서 Secure Connection 플래그가 포함된 AuthReq 바이트를 확인합니다. 예를 들어 다음 Wireshark 표시 필터를 사용합니다: btsmp.sc_flag == 1.
BT의 경우 원격 장치와 페어링하는 동안 BLE SMP 트래픽은 L2CAP을 통해 터널링됩니다. 따라서 btl2cap.payload Wireshark 필터를 사용하면 Central에서 Peripheral로 전송되는 0x01(SMP Pairing Request)로 시작하는 페이로드를 가진 패킷 하나와 반대 방향으로 0x02(SMP Pairing Response)로 시작하는 페이로드를 가진 또 다른 패킷을 볼 수 있습니다. 그런 다음 SMP 키 분배 단계를 인코딩하는 다른 원시 L2CAP 패킷도 볼 수 있습니다.
BLE의 경우 원격 장치와 페어링하는 동안 SMP 페어링 요청 또는 응답에서 Central과 Peripheral 모두 SMP 키 분배 중에 링크 키를 보내고 받을 의향이 있는지 확인합니다. 예를 들어 다음 Wireshark 필터를 사용합니다: btsmp.key_dist_linkkey or btsmp.key_dist_linkkey.