← 他の記事もよんでみる
Available languages:
日本語

IoTデバイス解析の基本に関するメモ👶

目次

昨日今日と会社がおやすみだったのでIoTセキュリティの基本について勉強してみました。そのメモを残しておいてみます👶

どのようにしてルーターの中でlinuxやらPHPやらが動いているのか?

ルーターを起動すると管理画面が立ち上がります。こんなやつですね👀

wifiの管理画面のスクリーンショット
eo 「クイック設定Webのメニュー画面|eo光多機能ルーター」 https://support.eonet.jp/connect/net/multi_bbr/eo-rt100/quick/display_menu.html より

これはまごうことなきwebアプリですから、例えばPHPだったりが中で動いているはずだと思われます。

PHPなんかが動くということはOSも入っているはずです。
さて、ここでルーターの中にlinuxやら何やらが入っているのかなと言って中を見てみるとこんな感じだったりします。ありがとう、インターネットヲッチさん……!

ルーターの中に入っている基板の写真の上から、矢印で各部品に説明が加えられている。フラッシュメモリ、ネットワークプロセッサ、RAMなどが矢印で示されている。フラッシュメモリが基板の裏にあり、小さくて黒い四角い形をしている
INTERNET WATCH 「Wi-Fiルーターの中身はどうなっている? どう動く? Linksys「E7350」を分解してみた」 https://internet.watch.impress.co.jp/docs/column/shimizu/1449886.html より

開けたはいいもののめちゃ基板ですね。ここで本当にlinuxやPHPといったものたちが動くのでしょうか?
でも、よく考えてみると、普段触っているパソコンもディスプレイがあるだけで、計算機自身は基板のうえで動いているはずです。
基板にOSやらソフトウェアやらが保持されていて、電源を入れるとそれらがブートされ、CPUとメモリがいい感じに動くわけです(もちろんもっと他の部品もありますが)。

さて、当然このルーターの中にある基板の上にもOSとルーターソフトが永続化されているはずです

何が永続化されているのか、もう少し具体的に

こういった、IoTハードウェアの世界におけるOSやアプリケーションの永続化(もちろんユーザーデータや、そもそもファイルシステムも)はフラッシュメモリ(不揮発性メモリの一種)に行われることが多いようです。

In the world of IoT devices, data storage is a critical component. While many microcontrollers used in IoT devices have built-in internal storage, it's often not enough to handle the demands of complex IoT applications. This is where external flash storage, such as Serial Peripheral Interface (SPI) flash memory, comes into play.
External flash storage provides additional space where the device can store and retrieve data quickly and efficiently. This data can include the device's operating system, applications, and user data. The use of external flash storage allows for greater storage capacity, flexibility, and in some cases, better performance.
MADSEC "Unlocking IoT Secrets: Budget-friendly Cybersecurity Through SPI Flash" https://madsec.co.il/unlocking-iot-secrets-budget-friendly-cybersecurity-through-spi-flash-dumping/

永続化永続化といってきましたが、要するにCだとかRustだとかで開発したプログラムがコンパイルされて、フラッシュメモリという保存装置にバイナリとして書き込まれているということです。ルーターのフラッシュメモリの実際の見た目は、先ほどの写真にもあります。右下の説明です。

ルーターの中に入っている基板の写真の上から、矢印で各部品に説明が加えられている。フラッシュメモリ、ネットワークプロセッサ、RAMなどが矢印で示されている。フラッシュメモリが基板の裏にあり、小さくて黒い四角い形をしている
INTERNET WATCH 「Wi-Fiルーターの中身はどうなっている? どう動く? Linksys「E7350」を分解してみた」 https://internet.watch.impress.co.jp/docs/column/shimizu/1449886.html より

IoTデバイスの場合、ここに普通にバイナリが入っていますハードコードされた文字列やちょっとした関数名ならASCIIで書かれていて、然るべきソフトを使えば読める。そういう普通のバイナリです(もちろん最近のスマート家電やスマホではデータは暗号化されていますが)。

だから、もしも何らかの方法でこのバイナリを手にいれることができれば、下記の画像(実際にルーターを分解して吸い出したバイナリを読んでいるとのこと)のように読めるわけですね。ありがとう、ZDNET Japan。

