九州・福岡・東京ときどきIoT

21年間のはてなダイアリー&アメブロからの避難所

ユーザーが勝手にプログラムを書き換えられないようにする方法

ESP32でも「ユーザーが勝手にプログラムを書き換えられないようにする」ことが可能です。ただしレベルによって方法が違い、**ソフト的ロック**と**ハード的ロック**があります。

デュポンケーブル

---

## 🔑 方法 1. ソフト的な禁止(ブートローダーの制御)

ESP32は標準で「UARTダウンロードモード」(書き込みモード)があり、
PCからUSBシリアル経由で書き換えが可能です。
これを防ぐ方法として:

1. **セキュアブート(Secure Boot)を有効化**

   * 初回書き込み時に署名済みのファームウェアしか起動できないようにする機能。
   * 不正なファームを書き込んでも起動できません。

2. **フラッシュ暗号化(Flash Encryption)を有効化**

   * 書き込み済みのプログラムを暗号化し、外部から読み出せないようにします。

3. **UARTブートローダーの無効化(EFuse設定)**

   * EFuseビットを焼くことで「UARTからの再書き込み禁止」にできます。
   * 一度設定すると元に戻せません。

---

## 🔒 方法 2. ハード的な禁止

* **GPIO0 を常時 High に固定**
  → 書き込みモードに入れないようにする。
* **USBシリアルの配線を外す**
  → PCから接続してもアップロードできなくなる。
* **書き込み用のEN/RSTボタンを基板から省略**
  → 簡単にはフラッシュモードに入れられない。

---

## ⚠️ 注意点

* **完全に禁止**してしまうと、開発者本人も将来のアップデートができなくなります。
* 一般的には

  1. Secure Boot + Flash Encryption を有効にする
  2. 必要ならUART書き込みを無効にする
     という手順が推奨です。
* OTA(Over The Air 更新)を残す設計も可能ですが、それも署名付きファームにしておかないと改ざんのリスクがあります。

---

✅ まとめ

* **可能**です。EFuse(セキュアブート/フラッシュ暗号化/UART無効化)を設定すれば、事実上ユーザーは書き換え不可能になります。
* ただし「一度焼いたら戻せない」ため、実機でやる前に必ずテスト用ボードで試すことを強くおすすめします。

---

ご要望としては、
👉 「自分も含めて完全に書き換え禁止」したいのか、
👉 「ユーザーだけ禁止、自分は更新可能」な状態にしたいのか、
どちらかを考えた上で対策下さい。