まず、ファームウェアをどう手に入れるか
IoTデバイスの解析、ね。…そう、まあ、何かしようと思ったら、まずファームウェアをどうやって手に入れるか、って話になるんですよね。5年とか10年前なら、正直、話は簡単で。メーカーのサイトに行けば、だいたい置いてあった。今でもそういう親切なケースもあるけど、まあ、減りましたよね。…なので、今は「これさえやればOK」みたいな方法はなくて。いくつか、簡単なものから、すごく…骨が折れるものまで、やり方があるって感じです。
一番楽な道:公式サイトからダウンロード
まあ、まず最初に試すのはこれですよね。メーカーがまだファームウェアを公開してくれてるかもしれない。…たとえ公式にはなくても、誰かがどこかにリークしてたり、一部が転がってたりすることもある。だから、普通にググるだけじゃなくて、個人的にはGitHubでファイル名とかで検索するのは結構おすすめです。…うん。もし見つかったら、それが一番早い。
次に試すこと:アップデートを横から覗く (中間者攻撃)
ダウンロードがダメだった場合。デバイスに「アップデート」みたいなピカピカのボタンが一つだけ付いてたら、それを押してみる価値はあります。…でも、その前に、PC側で通信を全部キャプチャする準備をしておくのが大事。Bettercapとか、mitm-proxyとか、ツールはいろいろありますけど。
ここでの狙いは、なんていうか…開発者がアップデートファイルを暗号化されてない、ただのHTTPで配信してる可能性。今どきHTTPSが当たり前だって言われてるけど、意外とまだあるんですよ、こういうの。もしそうなら、通信データからアップデート用のファイルを引っこ抜くだけ。簡単ですよね。
…でも、まあ、最近はだいたいHTTPSですよね。じゃあダメかというと、そうでもなくて。シナリオが2つ考えられます。
一つは、デバイスがスマホアプリとかと連携してない、スタンドアロンで動くタイプ。この場合、こっちで作った自己署名の証明書をデバイスに信じ込ませる、っていうのを試す価値はあります。意外と成功したりする。
もう一つが、スマホアプリ必須の、よくあるスマートデバイス。この場合、ファームウェアのダウンロード処理自体が、アプリ側に入ってるかもしれない。それなら、使うスマホかエミュレーターに、自分で作ったルート証明書をインストールしてみる。もし、これでアプリがネットに繋がらなくなったら…それはSSLピニングが使われてる証拠です。もちろん、Fridaみたいなツールを使えば、このSSLピニングを回避するテクニックもあるんですけど…これはこれでまた別の深い話になるので。アメリカのRedfoxsecのブログとかに詳しい記事がありますね、[Hail Frida!!]とかいうタイトルの。あれは参考になる。
もし、それでもダメなら…いよいよリバースエンジニアリングの世界です。友達、頑張って。
ちょっと面倒な話:脆弱性をついて抜き取る
ここからが、なんていうか、本番というか…面倒になってくるところで。まだ開発中のデバイスとか、そもそもアップデート機能がないやつとか、あるいはメーカーの認定技術者しか更新できない特殊なものとか。そうなると、もう小手先の技は通用しない。
運が良ければ、そのデバイスに古い、未修正の脆弱性が残ってて、それを使ってrootシェルを取って、無理やりファームウェアをダンプできるかもしれない。もし公開されてるエクスプロイトコードまであったら、もう、宝くじに当たったようなもの。まあ、普通はないですけどね。…なので、自分でエクスプロイトを開発することになる。でも、脆弱性の情報が少しでもあるなら、ゼロからやるよりはずっと楽です。
…でも、「脆弱性を探すためにファームウェアが欲しいのに、そのファームウェアを手に入れるために脆弱性が必要って、おかしくない?」って思いますよね。うん。でも、ブラックボックステストっていう手法がなくなったわけじゃないので。もちろん、ファームウェアなしでやるのは難しい。だから、少しだけ自分たちのために、ゲームを簡単にしてみるんです。
一番価値があって、恐れられてる脆弱性って、認証なしで悪用できるものですよね。研究者のほとんどはそれを探すし、メーカーもそこを重点的に固める。…でもね、認証後の、例えば管理者権限でログインした後に初めて突ける脆弱性ってどうでしょう。攻撃できる範囲は広がるし、ターゲットはずっと柔らかくなる。ここで比較的簡単に見つかるコード実行の脆弱性を見つけて、まずファームウェアをダンプする。そして、そのファームウェアを使って、もっと面白い、もっと価値のある脆弱性を探すんです。…そういう二段構え。結構現実的なアプローチだと思いますよ。
最後の手段:物理的にやる(ハードウェアハック)
物理的な方法は、一般的には難しい。…けど、場合によっては、さっきの脆弱性を自力で見つけるよりは、楽なこともある。不思議なもんで。
大きく分けて、2つのアプローチがあります。ハードウェア自体の脆弱性を探して悪用するか、フラッシュストレージから直接ファームウェアを読み出すか。
デバッグインターフェースを狙う
まず、UART。これはIoTデバイスでよく見かける診断用のインターフェースで、結構な確率で有効なまま残されてます。TX、RX、GNDのピンを見つけて、USBシリアル変換アダプタを繋げば、コンソールにアクセスできることがある。運が良ければ、rootシェルやブートローダーのシェルがそのまま手に入ったりする。…日本の電子工作好きなら、秋月電子通商とかで数百円でアダプタ買えますよね。これは、ハードウェアハックの入門としては、かなり手が出しやすい方です。
次に、JTAG/SWD。これはもっと低レベルで、チップのテストやデバッグ用に設計されたインターフェース。CPUに直接アクセスできる。…ただ、基板上のどこにそのピンがあるか見つけるのが最初の関門。メーカーも当然この存在は知ってるから、無効化したり、パスワードで保護したりしてることも多い。でも、まあ、してないこともある。試してみなきゃ、ハッカーじゃないですよね?
フラッシュチップと格闘する
我々が血眼になって探してる、その甘美なファームウェアは、どこかに保存されてるわけです。ほとんどのスマートデバイスでは、それはフラッシュチップの中。そこにあるなら、そこから読めるはず。実際、デバイスが起動するときにCPUがやってるのは、まさにその作業です。でも、我々にはCPUへのアクセス権がないから、別の方法を探すしかない。
チップを基板から剥がさずに、SPIとかの通信を覗き見(スニッフィング)する方法もあります。ロジックアナライザで。でも、これだと起動時に読み込む一部しか取れないことが多い。…結局、チップを完全に制御して、全部読み出す必要が出てくる。
そうなると、チップを基板から取り外す「chip-off」という作業になります。これがまあ…大変。はんだごてで。QFPみたいな足が見えてるパッケージならまだしも、BGAっていう、チップの下にボール状のはんだが隠れてるタイプは、もう専門的な機材と技術が要ります。ヒートガンで基板全体を傷つけないように、均等に熱して…。正直、慣れてないとチップか基板、どっちか壊しますね。
あ、そういえば、低融点合金っていう便利なものがあって。チップの足にそれを塗ると、元々のはんだと混ざって、融点がすごく下がるんです。これを使うと、基板をあまり熱しなくても、安全にチップを剥がしやすくなる。これは覚えておくといいかも。
で、結局どれをやればいいの?
ここまで色々な方法を話してきたけど、結局、状況によって選ぶしかないんですよね。…ちょっと、個人的な感覚でまとめてみますか。
| 手法 | 難易度(感覚) | 必要なもの | 個人的なコメント |
|---|---|---|---|
| 公式サイトからDL | ★☆☆☆☆ (超簡単) | 根気と検索スキル | まずこれをやる。なかったら次。これで終われば一番幸せ。 |
| アップデート傍受 (HTTP) | ★★☆☆☆ (簡単) | Wiresharkとか。 | 意外とまだある。ラッキーパンチ狙い。 |
| アップデート傍受 (HTTPS) | ★★★☆☆ (普通) | mitm-proxy, Frida | SSLピニングされてると急に面倒になる。Fridaは一度使い方を覚えれば強い味方。 |
| 脆弱性を利用 | ★★★★☆ (難しい) | 深い知識と時間と運 | 既存の脆弱性があれば楽だけど…。自力で見つけるのは、もうそれが本業の人。 |
| UARTでシェル取得 | ★★★☆☆ (物理的には楽) | USBシリアル変換アダプタ | ハードウェア入門に最適。これで取れたらすごく嬉しい。コストも低いし。 |
| JTAG/SWDでデバッグ | ★★★★☆ (難しい) | J-Link等のデバッガ | ピン探しが大変。デバッガも安くない。でも、やれることは多い。 |
| チップ取り外し (Chip-off) | ★★★★★ (超難しい) | はんだごて、ヒートガン… | 手が震える作業。BGAは本当にやめてほしい…個人的には一番やりたくない。 |
採購/預算思路
で、こういうツールっていくらかかるの?って話。これも大事ですよね。
Wiresharkみたいなネットワーク監視ツールは無料。mitm-proxyも。だから、ソフトウェアだけで完結するうちは、お金はかからない。…でも、ハードウェアの世界に足を踏み入れると、ちょっと変わってきます。
UARTのためのUSBシリアル変換アダプタは、本当に安くて、1000円以下で買える。ロジックアナライザも、安いやつなら数千円から。この辺は趣味でも手が出しやすい。
ただ、JTAG/SWD用の本格的なデバッガ、例えばSEGGERのJ-Linkとかになると、もう数万円から、高いモデルはもっとします。UFS用のプログラマなんて、正直、個人で買うのは現実的じゃない価格だったりする。…だから、どこまで深追いするかは、お財布との相談になりますね。
反例與誤解釐清
最後に、よくある誤解というか、思い込みについて少し。
一つは、「ファームウェアがないと脆弱性は探せない」。さっきも言いましたけど、これは違います。認証なしで外から試せること、いっぱいありますよね。もちろん、あれば楽です。でも、なくても道はある。
もう一つは、「ハードウェアハッキングは専門家じゃないと無理」。これも、半分正解で半分間違い。確かに、BGAチップをリボールするみたいなのは専門技術です。でも、UARTのピンを見つけて繋ぐくらいなら、電子工作の初心者でも、やり方を調べれば 충분히できます。日本の総務省とかIPAもIoTセキュリティの注意喚起で物理ポートの話を出したりしますし、そこはもう基本的なチェック項目、という認識ですね。最初から全部諦める必要はないです。
結局のところ、どこまでやるか、ですね。簡単なダウンロードから、アップデートの傍受、そしてUART。この辺りまで試すだけでも、かなりの数のデバイスは解析の糸口が見つかるんじゃないかな、と個人的には思います。
…さて、皆さんはどこから手を出してみたいですか?まずは簡単なアップデートの傍受から試してみますか?それとも、思い切ってはんだごてを握ってみますか?もしよければ、コメントで教えてください。
