ここでは、デバッグ機能を閉じる方法とその影響について説明します。
デバッグ機能は開発の効率を向上させるために開発フェーズではなくてはならないもの
です。製品が市場に出荷されると市場不良の解析にも効果を発揮します。
しかし、開発者にとって便利であるということは、同時に攻撃者にとっても
便利な解析手段となり得ます。
想定される製品の運用形態によって、デバッグ機能が必須である運用形態もあります。
セキュリティリスクとのトレードオフになる可能性があるので、有効にするかどうかを
検討することをお勧めします。
| |
---|
デバッグ機能を閉じることは開発者と攻撃者だけでなく、アットマークテクノによる
解析についてもトレードオフになります。閉じられたインターフェースを利用した解析が
できなくなることをご留意いただきますようお願いします。 |
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 ブートが無効になることはありません。 |
|
JTAG を無効化する場合は y を入力します。無効化しない場合は何も入力せず Enter キーを押してください。
|
|
SD ブートを無効化する場合は y を入力します。無効化しない場合は何も入力せず Enter キーを押してください。
|
現在の設定値を確認するには abos-ctrl check-secure
コマンドを実行します。
disabled
の場合は無効化する設定になっています。
設定をリセットするには --reset
オプションを付けて abos-ctrl installer-setting
コマンドを実行します。
JTAG と SD boot の無効化設定を実行した後に、 abos-ctrl make-installer
コマンドを実行してインストールディスクを作成します。
コマンド実行前に、Armadilloがインターネットに接続されており、かつ 10GB 以上の空き容量がある microSDカードが
挿入されていることを確認してください。 microSD カード内のデータはインストールディスク作成時に上書きされて消えてしまうので、
必要なデータは予めバックアップを取っておいてください。
コマンド実行例は以下のようになります。
|
y を入力します。
|
|
インストールディスク内にインストールログを保存したい場合など、自由に使用できる第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_defconfig
に CONFIG_ENV_WRITEABLE_LIST=y
を追加すると、変更可能と明示した環境変数以外は変更できなくなります。
その変更可能の環境変数のリストは uboot-imx/include/configs/armadillo_x2.h
ファイルの CFG_ENV_FLAGS_LIST_STATIC
で設定します。
提供しているコンフィグでは、以下の環境変数が変更可能です:
-
upgrade_available
と bootcount
: ロールバック機能に必要な変数です。ロールバック機能を無効にする場合は必ず upgrade_available のデフォルト値も空にしてください。
-
encrypted_update_available
, dek_spl_offset
と dek_fit_offset
: 暗号化されている imx-boot の書込みに必要な変数です。
imx-boot を暗号化しない場合は削除できますが、残したままでも影響ありません。
-
ethaddr
, eth1addr
, ethact
と ethprime
: ネットワークコマンド関連の変数です。デフォルトのブートコマンドにネットワークを使用してませんので動作に影響ありません。
また、Linux を起動して fw_printenv
等を使用しても Linux 側ではデフォルト値や変更可能の環境変数リストは把握していないので信頼性が低いです。
変数の値に疑いがある場合は u-boot の prompt で確認してください。
設定を行った後に 「署名済みブートローダーの作成」 か 「署名済みの暗号化ブートローダーの作成」 の手順どおりにリビルドすると、CFG_ENV_FLAGS_LIST_STATIC
にリストされている環境変数以外は変更できなくなります。
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
# bootdelay を -2 に設定することで u-boot のプロンプトを無効化します
bootdelay=-2
[armadillo ~]# persist_file -v /boot/uboot_env.d/no_prompt
'/boot/uboot_env.d/no_prompt' -> '/mnt/boot/uboot_env.d/no_prompt'
[armadillo ~]# fw_setenv -s /boot/uboot_env.d/no_prompt
Environment OK, copy 0
[armadillo ~]# fw_printenv | grep bootdelay
bootdelay=-2
|
コンフィグファイルを生成します。
|
|
ファイルを永続化します。
|
|
変数を書き込みます。swupdate で書き込む場合は自動的に行われています。
|
|
書き込んだ変数を確認します。
|
| |
---|
「u-boot の環境変数の変更を制限する」 を行ってない場合に CONFIG_BOOTDELAY は無視されます。
必ず CONFIG_ENV_WRITEABLE_LIST も設定するか、/boot/uboot_env.d で設定してください。 |
| |
---|
ここで説明した以外にもいくつかの方法があります。
ソースコードにドキュメントがあります。
以下を参照してください。 imx-boot-[VERSION]/uboot-imx/doc/README.autoboot |