SPIフラッシュダンプの実施方法解説

はじめに

組み込みデバイスやIoT機器には、多くの場合、内部にファームウェアや設定情報を保存するフラッシュメモリが搭載されています。
特に、**SPI(Serial Peripheral Interface)**という規格で接続されたフラッシュメモリは、小型かつ高速な通信を特徴とし、幅広い製品で採用されています。

本記事では、SPIフラッシュダンプとは何か、その目的、仕組み、活用される場面について、わかりやすく解説します。


SPIフラッシュダンプとは?

SPIフラッシュダンプとは、
SPI接続されたフラッシュメモリから保存されている全データを読み出してファイル化する作業を指します。

このダンプ(dump)作業によって、ファームウェア、設定情報、シリアル番号、暗号鍵など、
デバイスの動作に関わる内部データを丸ごと取得することが可能になります。

通常、データはバイナリ形式(.binファイルなど)で保存され、後から解析やバックアップに利用されます。

SPIとは?

**SPI(Serial Peripheral Interface)**は、
マイコンと周辺機器(フラッシュメモリ、センサーなど)を接続するためのシリアル通信プロトコルです。

特徴としては、

  • 高速な通信速度
  • フルデュプレックス通信(同時に送受信可能)
  • シンプルな配線(4本:MOSI, MISO, SCLK, CS)

などがあり、組み込み機器に最適な規格となっています。


なぜSPIフラッシュダンプを行うのか?

SPIフラッシュダンプは、以下のような目的で実施されます。

目的内容
ファームウェア解析デバイス内部のソフトウェア動作やプロトコル仕様を調査するため
バックアップ作成破損やアップデート失敗時に備え、元の状態を保存しておくため
デバイスのクローン作成同じハードウェアを複製・再現するため
セキュリティ調査ハッキングや脆弱性診断のため、内部データを抽出・分析するため

近年では、セキュリティリサーチやリバースエンジニアリングの分野で、
ファームウェアレベルからの脆弱性発見に活用されるケースが増えています。

概要

SPI (Serial Peripheral Interface) からファームウェアを抽出できる可能性がある。 マスターとスレーブ間で通信を行い、4種類の信号線を使用する。

  • SCLK / SCK (Serial Clock) 同期を取るための信号線。 通常はマスター→スレーブの一方向
  • MISO (Master In Slave Out) スレーブからマスタにデータを転送する信号線
  • MOSI (Master Out Slave In) マスタからスレーブにデータを転送する信号線
  • SS / CS (Slave Select / Chip Select) マスタが通信相手のスレーブを選択するための信号線

使用するツール

手順

ピン配置確認

チップからデータシートを調べ、ピン配置を確認する。

Attify Badgeとの接続

確認した配列をもとにクリップとAttify Badgeを以下のように接続する。

NumFlash Chip PinAttify Badge Pin
1CSD3
2SI/SIO1 (MISO)D1
3WP/SIO23.3V
4GNDGND
5SO/SIO0 (MOSI)D2
6SCLKD0
7RESET/SIO33.3V
8VCC3.3V

クリップとチップの接続

チップの横に丸マークがあるのが1番のCSになり、赤紫のケーブル部と接続する。

クリップとPCの接続

USBでPCと接続し、Attify Badgeが認識されていることを確認する。 下記では、「/dev/ttyUSB0」で認識されているのを確認したものになる。

% ls /dev/ttyUSB0
/dev/ttyUSB0

spiflash.pyのインストール

必要なライブラリをインストールする。

% sudo apt install swig libftdi-dev python-dev

ツールをgitからダウンロードし、インストールを行う。

% git clone https://github.com/devttys0/libmpsse.git
/opt/libmpsse

% cd /opt/libmpsse/src
% ./configure
% make
% make install

「spiflash.py」を実行しダンプを行う。

$ sudo spiflash.py -s 5120000 -r dump.bin
FT232H Future Technology Devices International, Ltd initialized at 15000000 hertz
Reading 5120000 bytes starting at address 0x0...saved to dump.bin.

binwalkを使用して、ファイルの中身を確認する。

$ binwalk dump.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
6800          0x1A90          LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 56784 bytes
46932         0xB754          Unix path: /5/G/Y/k/
61348         0xEFA4          Unix path: /a/D/V/h/z/
63847         0xF967          Unix path: /N/6/H/Z/l/~/
65552         0x10010         bzip2 compressed data, block size = 900k
131088        0x20010         bzip2 compressed data, block size = 900k
272408        0x42818         LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 3309448 bytes
1376256       0x150000        Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 1762631 bytes, 500 inodes, blocksize: 131072 bytes, created: 1902-06-11 17:04:00
3145666       0x2FFFC2        LZMA compressed data, properties: 0x5D, dictionary size: 131072 bytes, uncompressed size: 125132 bytes
3198077       0x30CC7D        LZMA compressed data, properties: 0x5D, dictionary size: 131072 bytes, uncompressed size: 87020 bytes
3222549       0x312C15        LZMA compressed data, properties: 0x5D, dictionary size: 131072 bytes, uncompressed size: 100817 bytes
3261608       0x31C4A8        LZMA compressed data, properties: 0x5D, dictionary size: 131072 bytes, uncompressed size: 125452 bytes
4201104       0x401A90        LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 56784 bytes
4241236       0x40B754        Unix path: /5/G/Y/k/
4255652       0x40EFA4        Unix path: /a/D/V/h/z/
4258151       0x40F967        Unix path: /N/6/H/Z/l/~/
4259856       0x410010        bzip2 compressed data, block size = 900k
4325392       0x420010        bzip2 compressed data, block size = 900k
4466712       0x442818        LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 3309448 bytes

ddコマンドを使用してファームウェアを抽出する。

$ dd if=dump.bin skip=1376256 bs=1 count=$((3145666-1376256)) of=firmware.sfs
1769410+0 レコード入力
1769410+0 レコード出力
1769410 bytes (1.8 MB, 1.7 MiB) copied, 3.21036 s, 551 kB/s
$ file firmware.sfs
firmware.sfs: Squashfs filesystem, little endian, version 4.0, 1762631 bytes, 500 inodes, blocksize: 131072 bytes, created: Sat Jul 17 23:32:16 2038

あとは抽出したファームウェアを煮るなり焼くなりすればOK!

まとめ

SPIフラッシュダンプは、デバイス内部の情報を直接取得し、解析・保護・再利用するための強力な手段です。

組み込み機器やIoTデバイスのファームウェア調査において、不可欠なスキルのひとつと言えるでしょう。
正しい知識と技術、そして倫理観を持って活用することが重要です。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です