バイナリエディターでバイナリファイルを開いて読んでいる様子
ZDNET Japan 「ルータを分解して体験するIoT機器のセキュリティ - 12/13」 https://japan.zdnet.com/article/35117818/12/ より

たとえば下記の記事も面白いです。自分でデータを書き込んで吸い出してみるという実験のようですが、要するにこういうことでしかないのです。コンパイルされてバイナリになったプログラム(とOSやファイルシステム)が丸ごとボンと入れられているだけです。それが吸い出せたら、当然読めます。

https://qiita.com/todotani/items/300c1cc1cce2383d3a04

このバイナリがメモリに読み込まれて、CPUにより実行されていきます。バイナリに書かれている命令セットはCPUにあわせて変わります。これは普段、C言語をコンパイルするときと同じですね。

さて、先ほども言ったように、もしも永続化されているこのバイナリを吸い出せばhexeditorやらGhidraやらbinwalkやらで解析できるわけです

解析?何のために?

解析って何のためにわざわざ?という方もいるかもしれませんが、攻撃者からするとIoTデバイスのソフトウェア的な脆弱性が発見しやすくなって便利ですよね。もちろん攻撃者に限らず言えば、研究をはじめとした様々な目的があると思います(※この記事のすべてに言えますが、IoTデバイスの分解や解析はきちんと法的な話を理解したうえで適切に行われる前提で話しています!!)。

例えば標的にした企業がwebカメラを使っていたとします。もし内部ネットワークに繋がる、かつ、外部からもアクセスできるような状態で使っていたとすると、外部ネットワークからそのwebカメラの脆弱性を突いて、webカメラの中のlinuxで任意コマンド実行し、内部ネットワークに対して色々するということができてしまいます。

このようなおいしいシナリオでなくてもIoTデバイスの脆弱性の活用はできます。たとえば、Shodanのようなインターネットに接続されたデバイスを検索できるサービスを使って、自分がゼロデイ脆弱性を持っているデバイスを見つけ、攻撃を仕掛けられます。このようなケースにおいてはbotnetを構築することなんかが目的になりえます。実際、IoTデバイスを掌握することによって形成されたbotnetがありました

Mirai scans the Internet for IoT devices that run on the ARC processor. This processor runs a stripped-down version of the Linux operating system. If the default username-and-password combo is not changed, Mirai is able to log into the device and infect it.
...[omit]...
The Mirai botnet employed a hundred thousand hijacked IoT devices to bring down Dyn.
https://www.cloudflare.com/learning/ddos/glossary/mirai-botnet/

そんなバハマ!(ゴー☆ジャス)と思う方は、この記事なんかを読むと現実感がわくと思います👶

https://note.com/hiro_shi_note/n/ndea5027cdcd9

どんなふうに吸い出せるっていうんだい?

永続化されたデータを丸ごと引き抜けば解析できて〜なんて言っていますが、実際そんなことできるのでしょうか?

正直に正面から吸い出す(命令セットを使って吸い出す)

「命令」をすれば読み取れる

よくよく考えてみると、そもそもハードウェアデバイスの開発をするためにはフラッシュメモリ(もしくはそれに準ずる保存装置)にデータを書き込めないといけません。また、デバイスが起動するためにはその保存されたデータがフラッシュメモリから読み込まれなければなりません(要するに、デバイスがブートされるときに絶対にデータは読み込まれるはずということ)。つまりフラッシュメモリについては読み取りも書き込みも当然できるはずなのです。じゃないとデバイスが動かない!

さて問題はそれを門外漢ができるのかということです。もちろん様々な防御機構があるのですが、すべてのデバイスがそこまでコストをかけることができないのも現実です。もしも何の防御機構もなければ、フラッシュメモリにペチペチと導線をつないで何かすればいけそうですね

基板にくっついているんだから何も接続できないだろうと思いますか?上から謎の装置で自分の基板に接続することができるようですね。

基板のうえから大きなクリップでフラッシュメモリと思われるチップを挟んでいる様子。クリップはPCにつながっている
Stuart 'Stevie' Leitch "Extract firmware from flash memory" https://www.dontpanicblog.co.uk/2025/01/02/extract-firmware-from-flash-memory/ より

もしくはハンダを吸い取ってフラッシュメモリをはがせばいいわけです。

さて「フラッシュメモリにペチペチと導線をつないで何かすればいけそう」と言いましたが、つなぐことはできそうですね。問題は何をすればいいのかです。

