서버가 멈추자 10년 된 자동차 시계조차 맞출 수 없게 된 이유

서버가 멈추자 10년 된 자동차 시계조차 맞출 수 없게 된 이유

차량용 시스템리버스 엔지니어링하드웨어 소유권Linux

데이터 소스:blog.nns.ee + TomTom 포럼

2014년형 르노 라티튜드(Latitude)의 계기판 시계가 실제 시간보다 한 시간 늦게 가고 있었지만, 차주는 차량 메뉴를 아무리 뒤져도 시계를 바로잡을 수 없었습니다. 그의 앞을 가로막은 것은 기계적 고장이 아니라, 수천 킬로미터 떨어진 곳에서 제조사가 운영을 중단해 버린 지도 서버였습니다.

이 차량에 탑재된 카미낫 라이브(Carminat LIVE) 인포테인먼트 기기는 톰톰(TomTom)이 하청 제작한 시스템이었습니다. 이전 차주는 차를 넘겨주면서 내비게이션 지도 SD 카드가 필요한지 물으며 “이 차는 시계를 맞추려고 해도 그 카드가 꼭 필요하다”고 귀띔했습니다. 그는 그 말을 믿지 않았고 어차피 지도 데이터도 오래되었을 거라 여겨 카드를 받지 않았으며, 결국 카드는 버려졌습니다. 하지만 얼마 지나지 않아 이전 차주의 말이 한마디도 틀리지 않았음을 깨달았습니다.

차량의 시계 설정이 지도 카드 한 장에 볼모로 잡혀 있던 것입니다. 이러한 설계 방식은 차주가 지닌 하드웨어에 대한 온전한 소유권을 외부 서비스에 종속된 일시적 임차권으로 전락시켰습니다. 서버가 완전히 문을 닫은 상황에서, 고장 난 시계를 고칠 유일한 패치는 차주가 직접 코드를 작성하는 것뿐이었습니다.

시계를 맞추기 위해 구형 지도 카드를 다시 사야 하는 모순

르노 라티튜드의 디스플레이는 보몬트(beaumont)라는 코드명의 플랫폼으로 구동되며, 하드웨어는 삼성 S5P6440 칩셋을 기반으로 리눅스 커널 2.6.28.10을 탑재한 톰톰 커스텀 운영체제를 실행합니다.

시스템 인터페이스의 핵심 프로세스는 PNDNavigator였습니다. 르노와 톰톰은 차량 전체를 위한 독립된 기본 설정 메뉴를 별도로 개발하지 않고, 시계 설정, 언어 선택, 화면 밝기 조절 같은 필수 항목들을 모두 PNDNavigator의 UI 정의 파일 안에 집어넣었습니다. 그리고 이 정의 파일은 외장 SD 카드에서 동적으로 읽어오도록 설계되었습니다. 카드가 꽂혀 있지 않으면 기기는 ‘설정’ 화면을 어떻게 띄워야 하는지조차 알지 못했습니다.

차량 화면에 표시된 No maps found 안내 사진: 차량 중앙 디스플레이에 에스토니아어로 크게 표시된 ‘No maps found!’ 안내 문구. SD 카드가 좌우한 것은 지도뿐만이 아니었습니다. 출처: blog.nns.ee

차주는 한 시간 동안 모든 메뉴를 샅샅이 뒤졌지만 끝내 ‘시간 설정’ 옵션을 찾을 수 없었습니다. 공식적으로 알려진 가장 손쉬운 해결책은 중고 지도 카드를 다시 구입하는 것이었습니다. 중고 시장에서 카드를 구할 수는 있었으나 에스토니아까지 배송비를 포함하면 약 60유로가 들었습니다. 시계 하나 맞추자고 60유로를 지불하고 싶지 않았던 그는 스스로 시스템 제어권을 탈환하기로 결심했습니다.

기본 설정을 지도 애플리케이션의 부속물로 전락시킨 제조사

10여 년 전 자동차 업계에는 1세대 커넥티드 바람이 불었습니다. 완성차 업체들은 스마트 콕핏이라는 마케팅 셀링 포인트를 원했지만 독자적인 차량용 소프트웨어를 개발할 역량이 부족했습니다. 결국 조종석 전장 시스템 전체를 내비게이션 전문 업체인 톰톰에 통째로 맡겼습니다. 출시 일정에 쫓기던 외주 개발팀은 휴대용 내비게이션(PND) 펌웨어를 차량용 인포테인먼트에 그대로 옮겨 심었습니다. 부팅 시 내비게이션을 먼저 실행하고, 차량의 기본 설정은 그 하위 메뉴로 배치한 것입니다. 기본 설정 기능이 내비게이션 서비스에 종속되면서, 지도 서비스가 종료되자 시계 기능까지 함께 멈춰 서고 말았습니다. 차주는 엔진과 차체가 멀쩡한 자동차를 눈앞에 두고도 서머타임조차 조정하지 못하는 황당한 처지에 놓였습니다.

하드웨어 칩 잠금과 noexec가 세운 다중 방어선

가장 직관적인 자체 해결책은 일반 SD 카드를 구입해 실행 스크립트를 담아 실행하는 것이었습니다. 하지만 시스템에는 여러 겹의 방어선이 구축되어 있었습니다.

