Pwnd Blaster: 스피커를 전혀 만지지 않고 스피커로 PC 해킹하기

2 hours ago 2
  • Creative Sound Blaster Katana V2X는 Bluetooth 범위 약 15m 안의 공격자가 페어링이나 물리 접촉 없이 CTP 명령과 펌웨어 업데이트를 실행해 감시 장치나 원격 Rubber Ducky처럼 바꿀 수 있음
  • USB의 CTP는 정적 키 기반 challenge-response 인증을 요구하지만, Bluetooth 경로는 GATT characteristic을 통해 같은 CTP 명령을 인증 없이 받아 정보 읽기와 설정 변경을 허용함
  • 펌웨어 컨테이너는 FBOOT, FMAIN, CHK2로 구성되며, 서명 검증 없이 SHA-256 체크섬인 CHK2만 맞으면 패치된 펌웨어를 수락함
  • 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 문제가 사라졌음
Read Entire Article