PoC는 BLE로 약 10분 동안 커스텀 펌웨어를 업로드한 뒤 재부팅된 스피커가 USB HID 키보드처럼 echo pwned를 입력하고 실행하게 만들었음
Creative는 SingCERT를 통한 연락 뒤 “사이버보안 위험을 제시하지 않는다”며 취약점으로 보지 않았고, 최신 펌웨어는 취약하며 CTP-over-Bluetooth를 막는 비공식 패치만 제공됨
취약점의 핵심
Katana V2X는 USB로 PC에 연결되는 사운드바이며, Creative 앱은 CTP로 DSP, LED 구성, 출력 소스 같은 설정을 바꿈
USB에서 CTP 명령을 쓰려면 먼저 challenge-response 인증을 거쳐야 하며, 키는 Creative App에 포함된 바이너리에서 파생할 수 있는 정적 값임
펌웨어 업데이트도 CTP 위에서 실행되며, 초기 펌웨어 이미지는 Wireshark로 USB 트래픽을 캡처해 추출함
Bluetooth Low Energy에서는 페어링 없이도 장치에 연결해 GATT characteristic을 읽고 쓸 수 있는 경우가 있으며, 페어링은 암호화를 만들지만 연결 자체에 항상 필요하지는 않음
Katana V2X 펌웨어 안에서 내부 CTP 핸들러가 USB뿐 아니라 Bluetooth에도 연결돼 있었고, 노트북에서 5a 09 01 02를 characteristic 9e9daaec-3a10-4fe8-b69f-7397aff77886에 쓰자 characteristic 9e9daaeb-3a10-4fe8-b69f-7397aff77886에서 전체 펌웨어 버전 문자열을 읽을 수 있었음
펌웨어 검증과 OTA 공격 체인
펌웨어 컨테이너에는 복구 모드와 관련된 FBOOT, 일반 부팅에서 실행되는 메인 펌웨어 FMAIN, 전체 컨테이너에 대한 SHA-256 체크섬 CHK2가 있음
FBOOT와 FMAIN은 /home/jieyi/mcuos2.5/kernel/freertos-8.2.3/ 문자열이 가리키는 FreeRTOS 기반 코드이며, FMAIN은 FBOOT보다 약 6.5배 큼
장치는 CHK2만 올바르면 패치된 펌웨어를 수락했고, WELCOME 문자열을 PATCHED로 바꾼 펌웨어를 플래시하자 부팅 시 세그먼트 디스플레이에 PATCHED가 표시됐음
같은 펌웨어 업데이트 절차를 BLE로 재구현한 Python 스크립트가 페어링이나 인증 없이 커스텀 펌웨어를 업로드했고, BLE 속도 때문에 완료까지 약 10분이 걸렸음
스피커에는 마이크가 있어 커스텀 펌웨어가 대화를 듣고 Bluetooth로 수신자에게 전달하는 은밀한 모니터링 장치로 동작할 수 있다는 이론적 가능성이 있음
USB 키보드 주입 방식
Katana V2X는 일반 구성에서 PC에 USB로 연결된 신뢰된 장치로 동작함
장치는 이미 완전한 키보드는 아니지만 볼륨과 재생/일시정지 같은 미디어 제어를 위한 HID Consumer Control 장치로 자신을 설정함
펌웨어의 USB report descriptor에 두 번째 report descriptor 항목을 추가해 장치가 키보드로도 보고되게 만들 수 있었음
펌웨어 안에는 HID 데이터를 보내는 루틴이 이미 있었고, 누를 키와 뗄 키 데이터를 넘겨 호출하는 방식으로 키 입력을 보낼 수 있었음
실행 흐름을 복잡하게 우회하는 대신 정상 사용 중 별다른 동작을 하지 않는 것으로 보인 diagnostic FreeRTOS 태스크를 덮어써서 커스텀 코드를 부팅 때 실행하게 만들었음
해당 태스크는 약 20초 동안 USB 서브시스템 준비를 기다린 뒤 약 20ms 간격으로 echo pwned를 입력하고 Enter를 누른 다음 종료함
최종 패치는 USB report 83바이트, 키 입력 인젝터용 ARM/Thumb 어셈블리 102바이트, 전송할 키 입력마다 2바이트로 구성됐음
실제 공격에서는 powershell.exe 같은 프로그램을 열고 악성 한 줄 명령을 붙여넣을 수 있으며, 공격자가 일반 모드와 복구 모드의 펌웨어 업데이트 루틴을 비활성화하면 악성 펌웨어 제거와 향후 패치가 불가능해질 수 있음
스피커의 Bluetooth는 절전 모드에서도 항상 켜져 있고, 끄는 방법이 보이지 않음
완화와 공개 경위
Creative는 공개 보안 연락처가 없었고, 일반 연락 수단도 웹사이트 지원 양식 외에는 찾기 어려웠음
지원 양식으로 두 차례 연락을 시도한 뒤 SingCERT가 중재자로 참여했음
Creative는 SingCERT에 거의 두 달 뒤 응답했고, “사이버보안 위험을 제시하지 않으므로 취약점으로 보지 않는다”고 답함
Creative가 제공하는 패치는 없으며 최신 펌웨어도 취약함
비공식 완화책은 펌웨어에서 CTP-over-Bluetooth를 차단하며, Creative 모바일 앱은 이 변경으로 깨질 가능성이 큼
v2x-patcher는 Creative 서버에서 공식 펌웨어를 다운로드하고 메모리에서 패치한 뒤 USB로 연결된 Katana V2X에 업로드함
모든 테스트와 리버스 엔지니어링은 펌웨어 버전 1.3.230619.1820에서 수행됐음
리버스 엔지니어링 세부 사항
FMAIN.bin은 단일 이미지가 아니라 scatter-loaded 구조였고, 서로 다른 파일 오프셋이 서로 다른 주소에 로드됨
Ghidra 자동 분석에는 올바른 베이스 주소와 메모리 맵이 필요했고, 추론 뒤 장치 메모리 읽기로 검증한 레이아웃을 적용하자 유효한 분석 결과가 나왔음
문자열 포인터는 직접 로드되지 않고 movw와 movt 쌍으로 로드됐으며, 같은 레지스터에 로드되는 쌍을 찾아 유효 메모리를 가리키는 경우 DATA 참조를 만드는 스크립트가 약 1.3만 개 참조를 생성함
펌웨어를 매번 다시 플래시하지 않고 테스트하기 위해 CTP opcode 0x54의 echo 핸들러를 덮어써 읽기, 쓰기, 실행 명령을 처리하게 만들었음
최종 커스텀 핸들러는 96바이트였고, 원래 핸들러 크기인 약 106바이트 안에 들어갔음
여러 키 입력을 mem-exec로 USB 처리 태스크 문맥에서 실행할 때 vTaskDelay 지연이 누적되자 태스크별 watchdog 때문에 장치가 재부팅했음
키 입력 코드를 USB 태스크에서 직접 호출하지 않고 diagnostic 서비스 태스크에 주입하자 watchdog 문제가 사라졌음