はじめに
I-O DATA の LAN DISK シリーズ(HDL-TA / HDL-TA2)は、ユーザーが意識することなくディスク全体を暗号化する機能を備えた NAS 製品です。本記事では、この暗号化がどのような仕組みで実装されているかを技術的に解説します。
なお、本記事は暗号化の仕組みの解説を目的としており、復号手順や復旧方法については扱いません。
ハードウェア構成
HDL-TA2 の基板には、以下の主要コンポーネントが搭載されています。
| コンポーネント | 型番例 | 役割 |
|---|---|---|
| SoC | Realtek RTD1295 (ARM Cortex-A53) | メインプロセッサ |
| DRAM | DDR4 | システムメモリ |
| SPI Flash ROM | GigaDevice GD25LQ16C (2MB) | ファームウェア・暗号鍵の格納 |
| HDD/SSD | SATA接続 | ユーザーデータの格納 |
暗号化において重要な役割を果たすのが、基板上に実装された SPI Flash ROM です。この小さなチップに、暗号鍵を含むファームウェアが格納されています。
SPI Flash ROM の内部構造
2MB の SPI Flash ROM をダンプすると、以下のような構造になっています。
Offset 内容
0x000000 ブートローダー / ARM ベクタテーブル
... ファームウェアコード(ARM命令列)
0x100000 JFFS2 ファイルシステム(〜末尾まで)
JFFS2 ファイルシステム
ROM の後半(オフセット 0x100000〜)には、JFFS2(Journalling Flash File System version 2) が格納されています。JFFS2 は、フラッシュメモリ向けに設計されたログ構造型ファイルシステムで、ウェアレベリングやパワーロス耐性を備えています。
この JFFS2 には以下のファイルが含まれています。
| ファイル名 | inode | サイズ | 用途 |
|---|---|---|---|
minimal_jffs2 |
2 | – | JFFS2 初期化用マーカー |
lksystem |
3 | 32 bytes | システム暗号鍵 |
lkdata |
4 | 32 bytes | データパーティション暗号鍵 |
JFFS2 のデータ構造
JFFS2 は、フラッシュメモリの性質上、ファイルの内容を上書きせず、新しいデータノードを追記していきます。ファイルが更新されるたびに新しいノードが書き込まれ、最新バージョンのノードが有効なデータとなります。
JFFS2 ノード構造(inode data node):
+0x00 magic (2 bytes) = 0x1985
+0x02 node_type (2 bytes) = 0xE002 (inode)
+0x04 totlen (4 bytes) = ノード全体の長さ
...
+0x0C ino (4 bytes) = inode 番号
+0x10 version (4 bytes) = ノードバージョン(単調増加)
...
+0x1C isize (4 bytes) = ファイルサイズ
+0x2C offset (4 bytes) = ファイル内オフセット
+0x30 csize (4 bytes) = 圧縮後サイズ
+0x34 dsize (4 bytes) = 展開後サイズ
+0x38 compr (1 byte) = 圧縮方式(0 = 無圧縮)
...
+0x44 data[] = 実データ
暗号鍵 lkdata は 32 バイトと小さいため、4 バイトずつ書き込まれた複数のノードから再構築する必要があります。また、鍵が更新されると新しいバージョンのノード群が追記されるため、ROM 内には複数世代の暗号鍵が残存しています。
鍵の特性
lkdata の内容は 32 バイトの高エントロピーなバイト列で、NAS の初回セットアップ時にランダム生成されます。
エントロピー分析:
サイズ: 32 bytes (256 bits)
エントロピー: 約 4.5〜5.0 bits/byte
→ AES-256 の鍵として十分なランダム性
鍵はデバイスごとに一意であり、同じ型番の別の個体とは異なる鍵を持ちます。このため、SPI Flash ROM が破損・消去されると、そのデバイス固有の暗号鍵が失われることになります。
ディスクのパーティション構成
HDL-TA2 の内蔵ディスク(HDD/SSD)は GPT パーティションテーブルを使用し、以下のような構成になっています。
パーティション サイズ タイプ 用途
1 512 MB EFI System ブート
2 2 GB Linux RAID システム (md RAID1)
3 1 GB Linux Swap スワップ
4 128 MB Linux filesystem 設定データ
5 1 GB Linux RAID ログ等 (md RAID1)
6 残り全部 Linux RAID データ (md RAID1)
md RAID の使用
注目すべき点として、シングルディスクモデルでも md RAID1(ミラーリング)が使用されています。パーティション 6 は linux_raid_member としてマークされ、md デバイス(例: /dev/md13)として構成されます。RAID1 でありながらディスクは 1 台のみという構成です。
これは I-O DATA のファームウェアが、シングルディスクモデルと RAID モデル(HDL2-TA 等)で共通のソフトウェアスタックを使用しているためと考えられます。
暗号化レイヤー
データの暗号化は、Linux カーネルの dm-crypt サブシステムを使用して実装されています。
暗号化スタック
アプリケーション
↓
XFS ファイルシステム
↓
dm-crypt (暗号化/復号)
↓
md RAID1 (パーティション6)
↓
物理ディスク
dm-crypt のパラメータ
HDL-TA2 で使用されている dm-crypt の設定は以下の通りです。
| パラメータ | 値 | 説明 |
|---|---|---|
| type | plain | LUKS ではなく plain モード |
| cipher | aes-cbc-plain | AES-CBC、IV は平文セクター番号 |
| key-size | 256 | 256 ビット鍵 |
| key source | lkdata (raw) | SPI ROM 内の生バイト列をそのまま使用 |
plain モード vs LUKS
dm-crypt には大きく分けて LUKS(Linux Unified Key Setup) と plain の 2 つのモードがあります。
LUKS モードは、暗号化ヘッダーをディスクの先頭に書き込み、パスフレーズから鍵を導出する仕組みです。鍵の変更やマルチユーザー対応が可能ですが、ヘッダー領域が必要です。
plain モードは、ヘッダーを一切書き込まず、指定された鍵でディスク全体をそのまま暗号化します。ディスク上に暗号化されていることを示す痕跡が残りません。HDL-TA2 はこの plain モードを採用しています。
cipher: aes-cbc-plain の意味
aes-cbc-plain は以下の 3 つの要素から構成されます。
- aes: 暗号アルゴリズム(AES = Advanced Encryption Standard)
- cbc: ブロック暗号モード(CBC = Cipher Block Chaining)
- plain: IV(初期化ベクトル)の生成方式
IV 生成方式 “plain” の仕組み
CBC モードでは各ブロックの暗号化に IV が必要です。dm-crypt の plain IV 方式では、セクター番号の下位 32 ビットをリトルエンディアンで 16 バイトにゼロパディングしたものを IV として使用します。
セクター番号 0x00001234 の場合:
IV = 34 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00
~~~~~~~~~~~
LE 32-bit sector number
この方式は実装がシンプルですが、セクター番号が 2^32 を超えるとIVが巻き戻るという制限があります(約 2TB で発生)。より新しい実装では plain64(64 ビットセクター番号)や essiv:sha256(暗号化されたセクター番号)が使われますが、HDL-TA2 では plain が採用されています。
鍵の使用方法
dm-crypt の plain モードでは、--hash パラメータによって鍵ファイルの処理方法が決まります。
| –hash 指定 | 動作 |
|---|---|
| 未指定 | 鍵ファイルを ripemd160 でハッシュしてから暗号鍵として使用 |
| plain | 鍵ファイルの内容をそのまま暗号鍵として使用 |
HDL-TA2 のファームウェアは、lkdata の 32 バイトをハッシュせずにそのまま AES-256 の鍵として dm-crypt に渡しています。
ファイルシステム
暗号化レイヤーの上には XFS ファイルシステムが構築されています。
XFS スーパーブロック:
magic = "XFSB" (0x58465342)
blocksize = 4096 bytes
sectsize = 4096 bytes
format = V4 (crc=0)
XFS V4 フォーマット(CRC なし)が使用されており、これは比較的古いバージョンの mkfs.xfs で作成されたことを示しています。
暗号化アーキテクチャの全体像
┌─────────────────────────────────────────────┐
│ SPI Flash ROM (2MB) │
│ ┌────────────────┐ ┌───────────────────┐ │
│ │ Bootloader / │ │ JFFS2 │ │
│ │ Firmware │ │ ├── lkdata (32B) │ │
│ │ (ARM code) │ │ └── lksystem(32B) │ │
│ └────────────────┘ └────────┬──────────┘ │
│ │ │
└───────────────────────────────┼──────────────┘
│ AES-256 key (raw)
↓
┌───────────────────────────────────────────────┐
│ HDD / SSD │
│ ┌──────────┬──────┬──────┬──────┬──────────┐ │
│ │ EFI(p1) │sys │swap │conf │ data(p6) │ │
│ │ 512MB │(p2) │(p3) │(p4) │ 残り全部 │ │
│ └──────────┴──────┴──────┴──────┴────┬─────┘ │
│ │ │
│ md RAID1 (1台構成) │
│ │ │
│ dm-crypt (plain mode) │
│ AES-256-CBC-plain │
│ │ │
│ XFS (V4) │
│ │ │
│ ユーザーデータ │
└───────────────────────────────────────────────┘
セキュリティ上の考察
利点
- 透過的暗号化: ユーザーが意識することなく、ディスク上の全データが暗号化される
- ディスク単体での読み取り防止: HDD/SSD を取り出しても、暗号鍵なしではデータを読み取れない
- 鍵の物理的分離: 暗号鍵はディスクではなく基板上の SPI ROM に格納されており、ディスク上に鍵の痕跡がない
制限
- plain モードの特性: LUKS のようなヘッダーがないため、暗号化されているかどうかの判別が困難。同時に、鍵の正当性を検証する仕組みもない
- CBC-plain の IV 制限: セクター番号の下位 32 ビットのみを IV に使用するため、2TB を超えるディスクでは IV の衝突が発生する
- SPI ROM への依存: 暗号鍵は SPI ROM のみに格納されているため、基板の故障や ROM の破損はデータ喪失に直結する
- 鍵のバックアップ手段なし: ユーザーが暗号鍵をエクスポート・バックアップする機能は提供されていない
まとめ
I-O DATA HDL-TA/HDL-TA2 は、SPI Flash ROM 内の JFFS2 ファイルシステムに格納された 32 バイトの暗号鍵を使い、dm-crypt の plain モード(AES-256-CBC-plain)でデータパーティションを暗号化しています。
この設計は、NAS の通常運用においてはユーザーに透過的なセキュリティを提供しますが、基板の物理的な故障やSPI ROMの破損時には、暗号鍵の喪失によるデータアクセス不能というリスクを内包しています。
暗号化 NAS を運用する際は、暗号鍵がハードウェアに紐づいていることを理解し、定期的な外部バックアップを行うことが重要です。
本記事は、データサルベージのデータ復旧業務における技術調査に基づいています。
記載内容は特定ファームウェアバージョンでの調査結果であり、他のバージョンでは異なる可能性があります。