첫 번째 방어선은 칩셋 수준의 하드웨어 결합이었습니다. 톰톰의 DRM 시스템은 카드 생산 시 롬 영역에 기록되어 일반적인 방법으로는 수정할 수 없는 고유 식별 번호인 CID(Card Identification)와 지도 파일의 암호화 서명을 철저히 대조했습니다. 시중에서 흔히 구하는 빈 카드는 첫 단계에서 즉시 거부되었습니다.

두 번째 방어선은 마운트 정책에 숨겨져 있었습니다. 합법적인 CID를 흉내 내는 데 성공하더라도, 운영체제는 외장 저장장치를 noexec 옵션으로 마운트했습니다. 따라서 카드에 담긴 프로그램이나 셸 스크립트는 실행 권한을 얻지 못했습니다. 해적판 지도 복제를 막기 위해 설계된 보안 장치들이 결국 자신의 차를 고치려는 정당한 소유자를 가로막은 셈입니다.

커널 크래시를 유도하여 실행 제한을 돌파하다

차주 라스무스 무라츠(Rasmus Moorats)는 기기에서 펌웨어를 덤프한 뒤 PC에서 QEMU로 S5P6440 프로세서 환경을 가상화하여 역어셈블 작업을 시작했습니다. 그는 master.script를 파싱하는 ttn 바이너리를 단계별로 리버스 엔지니어링하여 내부 명령 프로토콜인 SHEX의 동작 방식을 파악했습니다. SHEX는 공백으로 구분된 단 하나의 인자만을 받아 이를 launchserver로 넘기고, launchserver는 이를 execve로 실행하는 구조였습니다. 그러나 이 통로 역시 noexec 제한으로 인해 가로막혀 있었습니다.

돌파구는 리눅스 커널의 코어 덤프 처리 구조에서 나타났습니다. 리눅스는 프로세스가 비정상 종료될 때 /proc/sys/kernel/core_pattern을 통해 덤프 핸들러 파이프라인을 설정할 수 있도록 지원합니다. 명령줄 인수를 포함하는 핸들러 형식은 커널 2.6.24부터 지원되었으며, 이 차량에 탑재된 커널은 2.6.28이었기에 사용자 공간에서도 core_pattern 값을 수정할 수 있었습니다. 그는 반드시 비정상 종료를 일으키는 프로세스를 골라냈습니다. /bin/dbus-monitor는 시스템 D-Bus에 연결하지 못할 경우 즉시 SIGABRT 시그널을 던지며 스스로 종료됩니다. 커널은 core_pattern에 지정된 명령을 최고 권한(root)으로 실행하므로 파일시스템의 noexec 제약에 구애받지 않았습니다.

차량 화면에서 master.script 실행을 알리는 모습 사진: 인포테인먼트 화면에 master.script 실행 알림이 뜨고, 사용자가 작성한 스크립트가 noexec 제한을 뚫고 실제 하드웨어에서 성공적으로 실행되는 모습. 출처: blog.nns.ee

그 결과 차주는 인포테인먼트 시스템에서 임의의 스크립트를 root 권한으로 자유롭게 실행할 수 있게 되었으며, 시계와 표준 시간대 설정 권한을 온전히 되찾았습니다.

제조사의 코드 유지보수가 종료된 이후

루트 권한 탈환 소식이 커뮤니티에 전해지자 다른 자동차 애호가들도 동일한 작업에 착수했습니다. 톰톰 공식 커뮤니티에서는 동일한 탈옥 절차가 카미낫 톰톰 8.843 펌웨어 버전에서도 정상 작동한다는 사실이 확인되었습니다. 포럼 게시물들은 또 다른 흥미로운 사실을 밝혀냈는데, SD 카드가 없어도 GPS 내비게이션 자체가 완전히 죽은 것이 아니며 단지 시계 표시 기능만 연동되지 않았다는 점입니다. 실제로 필요했던 조치는 카드 내부의 위성 궤도력 캐시 파일(packedephemeris.ee, ee_meta.tlv, ee_meta.txt)이었으며, 이를 최신 오프라인 데이터로 교체하자 위치 추적과 시계 동기화 기능이 정상적으로 복구되었습니다.

수천만 원을 들여 자동차를 구매한 차주가 계기판 시계를 맞추기 위해 해커들의 공격 기법까지 동원해야 하는 상황이 벌어졌습니다. 완성차 제조사가 하드웨어 기능을 일방적으로 클라우드 서비스에 종속시킬 때, 사용자에게 남겨지는 것은 단지 기한 없는 임차권에 불과합니다. 서버는 언제든 꺼질 수 있고 코드는 유지보수가 중단될 수 있습니다. 시스템의 루트 제어권을 직접 확보하는 것만이 제조사의 수명을 넘어 하드웨어를 오래도록 사용하는 유일한 방법입니다.

참고 링크:

  • blog.nns.ee: Jailbreaking my car’s navigation system just so I can change the time
  • 톰톰 공식 커뮤니티 토론 글 (Carminat TomTom 8.843)
  • Lobsters 기술 커뮤니티 토론