量産に向けてデバッグ機能を閉じる

ここでは、デバッグ機能を閉じる方法とその影響について説明します。

デバッグ機能は開発の効率を向上させるために開発フェーズではなくてはならないもの です。製品が市場に出荷されると市場不良の解析にも効果を発揮します。 しかし、開発者にとって便利であるということは、同時に攻撃者にとっても 便利な解析手段となり得ます。 想定される製品の運用形態によって、デバッグ機能が必須である運用形態もあります。 セキュリティリスクとのトレードオフになる可能性があるので、有効にするかどうかを 検討することをお勧めします。

[重要項目]

デバッグ機能を閉じることは開発者と攻撃者だけでなく、アットマークテクノによる 解析についてもトレードオフになります。閉じられたインターフェースを利用した解析が できなくなることをご留意いただきますようお願いします。

7.1. JTAG と SD boot を無効化する

Armadillo-IoT ゲートウェイ G4/Armadillo-X2 の出荷時は、JTAG ポートは有効なままで出荷されます。 当たり前ですが JTAG が有効なままだと攻撃者のコードを走らせたり、 メモリをダンプして鍵を抜いたり、平文データを抜いたりと何でも可能です。 市場に出荷される最終段階では JTAG を無効化することをお勧めします。

次に、SD boot は SD メディアを挿すだけで起動する便利な機能です。その反面、 SD メディアの盗難や流出によってシステムへの侵入、SD boot を利用した セキュアブート鍵に対する攻撃が考えられます。これらのリスクは、SD boot を無効に することで排除することが可能です。しかし、SD boot はシステムの復旧の役割も 担っています。SD boot を無効化することによって、eMMC boot が起動できない 状態に 陥った場合、合わせてJTAG の無効化が合わせて設定されていると、二度と復旧すること ができないデバイスになる (廃棄するしかない) 可能性があることを考慮してください。

ソフトウェアの開発が完了し量産段階に入ると、量産用 Armadillo にソフトウェアを書き込むための インストールディスクが必要になります。 Armadillo Base OS では開発が完了した Armadillo 上でコマンドを実行することにより、 その Armadillo のルートファイルシステム及びブートローダーをそのまま インストールディスクイメージとして作成することができます。 詳細な情報は以下の製品マニュアルを参照してください。

JTAG と SD boot を無効化したインストールディスクを作成するには abos-ctrl make-installer コマンドを実行する前に、 abos-ctrl installer-setting コマンドで設定します。

[注記]

作成したインストールディスクを使用して初期化した Armadillo の JTAG と SD ブートを無効にする設定であり、 開発用の Armadillo の JTAG と SD ブートが無効になることはありません。

[armadillo /]# abos-ctrl installer-setting
Would you like to disable JTAG in the installer ? [y/N] 1
y
JTAG disabled setting for production Armadillo has been configured.
Would you like to disable SD boot in the installer ? [y/N] 2
y
SD boot disabled setting for production Armadillo has been configured.

図7.1 インストールディスクのJTAG と SD boot を無効化する


1

JTAG を無効化する場合は y を入力します。無効化しない場合は何も入力せず Enter キーを押してください。

2

SD ブートを無効化する場合は y を入力します。無効化しない場合は何も入力せず Enter キーを押してください。

現在の設定値を確認するには abos-ctrl check-secure コマンドを実行します。 disabled の場合は無効化する設定になっています。

[armadillo /]# abos-ctrl check-secure
- JTAG access disabled for mass production.
- SD boot access disabled for mass production.

図7.2 JTAG と SD ブートの設定値を確認する


設定をリセットするには --reset オプションを付けて abos-ctrl installer-setting コマンドを実行します。

[armadillo /]# abos-ctrl installer-setting --reset
cleaned up all settings.

図7.3 JTAG と SD ブートの設定値をリセットする


JTAG と SD boot の無効化設定を実行した後に、 abos-ctrl make-installer コマンドを実行してインストールディスクを作成します。 コマンド実行前に、Armadilloがインターネットに接続されており、かつ 10GB 以上の空き容量がある microSDカードが 挿入されていることを確認してください。 microSD カード内のデータはインストールディスク作成時に上書きされて消えてしまうので、 必要なデータは予めバックアップを取っておいてください。 コマンド実行例は以下のようになります。

[armadillo /]# abos-ctrl make-installer
Checking if /dev/mmcblk1 can be used safely...
It looks like your SD card does not contain an installer image
Download baseos-{product-image-name}-installer-latest.zip image from armadillo.atmark-techno.com (~170M) ? [y/N] 1
y
WARNING: it will overwrite your SD card!!

Downloading and extracting image to SD card...
Finished writing baseos-{product-image-name}-installer-[VERSION].img, verifying written content...

Would you like to create a windows partition?
That partition would only be used for customization script at the end of
install, leave at 0 to skip creating it.
Custom partition size (MB, [0] or 16 - 29014): 500 2
Checking and growing installer main partition
Trying to install mkfs.exfat (exfatprogs) in memory from internet
fetch https://download.atmark-techno.com/alpine/v3.19/atmark/{arch-name}/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/main/{arch-name}/APKINDEX.tar.gz
fetch https://dl-cdn.alpinelinux.org/alpine/v3.19/community/{arch-name}/APKINDEX.tar.gz
(1/1) Installing exfatprogs (1.2.2-r0)
Executing busybox-1.36.1-r15.trigger
OK: 148 MiB in 197 packages
exfatprogs version : 1.2.2
Creating exFAT filesystem(/dev/mmcblk1p2, cluster size=131072)

