오늘은 VTR연구소에서 퍼징테스트와 취약점 발견을 어떻게 하는지에 대해 조금 더 자세하게 알려드리겠습니다.

퍼징 방법

이번 연구는 완성 차량에서 USB 를 통한 인포테인먼트 시스템을 충돌 시키는게 목표였습니다. 일부 완성 차량에 대해서 테스트 되었지만 USB 입력을 지원하는 모든 차량에서 테스트를 할 수 있고 영향을 미칠 수 있다고 생각합니다.

먼저, 우리는 USB 퍼징을 위해 잘 알려진 퍼징 도구인 "syzkaller" 도구를 사용하였습니다. "syzkaller" 퍼징 도구는 Linux 하위 시스템에 대해 퍼징 테스트를 하도록 지원하고 있습니다. 이 퍼징 도구에서는 Linux 하위 시스템 퍼징을 비롯하여 USB 스택에 대해 퍼징을 할 수 있도록 기능을 제공하고 있습니다.

이 문서에서는, syzkaller 를 통한 USB 기반 퍼징 방법을 설명하고 있습니다. 이어서, "syzkaller" 퍼징 도구를 통해 퍼징 환경을 구축하기 위해 다음과 같은 과정을 준비하였습니다.

  1. 하드웨어 채택
  2. 퍼징 환경 구축
  3. 퍼징 테스트 

위 문서에서는 "Facedancer21"와 같이 프로그래밍이 가능하며 USB 장치에 대해 에뮬레이트 할 수 있어 잘 알려진 하드웨어 도구를 추천하고 있으나, 하드웨어 공급이 원활하지 않았으므로 우리는 다른 하드웨어 장치에서의 테스트를 통해 'USB OTG' 기능을 지원하는 하드웨어인 Raspberry PI를 사용하였습니다.

위 Raspberry 하드웨어에서는 5V 전원을 인가하는 포트에 USB OTG 기능을 포함하고 있으므로 USB-C 케이블을 통해 연결할 수 있습니다.

퍼징 환경을 구축하는데 있어서는 위에 언급된 syzkaller도구의 공식 문서를 참고하였습니다.

여기서는 "raw-gadget"이라는 도구가 추가적으로 사용 되었습니다. 

Raw-gadget는 Linux USB gadget 하위 시스템을 위한 저 수준 인터페이스를 구현하기 위한 모듈로, 물리적 USB 장치 또는 가상의 USB 장치를 에뮬레이트 하는데 사용할 수 있습니다.

다음으로, 퍼징을 시작하기 위한 단계에 앞서 구축한 퍼징 환경에 대한 전체적인 구성도를 설명합니다. 아래 구성도를 참고하면 Raspberry PI 하드웨어에서 syzkaller 퍼저가 동작하는 구조이며, 퍼저는 Reproduction 코드의 입력값을 기반으로 하며 이러한 입력값을 syzkaller가 해당 입력값을 ECU(USB Port) 에 전송하게 됩니다.

img
Fuzzing Overview

여기서 사용된 Reproduction 코드는 syzkaller에서 알려진 300+ 이상의 USB 스택의 취약점을 재현하기 위한 코드로, 아래 링크에서 데이터가 수집되었습니다.

img
Syzbot Reproduction (link: https://syzkaller.appspot.com/upstream?manager=ci2-upstream-usb)

취약점 발견 차량 모델:

Demo


위 포스트는 영문 원고의 국문번역, 편집본입니다. 원고는 VTR연구소 멤버 정동현 대리의 개인 블로그에서 확인 해주세요 👏🏼👏🏼👏🏼

화이트해킹 / 퍼징에 관심 있으신가요?
VTR연구소에서 함께 해봐요: 아우토크립트 채용 사이트.