フラッシュメモリは命令セットを持っています。簡単に言うと、フラッシュメモリの特定のピン(複数かもしれない)に、フラッシュメモリの製造者が決めた順序・タイミングで電圧をかける(要するに0/1の信号を送ってあげる)ことで、フラッシュメモリは「いまから読み取るんだね?」とか「いまから書き込むんだね?」とか察してくれて、これまた特定のピンからデータを吐き出したり、受け取ってくれたりするわけです。要するに、フラッシュメモリが使っている通信インターフェースを特定して、自分の機器とフラッシュメモリをつないで通信を行い、フラッシュメモリにデータを吐き出させる命令を与えればデータが返ってくるということです。

命令を与えたら返ってくる、を具体的に見る

「何いってだこいつ」だと思うので例を見てみましょう。W25Q128FVというメジャーなフラッシュメモリのデータシートを見てみます。下記のメーカー(winbond)公式URLにアクセスするとダウンロードできます。

https://www.winbond.com/hq/support/documentation/levelOne.jsp?__locale=ja&DocNo=DA00-W25Q128FV

さて、このデータシートのP6にはチップの図があります。各ピンが何の役割を持っているか書いてあります。/CSとかの文字はSPIという通信インターフェースの用語ですが、一旦ここでは各ピンに名前がついていることがわかればそれで良いです。

データシートに掲載された各ピンの説明図。8本ある各ピンに名前がついている

さて、もっと下まで行くとP34には下の図が載っています。Read Dataという命令の説明です。これは宝物ですね。要するに先ほどの/CSCLKDIという3つのピンに対して、ここに書いてある通りのタイミングと順序で電圧を与えれば、DOというピンからData Outが起こる、つまりデータが吐き出されるというわけです!
たしかな証拠はありませんが、ルーターの起動時にも少なくともこのような読み出しが行われて、フラッシュメモリ内のファイルシステムやらOSやらプログラムがメモリに配置されるはずです。

データシートに掲載されたRead Data命令の電圧のシーケンス図。先ほどピンの名前として使用されていた単語の横に電圧の時間変化が書いてあり、Read Data命令を与えるための電圧信号であることが説明されている

さて、これで分かりました。要するにルーターの中身を吸い出す人たちというのは、先ほどのなんかすごいクリップを使って、この信号をフラッシュメモリに与えているわけです。そうすればデータが電気信号として吐き出されて、すごいクリップを伝わって、こちら側にくるという運びです

なお、信号を与えてと簡単に言っていますが、実際には便利なソフトを使うわけです。調べればなんか色々出てきますね。

Read Dataとは異なる面白い命令の1つにRead JEDEC IDというものもあります。要するにフラッシュメモリの種類がわかるわけです(型番がわかるのと同じ)。

The JEDEC assigned Manufacturer ID byte for Winbond (EFh) and two Device ID bytes, Memory Type (ID15-ID8) and Capacity (ID7-ID0) are then shifted out on the falling edge of CLK with most significant bit (MSB) first as shown in Figure 43a & 43b.

ROMを吸い出すソフトのいくつかはチップを自動特定することができますが、このような仕組みを使っているのだと思われます👀

いろいろな通信インターフェース

さて、ちなみに、いま取り上げたフラッシュメモリW25Q128FVはSPIという通信インターフェースを持っています。通信インターフェースは、実際にはSPIの他にもI2Cやパラレルなど様々な種類があり、インターフェースによってピンについている名前の種類も変わってくるわけです。なお、SPIは小型で済むしシンプルなので人気らしいです。

SPI flash memory, in particular, is a popular choice for IoT devices due to its low cost, small size, and ease of integration. It uses a serial interface to communicate with the host device, allowing it to operate with fewer pins and take up less space on the device's circuit board. This makes it an ideal choice for small, compact IoT devices.
MADSEC "Unlocking IoT Secrets: Budget-friendly Cybersecurity Through SPI Flash" https://madsec.co.il/unlocking-iot-secrets-budget-friendly-cybersecurity-through-spi-flash-dumping/

なお、SPIの仕組みは下記のページをご覧ください。本当にわかりやすかったです!!!!!ありがとうございます、こんな記事を書いてくださって😭

https://tool-lab.com/pic-practice-23