Writing volume boot record: done
Writing backup volume boot record: done
Fat table creation: done
Allocation bitmap creation: done
Upcase table creation: done
Writing root directory entry: done
Synchronizing...

exFAT format complete!
Resize device id 1 (/dev/mmcblk1p1) from 520.00MiB to max
Installer will disable JTAG access
Installer will disable SD boot after installation
Copying boot image
Copying rootfs
Copying appfs
At subvol app/snapshots/volumes
At subvol app/snapshots/boot_volumes
At subvol app/snapshots/boot_containers_storage
Cleaning up and syncing changes to disk...
Installer updated successfully!

図7.4 インストールディスクを作成する


1

y を入力します。

2

インストールディスク内にインストールログを保存したい場合など、自由に使用できる第2パーティションを指定したサイズ作成します。

「Installer updated successfully!」と表示されれば、正常に microSD カードにインストールディスクイメージを書き込むことができています。 Armadillo から microSD カードを抜去してください。この microSD カードを使って量産用 Armadillo にインストールを行うと、その Armadillo は JTAG と SD boot が無効化された状態となります。

7.2. u-boot の環境変数の変更を制限する

Armadillo Base OS の u-boot は eMMC の固定の領域から環境変数を読み取っています。

本来の使い方ではユーザーはその eMMC の領域に書込みできませんが、eMMC が外部から変更されたとしても Linux が正しいシーケンスで起動するようにしたい場合は、 u-boot の環境変数をある程度ロックした方が安全です。

imx-boot バージョン 2020.04-at23 以降では、uboot-imx/configs/x2_defconfigCONFIG_ENV_WRITEABLE_LIST=y を追加すると、変更可能と明示した環境変数以外は変更できなくなります。

その変更可能の環境変数のリストは uboot-imx/include/configs/armadillo_x2.h ファイルの CFG_ENV_FLAGS_LIST_STATIC で設定します。

提供しているコンフィグでは、以下の環境変数が変更可能です:

  • upgrade_availablebootcount: ロールバック機能に必要な変数です。ロールバック機能を無効にする場合は必ず upgrade_available のデフォルト値も空にしてください。
  • encrypted_update_available, dek_spl_offsetdek_fit_offset: 暗号化されている imx-boot の書込みに必要な変数です。 imx-boot を暗号化しない場合は削除できますが、残したままでも影響ありません。
  • ethaddr, eth1addr, ethactethprime: ネットワークコマンド関連の変数です。デフォルトのブートコマンドにネットワークを使用してませんので動作に影響ありません。

また、Linux を起動して fw_printenv 等を使用しても Linux 側ではデフォルト値や変更可能の環境変数リストは把握していないので信頼性が低いです。 変数の値に疑いがある場合は u-boot の prompt で確認してください。

設定を行った後に 「署名済みブートローダーの作成」「署名済みの暗号化ブートローダーの作成」 の手順どおりにリビルドすると、CFG_ENV_FLAGS_LIST_STATIC にリストされている環境変数以外は変更できなくなります。

7.3. u-boot プロンプトを無効にする

Armadillo Base OS の u-boot はデフォルトで autoboot が有効になっています。 autoboot が有効な状態では決まったディレイ (bootdelay) の間キー入力を待ち、 入力がなければ自動的に bootcmd を実行して Linux を起動します。 一方、決まった時間にキー入力があるとプロンプトが表示されて、 様々なコマンドを実行することができます。 これらのコマンドはとても便利なものですが、攻撃者にとっても 攻撃を仕掛けるために有効な手段となり得ます。 ここでは、決まった時間待つ処理を無効化する方法を説明します。

bootdelay
  • 2 : デフォルト。2 秒待つ
  • 0 : 待ち時間なし。ただしキー入力でプロンプトが表示される
  • -1 : autoboot が無効
  • -2 : 待ち時間なし。キー入力も無効

「u-boot の環境変数の変更を制限する」 の手順を行った場合は imx-boot の uboot-imx/configs/x2_defconfig に「CONFIG_BOOTDELAY=-2」を追加して変更してください。

環境変数が変更可能な場合は Armadillo Base OS の /boot/uboot_env.d/no_prompt の様なファイルを作って、 そちらに変数を設定すれば今後のアップデートにも適用されます。

詳細は製品マニュアルを参考にしてください。

[armadillo ~]# vi /boot/uboot_env.d/no_prompt 1
# bootdelay を -2 に設定することで u-boot のプロンプトを無効化します
bootdelay=-2
[armadillo ~]# persist_file -v /boot/uboot_env.d/no_prompt 2
'/boot/uboot_env.d/no_prompt' -> '/mnt/boot/uboot_env.d/no_prompt'
[armadillo ~]# fw_setenv -s /boot/uboot_env.d/no_prompt 3
Environment OK, copy 0
[armadillo ~]# fw_printenv | grep bootdelay 4
bootdelay=-2

1

コンフィグファイルを生成します。

2

ファイルを永続化します。

3

変数を書き込みます。swupdate で書き込む場合は自動的に行われています。

4

書き込んだ変数を確認します。

[警告]

「u-boot の環境変数の変更を制限する」 を行ってない場合に CONFIG_BOOTDELAY は無視されます。 必ず CONFIG_ENV_WRITEABLE_LIST も設定するか、/boot/uboot_env.d で設定してください。

[ティップ]

ここで説明した以外にもいくつかの方法があります。 ソースコードにドキュメントがあります。 以下を参照してください。

imx-boot-[VERSION]/uboot-imx/doc/README.autoboot