ラック・セキュリティごった煮ブログ

セキュリティエンジニアがエンジニアの方に向けて、 セキュリティやIT技術に関する情報を発信していくアカウントです。

【お知らせ】2021年5月10日~リニューアルオープン!今後はこちらで新しい記事を公開します。

株式会社ラックのセキュリティエンジニアが、 エンジニアの方向けにセキュリティやIT技術に関する情報を発信するブログです。(編集:株式会社ラック・デジタルペンテスト部)
当ウェブサイトをご利用の際には、こちらの「サイトのご利用条件」をご確認ください。

デジタルペンテスト部提供サービス:ペネトレーションテスト

ECUのコードを読んでみよう

デジタルペンテスト部の宮崎です。

突然ですが、ECUという言葉を聞いたことがあるでしょうか?かつてはEngine Control Unitの略称として、その名の通り、エンジンを制御するための電子制御ユニットを指していましたが、今となってはエンジン以外の制御にも使用されるため、Electronic Control Unitの略とされています。

ガソリンと空気の混合気を燃焼させて動力を得るのがガソリンエンジンですが、理想の混合比は1:14.7と言われています。空気の濃度はその時の気温や高度によっても変化するため、その時々で最適な混合比を算出してくれているのがECUの主な役割です。

ECUに内蔵されている空燃比データは、メーカー純正の状態ですと十分な安全マージンがとられているのですが、これを自前で書き換えることで車をチューニングすることなんかもできます。

ECUにはどんなデータが格納されているのか、自分の車で読み出してみた結果が以下の画像です。本記事では読み出すまでの手順を解説していきたいと思います。

ECUを取り外そう

ECUのデータを読み出すために、とにもかくにも車についているECUを取り外さないといけません。どこにあるかは車両によるのですが、私の車の場合、助手席のグローブボックスの裏にありました。こんな姿をしています。取り外すと当然車は動かなくなるので別途オークションで入手しておくといいかもしれませんね。

 

 

CPUを特定しよう

次にECUの基板に搭載されているCPUを特定します。基板上でひと際大きく、別格感を醸し出しているかっこいいチップがCPUです。チップ上の僅かに読み取れる刻印を頼りにネットを検索すると、MC68HC16R3というモトローラ社のCPUであることがわかりました。

デバッグインターフェースを特定しよう

この手の基板で使われているCPUにはオンチップデバッグ機能が実装されています。CPUで動作するプログラムを開発する際に使用する機能で内臓メモリの読み書きもできたりします。オンチップデバッグの呼称はCPUによって異なったりもするのですが、CPUのデータシートを参照するととりあえずその呼称は判明します。MC68HC16R3の場合、BDMというオンチップデバッグの機能が使えることが分かりました。

デバッガを買おう

オンチップデバッグの種類が判明したらデバッガを買います。今回BDMデバッガとして入手したのはP&E社のUSB Multilink Universal FXという以下のものです。購入時は10万円くらいでしたが、今はもっと高いかもしれませんね。

デバッガを接続しよう

デバッガを入手したら次はECUに実際に接続してみます。開発用の基板だとデバッガをそのまま刺せる親切なポートがあったりするのですが、製品版にはそんなものありません。基板上のパッドポイントと呼ばれる端子のうちどれがデバッグポートなのかを特定し、自分で信号線をはんだ付けしていきます。パッドポイントの特定が一番苦労するところなのですが、私の場合1カ月くらいかかりました。

読み出してみよう

いよいよECUのデータを読み出してみます。読み出しはECUに12Vを給電してデバッガ付属のソフトを立ち上げてやれば勝手にエントリーポイントで停止してくれます。ドキドキしながらデバッガソフトを立ち上げると、読めました!感無量です。

書き出してみよう

ここまでくると、あとはほとんど普通のマイコンボードと使い勝手は同じになります。読み出しで使ったデバッガ付属のソフトで書き込みをしてやれば任意のプログラムを実行することが可能です。

よく、どこそこの機器には脆弱性があって攻撃者が任意のプログラムを実行できる危険がある、という脆弱性情報のニュースを見ることがありますが、それでは攻撃者はこのようなデバッガソフトを使って書き込んでいるのでしょうか?

これは考えにくいです。わざわざ物理的に端末にアクセスしてはんだ付けから始める攻撃者なんていません。

ではどうやるのか?以下はデバッガソフトを使うことなく任意のプログラム(ひたすら「A」と出力するプログラム)を書き込んで実行してみたときの様子です。この手順についてはまた別の機会に記事を書きたいと思います。