ちなみにW25Qxxという型番はSPIであることが多いようです👶

The W25Qxx is a common series of serial Flash chips.
...[omit]...
It is worth noticing that many (if not all) of these devices can operate in two different "modes". Regular SPI with a MOSI/MISO pair of signals, and Quad-SPI where 4 data lines are being used.
STM32World Wiki "W25Qxx" https://stm32world.com/wiki/W25Qxx

直接吸い出せない場合の手法

回路に用意されたデバッグ機構を使うアプローチ

故障時のデバッグサポートや出荷時の検品に使うためのデバッグ機構が回路に残っていることがあります。多くの場合はUARTやJTAGというインターフェースで実装されています。

Debugging is a cornerstone of embedded engineering, and debugging interfaces are the tools that make it possible. Whether you're tracking down intermittent bugs, verifying system behavior, or fine-tuning performance, UART, JTAG, and SWD are indispensable allies in your debugging arsenal.
RUNTIME "Using Debugging Interfaces: UART, JTAG, and SWD Demystified" https://runtimerec.com/using-debugging-interfaces-uart-jtag-and-swd-demystified/

回路に残っているってどういうことだってばよという感じですよね。実際に見てみましょう👶

まず、UARTが使えるデバッグ機構の見た目はこんな感じです。穴が並んでいます。

基板の上にあいている小さな4つの穴が赤い枠で囲まれている
Stuart 'Stevie' Leitch "Shell access over UART" https://www.dontpanicblog.co.uk/2025/01/03/shell-access-over-uart/ より

基板の上に小さな4つの穴があいている
ぷちのいず "kobo touch のUART" https://petit-noise.net/blog/kobo-touch-のuart/ より

次に、JTAGの見た目はこんな感じのようです。ピンが並んでいますね。


MITOUJTAG "12月1日 JTAGとは何か" https://www.tokudenkairo.co.jp/jtag/adv2018/01.php より

デバッグとはいえ実際何ができるのかというとUARTとJTAGでかなり異なってきます。

UARTはデバイスにもよりますが、デバイス上で動いているOSのターミナルに直接アプローチできることがあります。デバイスを起動しながらUARTに接続して、UARTから出てくる信号を適切に処理すれば画面にこんなものが出るケースがあります。Stuart 'Stevie' Leitchによる"Shell access over UART"からの引用です。

starting pid 881, tty '/dev/ttyS1': '/bin/login'
(none) login:

シェルが触れるなら色々なことができそうですね👶
そもそもコンソールがrootで叩ければそれでOKですし、叩けなくとも情報が得られる可能性があります。もちろん権限制約はあるものの、詳しい人たちはどうにかこうにかしたりしなかったりするのかなと思いを馳せます。

UARTの詳しい仕組みはこの記事が良さそうでした。

https://www.analog.com/jp/resources/analog-dialogue/articles/uart-a-hardware-communication-protocol.html

さて、JTAGは毛色が違って、こちらはCPUのデバッグなんかができるようです

JTAGはバウンダリスキャンで基板検査をするために作られた規格なのですが、バウンダリスキャンをする人がそもそもそんなに多くなかったのと、そもそも基板のエラーを100%の範囲(カバレッジという)を検出できないなどの理由により、「原始のJTAG」バウンダリスキャンを利用するのはごく一部の人たちに限られてきました。
しかし、JTAGを使えば、
ICの中のテスト回路と4本の線で通信ができるという手軽さ
コネクタや電圧・プロトコルが自由であること
コストの安さ
などがうけて、フラッシュROMやCPLD、FPGAの書き換え、CPUのデバッグ、FPGAの拡張機能との通信といった、オプション機能のほうが良く使われるようになってきました。
ほとんどの場合、JTAGの利用されている分野はCPUのデバッグか、FPGAの拡張機能でしょう。
MITOUJTAG "12月1日 JTAGとは何か" https://www.tokudenkairo.co.jp/jtag/adv2018/01.php

ただし実際にはCPUを実際に止めるための命令などはわからないことも多く、がんばって突き止める必要があるようです。このあたりはもう少し掘ってみたいです。

CPUデバッグやFPGA/CPLDシーケンスといった機能は、プライベート命令やオプションレジスタを使って実現しているので、半導体メーカーとNDAを結んだサードパーティしか知ることができないことが多いです。
MITOUJTAG "JTAGとは何か" https://www.tokudenkairo.co.jp/jtag/whatisjtag.html

