初心者データサイエンティストの備忘録

調べたことは全部ここに書いて自分の辞書を作る

【読書記録】押さえておくべきIoTハッキング(第2章)

IoTのセキュリティを勉強しています。セキュリティの勉強は人生で初めてで、なかなか苦戦しています。

今回は、「押さえておくべきIoTハッキング」の第2章をまとめようと思います。 第1章については、自分が調査した内容も含めて下記の過去記事にまとめてあります。

aisinkakura-datascientist.hatenablog.com

やろうとしていること

第2章でやろうとしていることはシンプルです。Wifiルータからファームウェアを盗み出すことです。 具体的には、下記の2つの手順で盗み出します。

  1. 基盤を解析してファームウェアが入っているディレクトリを特定する
  2. ツールを使って、検証用PCにファームウェアを転送する

図1:目的と手段

基盤を解析してファームウェアが入っているディレクトリを特定する方法

ファームウェアが入っているディレクトリを特定するには、何はともあれ基盤に侵入する方法を見つけなければなりません。 そこでまずは、基盤に侵入する入口を見つけます。

送受信インターフェース

基盤に侵入する入口は、基盤が外とデータのやり取りをする機能を持った部分です。これを送受信インターフェースと言います。

多くの基盤において、4つのスルーホール*1が送受信ホールとなっています。これを利用し、目視で送受信ホールを探します。

次に、4つのスルーホールの役割を調べます。4つのスルーホールは、それぞれ4つの役割を持っています。

  • GND:グラウンドピン。いわゆるアースの役割を持つ。
  • Vcc:電源電圧ピン。基盤に電源を供給する役割を持つ。
  • TX:送信ピン。基盤からデータを送信する役割を持つ。
  • RX:受信ピン。基盤がデータを受信する役割を持つ。

4つのスルーホースは全て見た目が同じであり、どのピンがどの役割を担っているかは目ではわかりません。そこで、テストリード*2を使います。

  • GNDピンの見つけ方:テストリードをピンに接続し、もう片方のテストリードを任意のピンに接続したときに電気が流れるピン。
  • Vccピンの見つけ方:テストリードをピンに接続し、もう片方のテストリードを複数のピンに接続したときに一定の電圧が流れるピン。
  • TX、RXピンの見つけ方:テストリードからは見つけられないので、後述。

図2:送受信インターフェースについてのまとめ

JTagulator

JTagulatorとは、検証用PCと基盤をつなぐための機器です。JTagulatorを使うと、TX、RXピンを見つけられるだけでなく、その後のファームウェアの盗み出しを行うこともできます。

まずは、上記で特定したVccピン以外のピンにJTagulatorを物理的に接続します。 次に、検証用PCでターミナルエミュレータを立て、screenコマンドでJTagulatorに接続します。すると、検証用PCからJTagulatorの操作をすることができるようになります。

JTagulatorを操作できる状態になったら、Vコマンド*3とUコマンド*4を使ってTX、RXピンを特定します。そして最後にPコマンドを用いて、基盤のログインシェルにアクセスします。

図3:JTagulatorのコマンド

検証用PCにファームウェアを転送する方法

ここまでで基盤のログインシェルに侵入することができました。次は、侵入した基盤のファームウェアを盗み出す作業を行います。

まず、mount(操作・利用可能な状態)されているディレクトリを探します。 これはmountコマンドで得ることができます。

最後に、上記で得られたディレクトリを圧縮、ssh通信で検証用PCにデータを転送してファイル出力します。

まとめ

ここまでの作業をまとめると下記になります。

おまけ

IoTシステムへの攻撃の一つにサイドチャネル攻撃というものがあることを最近知りました。サイドチャネル攻撃とは、IoTデバイスから発せられる電波を基に、通信のやり取りに使われる認証情報などを盗み出す攻撃です。

本記事に書いたファームウェアの盗み出しも、それ自体が目的なのではなくファームウェアに含まれている認証情報を盗み出すことが目的です(第3章以降の内容)。

サイドチャネル攻撃というものが存在すると知ったとき、認証情報を盗み出す方法は色々あるんだなぁと思いました。

図4:今回勉強したこととサイドチャネル攻撃

*1:ピンが刺さっていない基板上の穴

*2:電気を流して回路の接続がどうなっているのかを調べるための機器

*3:UARTへの接続をするための設定をするコマンド

*4:通信仕様を調査するコマンド