2014年式ルノー・ラティテュード(Latitude)のインパネ時計は、実際の時刻からきっかり1時間ずれていた。オーナーが車載メニューの隅々まで探しても、修正する項目はどこにも見当たらなかった。彼の行く手を阻んだのは機械的な故障ではなく、数千キロ彼方にある自動車・ナビメーカーが停止させた地図サーバだった。
この車に搭載されている車載ナビシステム「Carminat LIVE」はTomTom製だ。車を譲り受けた際、前オーナーからナビ用の地図SDカードが必要かと尋ねられ、「この車は時計を合わせるのすらそのカードが要るんだ」と言われた。そんな馬鹿な話があるかと疑い、どうせ地図データも期限切れだろうと受け取らなかったため、カードは処分されてしまった。後になって、前オーナーの言葉が一言一句すべて真実だったことを思い知らされる。
車の時計合わせが、たった1枚の地図SDカードに人質に取られている。この設計構造は、オーナーのハードウェアに対する正当な所有権を、外部サービスに依存する「期限付きリース権」へと貶めてしまった。サーバが永久に停止した今、車をまともに動かすパッチは、オーナー自身の手で書くしかなかった。
時計を合わせるために旧型の地図カードを買い直す不条理
ルノー・ラティテュードの車載ディスプレイは、コードネーム「beaumont」と呼ばれるプラットフォームで駆動している。ハードウェアにはサムスン製S5P6440プロセッサを採用し、Linuxカーネル2.6.28.10ベースのTomTomカスタムOSが稼働している。
インターフェースの基幹プロセスは PNDNavigator だ。ルノーとTomTomは車両設定専用の独立したシステムメニューを用意せず、時刻設定、言語設定、輝度調整といった基本項目をすべて PNDNavigator のUI定義の中に組み込んでいた。そしてそのUI定義ファイルは、外付けSDカードから直接読み込まれる仕組みになっていたのである。カードが挿入されていなければ、ナビシステムは「設定画面をどう起動するか」すら認識できない。
図:ディスプレイ中央にエストニア語で大きく表示された「No maps found!」の警告画面。SDカードが握っていたのは地図データだけではなかった。出典:blog.nns.ee
オーナーは1時間かけてあらゆる階層のメニューを探索したが、「Set time」の項目には二度とたどり着けなかった。最も手軽な公式の解決策は、中古の地図カードを買い直すことだ。市場を探せば見つかるものの、エストニアまでの国際送料を含めると約60ユーロかかる。時計を合わせるためだけに60ユーロを支払う気になれなかった彼は、自力でシステムの制御権限を取り戻す決意を固めた。
基本設定画面をナビ機能の「付属品」にしたメーカーの怠慢
10年以上前、自動車業界には第1波のコネクテッド化の波が押し寄せていた。自動車メーカー各社は「スマートコックピット」を先進性の売りにしたかったが、車載OSを自社開発するソフトウェア資産を持たなかった。そのため、座艙の電装システム全体をナビゲーション専業メーカーであるTomTomへ丸投げしたのである。開発納期に追われた受託チームは、ポータブルナビ(PND)向けのファームウェアをそのまま車載機へと移植した。起動時にまずナビアプリを立ち上げ、車両の基本設定はその配下にぶら下げられた。基本設定がナビ機能に直結していたため、地図サービスの終了とともに時計機能まで巻き添えを食らって停止したのだ。 オーナーの手元には、エンジンもトランスミッションも完璧に動くのに、サマータイムの切り替えすらできない自動車が残された。
チップレベルの縛りと noexec が築く多層防壁
最も直接的なハックは、市販の通常のSDカードを購入し、そこにシェルスクリプトを保存して読み込ませることだ。しかし車載システムには何重もの防壁が巡らされていた。
第1の防壁はハードウェアレベルのバインドだ。TomTomのDRMは、カード製造時にROM領域へ焼き込まれ改ざん不可能な「CID(Card Identification:カード固有識別コード)」と、地図データの暗号署名を照合する。市販のブランクSDカードはこの第1ステップで即座に弾かれる。
第2の防壁はマウントオプションに仕組まれていた。仮にCIDの偽装に成功したとしても、システムは外部ストレージを noexec 属性でマウントする。外部カード内のプログラムやスクリプトは一切の実行を拒絶される。海賊版地図の利用を防ぐために作られた防御壁が、最終的には自分の車を正常に直そうとする正当なオーナーを締め出す結果となった。
カーネルクラッシュを誘発し、実行制限を突破する
オーナーのRasmus Mooratsは車載機からファームウェアのダンプデータを抽出し、PC上のQEMUでS5P6440プロセッサ環境をエミュレートして逆アセンブルを開始した。彼は master.script を解析する ttn バイナリを丹念にリバースエンジニアリングし、内部コマンドプロトコル「SHEX」の挙動を解明した。SHEXはスペース区切りの単一引数のみを受け取り、それを launchserver に渡して execve で実行する。だが、この王道ルートも noexec によって完全に塞がれていた。
突破口となったのは、Linuxカーネルのコアダンプ機構だった。Linuxにはプロセスのクラッシュ時にコアダンプのハンドラをパイプ経由で指定できる /proc/sys/kernel/core_pattern が存在する。コマンドライン引数付きの記述はカーネル2.6.24からサポートされており、この車載機が搭載する2.6.28カーネルでは core_pattern がユーザースペースから書き換え可能だった。彼は確実にクラッシュするプロセスに目をつけた。システムD-Busに接続できない場合、/bin/dbus-monitor は即座にSIGABRTシグナルを発生させて自爆する。カーネルは core_pattern で指定されたコマンドを最高権限(root)で実行するため、ファイルシステム側の noexec 制約を完全にすり抜けることができる。
図:車載機の画面にmaster.scriptの実行が通知され、自作スクリプトが実機上でnoexecをすり抜けて動作を開始した瞬間。出典:blog.nns.ee
結果として、車載機上で任意の自作スクリプトをroot権限で実行できるようになり、時計の時刻合わせとタイムゾーン設定の自由が完全に取り戻された。
ベンダーのコード保守が途絶えたその後に
脱獄成功の報がコミュニティに伝わると、他の愛車家たちも追試を開始した。TomTom公式フォーラムでは、同じ手法がCarminat TomTom 8.843ファームウェアでも有効であることが確認された。さらに投稿者たちによって直感に反する事実も判明した。地図カードがなくてもGPSナビ機能そのものは死んでおらず、失われていたのは時計表示のトリガーだけだったのだ。真に修復が必要だったのは、カード内のGPS軌道情報キャッシュファイル(packedephemeris.ee、ee_meta.tlv、ee_meta.txt)であり、これらを最新のオフラインデータに差し替えることで、測位と時刻同期が再び正常に動作し始めた。
数百万円を支払って完成車を購入したオーナーが、基本的な時計を合わせるためにハッカーの手段に頼らざるを得ない。自動車メーカーがハードウェアの基本機能をクラウドサービスに人質として差し出すとき、ユーザーの手元に残るのは単なる一時的な利用権にすぎない。 サーバは停止し、ソースコードの保守は打ち切られる。システムのroot権限を自らの手に取り戻すことこそが、メーカーの寿命を超えてハードウェアを生かし続ける唯一の道なのだ。
参考リンク:
- blog.nns.ee:Jailbreaking my car’s navigation system just so I can change the time
- TomTom 公式コミュニティ議論スレッド(Carminat TomTom 8.843)
- Lobsters 技術コミュニティディスカッション