JTAGがどうやってCPUデバッグを実現しているのかは、この記事が分かりそうでした👶

https://logmi.jp/main/technology/326186

実際にどんなふうにワークするのかは、この記事がよさそう。

https://riverloopsecurity.com/blog/2021/07/hw-101-jtag-part3/

ソフトウェア的なアプローチ

さて、上2つはかなりハードウェア的なアプローチでしたが、ソフトウェア的なアプローチもあります。

まず、用意された機能をうまく利用するケースがあります。たとえば「flash2advance」というゲームボーイアドバンスのカセットデータを吸い出すデバイスがあります。

http://akaneiro722.blog.fc2.com/blog-entry-9.html

これはマルチブート機能を利用しているとかしていないとか。マルチブート機能とは、ゲームボーイアドバンスでカセットを持っていない人とも自分のゲームで対戦可能だった「おすそわけ通信」(でしたっけ?)を支えてくれていた機能です。要するにカセットデータを相手のメモリに直接送ることで、相手の機器は持っていないカセットのデータをもらえるのでそれを起動できるわけです。これを利用すればゲームボーイアドバンスがカセットデータを送ってきてくれそうですね?👀

また、正面からソフトウェアの脆弱性をつくこともあります。たとえばルーターであれば、管理画面にRCE脆弱性があるなら、ダンプを実行して内部データをぜんぶ吐き出させればいいです。また、PS4なんかはwebkitの脆弱性を利用したjailbreakがちょっと調べると色々出てきます。

じつは、、、

吸い出すだの脆弱性を利用するだの言ってきましたが、メーカーが公式にファームウェア(簡単に言うとROMに入っている中身とほぼ同等)を公開していることも多々あるので、公式ページでダウンロードするのを試すのが手っ取り早いかもですね😂

そんな吸い出し放題なの?

さて、ここまできて、そんなに吸い出し放題なのかという疑問が生じます。

まず、吸い出しソフトが対応していないフラッシュメモリもあります。これは一部のフラッシュメモリがベンダー独自コマンドで実装されているからと聞いたことがありますが、どうなんでしょう。私にはそこまではわかりません。ただ、データシートさえ手元にあれば各命令の具体的な信号がわかるので理論上は対応できるはずですよね。したがって、逆にデータシートを隠すというのは一つの防衛手段としてカウントできそうです。

また、吸い出しを防ぐ機構もたくさんあります。例えばOn-The-Fly-Decryption(OTFD)。フラッシュメモリには暗号化したデータを入れておいて、使う時に復号するという機構です。フラッシュメモリから吸い出しても、復号できなければ意味がありませんね。ただし、こういう場合に先ほど紹介したJTAGなんかを使われると危ないので、しっかりデバッグ用の基板機構は塞いでおく必要があります。

フラッシュメモリには書き込むこともできますが、書き込みの防衛策もあります。たとえばSecure Bootは、署名されていないバイナリを動かさない仕組みです

Secure boot is a security standard developed by members of the PC industry to help make sure that a device boots using only software that is trusted by the Original Equipment Manufacturer (OEM). When the PC starts, the firmware checks the signature of each piece of boot software, including UEFI firmware drivers (also known as Option ROMs), EFI applications, and the operating system. If the signatures are valid, the PC boots, and the firmware gives control to the operating system.
Microsoft "Windows hardware developer documentation - Secure boot" https://learn.microsoft.com/en-us/windows-hardware/design/device-experiences/oem-secure-boot

ちなみにフラッシュメモリによっては書き込みを禁止する機能があります。さっきのW25Q128FVも"Write Protection"を持っているようです。下はデータシートからの引用です。

6.2 Write Protection
Applications that use non-volatile memory must take into consideration the possibility of noise and other adverse system conditions that may compromise data integrity. To address this concern, the W25Q128FV provides several means to protect the data from inadvertent writes.

ちなみに、読み取りや書き込みをできないようにしておこうねという話は、OWASP Internet of Things Projectでも"Poor Physical Security"として取り上げられています。

https://wiki.owasp.org/index.php/Top_10_2014-I10_Poor_Physical_Security

まとめ

なんだか面白い世界ですねえ👶
また面白いことがわかったら書きますね!

← 他の記事もよんでみる