設置されたBluetoothモジュールは、押し込めるファームウェアの質だけが頼りです。OTA(over-the-air) DFUはバグ修正、CVEクローズ、機能追加をトラック回送なしで行う手段です。本記事はBluetoothモジュールの更新アーキテクチャを扱います。デュアルバンク、署名イメージ、差分、ロールバックです。

更新トポロジ

Bluetoothモジュールは2つの方法でファームウェアを受け取ります。

  • 直接:スマホが接続しGATT経由でストリーム(消費者機器で典型)。
  • 間接:ゲートウェイがイメージをバッファし多数のモジュールへ中継(産業フリート)。

デュアルバンク vs シングルバンク

最も安全なBluetoothモジュール設計は2バンクを保持します。

方式 失敗時リスク ストレージ
シングルバンク 書込中電断で brick 1x
デュアルバンク(A/B) 失敗で旧バンク起動 2x
外部SPIフラッシュ staging 失敗で内部起動 1x + 外部

デュアルバンクは安全や収益が重要なものにflashの価値があります。

署名イメージ

署名なしコードは絶対焼かないでください。Bluetoothモジュールはバンク入替前に署名を検証します。

if Verify(pubkey, image_hash, sig) == OK:

swap_bank()

else:

reject_and_stay()

工場で焼いたルート鍵でECDSA P-256を使います。不良イメージは単に起動しません。

差分/部分更新

フルイメージは200-500KB。それを1万台のBluetoothモジュールに送るのは痛い。差分は変更ブロックのみを送ります。

patch = bsdiff(old_image, new_image) # 全体の5-20%程度

Bluetoothモジュールはstaging領域でパッチを適用し、結果ハッシュを検証してから入替ます。これで帯域と更新時間が劇的に減ります。

更新ステートマシン

規律あるBluetoothモジュール DFUはステートマシンとして動きます。

IDLE -> DOWNLOAD -> VERIFY -> SWAP -> REBOOT -> (OK | ROLLBACK)

チェックサム不一致は既知良好バンクへロールバックし失敗を報告。新バンク検証までは現バンクを消さないでください。

電力と時間

BLE経由1-2KB/sのDFUはフルイメージで数分、差分は数秒〜1分。ユーザーに警告し、給電を維持(または50%以上のバッテリ要求)、過熱回避で絞ります。

セキュリティ覚書

  • 送信元を認証:サーバーからの署名イメージのみ、暗号化チャネル上で。
  • 更新をレート制限しフラッシュを消耗するDoSを阻止。
  • プロトコルにバージョンを付け旧モジュールも更新。

署名デュアルバンクDFUと差分を持つBluetoothモジュールは、ファームウェア緊急事態を静かなバックグラウンドジョブに変えます。