
르노에 탑재된 NavCore 9.884(코드명 beaumont) 리버스 엔지니어링
르노에 탑재된 NavCore 9.884의 리버스 엔지니어링 (코드명
beaumont)
테스트 대상: Renault Laguna 3 GT Monaco GP 2012 (참고로, 정말 멋진 차입니다)
flowchart TD
A[Carminat TomTom LIVE] --> B[Samsung S5P6440<br/>Linux 2.6.28 verrouillé]
B --> C[NAND interne]
B --> D[Carte SD externe]
C --> E[Verrouillé]
D --> F[Modifiable]
E -.->|UART| G[shell root théorique ?]
F -.->|fichiers SD| H[Personnalisations<br/>splash · menus · POI]
style A fill:#5B4FBE,color:#fff
style E fill:#A32D2D,color:#fff
style F fill:#3B6D11,color:#fff
style G fill:#EF9F27,color:#000
style H fill:#1D9E75,color:#fff
Carminat TomTom LIVE는 2009-2014년 모델(Laguna 3, Mégane 3, Scénic 3, Espace 4, Fluence, Latitude, Koleos…)에 장착된 Renault의 차량 내장 내비게이션 시스템입니다. 비-Live 버전의 Carminat TomTom과 구별되는 특징은 다음과 같습니다:
signedloop**이 Merkle 트리로 rootfs의 무결성을 검증한다고 하나, 본 분석에서는 확인되지 않음 (§3 참조)이 저장소는 NavCore 9.884 beaumont 펌웨어 분석을 문서화하며, 파일시스템 매핑, NavCore 바이너리의 정적 분석, 그리고 QEMU/strace를 통한 런타임 분석을 포함합니다.
사용된 방법론:
ttgo.bif, loopdir/ext3_loopback 파일 읽기)ttn 바이너리의 동적 분석(시스템 호출 strace, 열린 파일 관찰, 런타임 동작)을 가능하게 하는 ARM/Linux 환경을 재현한 QEMU 에뮬레이터 구축차량의 물리적 장치에는 어떠한 수정도 가해지지 않았습니다. 모든 분석은 SD 카드 파일과 다운로드한 펌웨어의 사본을 대상으로 수행되었습니다.
여기에 문서화된 모든 작업은 개인 SD 카드(분석을 위해 차량에서 추출)와 TomTom CDN에서 다운로드한 공식 펌웨어를 기반으로 수행되었습니다.
📌 진화하는 문서: 이 보고서는 본 분석에서 도출된 현재 지식 상태를 나타냅니다. 향후 발견, 커뮤니티 기여, 실제 하드웨어에서의 경험적 검증을 통해 개선, 수정 또는 보강될 수 있습니다. 기여, 수정 및 피드백을 환영합니다.
| 필드 | 값 |
|---|---|
| DeviceName | TomTom Carminat LIVE |
| 하드웨어 코드명 | beaumont (rev 11) |
| NavCore 버전 | 9.884, 빌드 9.884.1609031 |
| 공식 릴리스 | NFA2.8-RC06, 2014/06/27 Dieppe에서 컴파일 |
| Linux 커널 | 2.6.28.10-tt1574740 |
| 툴체인 | gcc 4.3.3 TomTom CipherWizardry 2009q1_203-474426 |
| Libc | uClibc |
| Init 시스템 | Upstart (셸 스크립트 /sbin/init → exec /sbin/upstart 경유) |
이 정보는 SD 카드의 loopdir/ext3_loopback 이미지에서 추출한 ttgo.bif와 TomTom-Cfg/release.nfo 파일에서 비롯됩니다.
# Extrait ttgo.bif
[TomTomGo]
DeviceName=TomTom Carminat LIVE
DeviceVersionHW=beaumont
ApplicationVersionVersionNumber=9884
ApplicationVersion=1609031.550
RamDiskVersion=20140626
BootLoaderVersion=839378
LinuxVersion=1574740
| 구성 요소 | 식별 정보 |
|---|---|
| SoC | Samsung S5P6440 (/etc/udev/rules.d/20_local-s5p6440.rules를 통해 확인됨) |
| CPU | ARM1176JZF-S · ARMv6 · 리틀 엔디언 · EABI |
| RAM | 정적 분석으로는 확인되지 않음 |
| 내부 저장소 | NAND 플래시 · eMMC (/dev/mmcblk0) |
| 사용자 SD 카드 | /dev/mmcblk1 (접근 가능한 슬롯) |
| 화면 | Samsung LCD LTA058B3L0F (DTB 기준) · 480×272 |
| 프레임버퍼 | /dev/fb0 · RGB16/24 |
| GPS | SiRF3 PRIMA · /dev/ttySAC2 |
| GSM/GPRS 모뎀 | Wavecom WISMO218 · /dev/ttyS0 |
| RDS-TMC 튜너 | BCM4750 · bcm4750_spi |
| 블루투스 | 내장 · hci_uart · HFP + PBAP 전용 (A2DP 없음) |
| 터치스크린 | libts · /dev/input/event0 |
/etc/modules 발췌)unionfs · ppp_async · ppp_generic · slhc · hidp · hid · rfcomm
sco · hci_uart · l2cap · bluetooth · bcm4750_spi · vfat · msdos
fat · evdev
⚠️
signedloop모듈은 커뮤니티(gpspower.net)에서rootfs.img의 무결성을 검증하는 것으로 보고되었습니다. 추출된 rootfs에서는 관찰되지 않았습니다 (/etc/modules에도,/lib/modules/2.6.28.10-tt1574740/에도 없음). 확인이 필요합니다.
펌웨어는 TomTom의 Akamai CDN에서 인증 없이 다운로드할 수 있습니다:
curl -A "TomTom HOME/2.24.11.8" -O \
"http://download.tomtom.com/sweet/navcore/9.884.1609031_RC06.CAB-Dieppe.cab"
# SHA256 de référence
a4d32daae2cdd6bc23a0660285c4e32e3a098034731eb257172ed7aaef9052d5
사용 가능한 다른 버전 (HTTP 200 테스트 완료):
| 버전 | URL |
|---|---|
| 9.844 | http://download.tomtom.com/sweet/navcore/9844.634510.Carminat_TomTom.cab |
| 9.845 RC10 | http://download.tomtom.com/sweet/navcore/9.845_1115399_RC10.CAB-Camiron-RC10.cab |
| 9.846 RC12 | http://download.tomtom.com/sweet/navcore/9.846_1165624_RC12.CAB-Camiron-RC12.cab |
| 9.847 RC14 | http://download.tomtom.com/sweet/navcore/9.847.1302316_RC14.CAB-Camiron-RC14.cab |
| 9.884 RC06 | http://download.tomtom.com/sweet/navcore/9.884.1609031_RC06.CAB-Dieppe.cab |
brew install cabextract # macOS
mkdir extracted && cabextract 9.884.1609031_RC06.CAB-Dieppe.cab -d extracted/
ls extracted/
# → splashw.bmp ttsystem TomTom-Cfg/release.nfo
ttsystem은 비-Live 버전과 달리 ext2 이미지입니다(TTBL이 아님).
cd extracted/
mkdir rootfs && 7z x ttsystem -o rootfs/
# Le rootfs réel est dans userfs_partition.tar.gz
cd rootfs/
tar xzf userfs_partition.tar.gz
# Contenu :
# _zImage → Linux kernel ARM zImage
# rootfs.img → filesystem Linux complet (ext2, 67 MB)
# WISMO218_*.cla → firmwares modem
mkdir rootfs_mnt
# Sur Linux :
sudo mount -o loop rootfs.img rootfs_mnt/
# Sur macOS (lecture seule) :
7z x rootfs.img -o rootfs_mnt/
rootfs_mnt/
├── bin/
│ ├── ttn ← NavCore principal (11.7 MB, ELF ARM dynamique)
│ ├── telttn ← wrapper IPC vers ttn
│ ├── fakettn ← fallback si ttn absent
│ └── gprscomd ← daemon GPRS
├── etc/
│ ├── inittab
│ ├── fstab
│ ├── passwd ← root:Twu6z6F/voF0Q (DES crypt)
│ ├── init/jobs.d/ ← 20+ jobs Upstart
│ └── udev/
├── lib/
│ ├── libosal.so.0 ← TomTom OS Abstraction Layer
│ ├── libhal.so.0 ← Hardware Abstraction (pilote fb0)
│ ├── libttmp.so.0 ← TomTom Multimedia
│ └── LoquendoTTS/ ← moteur TTS Loquendo
├── sbin/
│ ├── init ← script shell → exec /sbin/upstart
│ ├── mount_sd_loopback
│ ├── mount_sd
│ ├── run_gprscomd
│ └── ttsystem_present
└── (sur partition userfs au runtime)
└── /mnt/sdcard/script/
├── TTTaskList.lua ← liste complète des TASK_* (300+)
└── liblua.so ← VM Lua chargée par ttn via dlopen
| 파티션 | 마운트포인트 | 유형 | 옵션 |
|---|---|---|---|
mmcblk0p3 | /mnt/flash | ext3 | defaults,sync,noauto |
mmcblk0p5 | /content | ext3 | defaults,sync,noauto |
| (fstab 아님) | /mnt/sdcard | ext3 | 정확한 메커니즘 미검증 |
/mnt/sdcard는 내부 NAND이며, 외부 SD가 아닙니다. 이는 "sdcard"가 내장 스토리지를 지칭하던 TomTom 명명 방식의 유산입니다. 정확한 마운트 메커니즘(아마도/sbin/init셸 이전 단계의 부트로더/initramfs)은 이 분석에서 검증되지 않았습니다. 이는/content에 대한mount_internal의remount,rw가 사전 마운트를 암시한다는 점에서 시사됩니다.
SD는 다음 구성으로 unionfs를 통해 /mnt/movi에 마운트됩니다:
# Script /sbin/mount_sd_loopback (simplifié)
sd_mount="/media/sdcard" # FAT32, RO
loop_mount="/media/loopback" # ext3_loopback, RW upper
union_mount="/mnt/movi" # unionfs des deux
mount -t vfat /dev/mmcblk1p1 $sd_mount \
-o rw,noatime,nodiratime,nosuid,nodev,noexec,sync
mount -o loop $sd_mount/loopdir/ext3_loopback $loop_mount \
-o rw,noexec,data=journal,commit=3600,async
mount -t unionfs unionfs $union_mount \
-o rw,async,noexec,dirs=$loop_mount:$sd_mount=ro
⚠️ noexec 이중 보호: FAT32의
mount에 명시된 옵션 + unionfs 전파. 커뮤니티는 또한 모든 비-loop FS에noexec를 강제하는 커널 훅post_mount()를 보고합니다(gpspower.net): 이 분석에서는 검증되지 않았습니다.