組込みフレームワークとCベースツールチェーンの堅牢化

BusyBox, 組込みフレームワーク, ツールチェーンをファームウェアビルドの構成時に使用されるライブラリおよび関数のみに制限します。Buildroot, Yocto などの組込み Linux ビルドシステムは通常このタスクを実行します。Telnet など既知のセキュアではないライブラリやプロトコルを削除することで、ファームウェアビルドにおける攻撃エントリポイントを最小限に抑えるだけでなく、潜在的なセキュリティ上の脅威を防ぐことに取り組み、ソフトウェアを構築するためのセキュアバイデザイン (secure-by-design) アプローチも提供します。

ライブラリの堅牢化 : 圧縮はセキュアではありません (特に), SSLv2 はセキュアではありません, SSLv3 はセキュアではありません, また TLS の初期バージョンも同様であることが知られています。さらに、ハードウェアやエンジンを使用せず、静的リンクのみを許可するとします。知識と仕様を考慮して、OpenSSL ライブラリを以下のように構築します。

$ Configure darwin64-x86_64-cc -no-hw -no-engine -no-comp -no-shared -no-dso -no-ssl2 -no-ssl3 --openssldir=

一つのシェルを選択する例: buildroot を使用して、以下のスクリーンショットでは bssh 一つだけのシェルが有効にされていることを示しています。 (注意: buildroot の例が以下に示されていますが、他の組込み Linux ビルドシステムにも同じ構成を達成するほかの方法があります。)

サービスの堅牢化例: 以下のスクリーンショットは openssh が有効であることを示していますが、FTP デーモンの proftpd と pure-ftpd は無効になっています。TLS を利用する場合にのみ FTP を有効にします。例えば、proftpd と pureftpd は TLS を使用するためにカスタムコンパイルを必要とします。 proftpd には mod_tls を使用し、pureftpd には ./configure --with-tls を渡します。

**U-boot の堅牢化例: ** 多くの場合、組込みデバイスへの物理的なアクセスにより攻撃パスがブートローダー設定を変更することを可能にします。以下では、 uboot_config のベストプラクティス設定例が提供されています。注意: uboot_config ファイルは一般的にビルド環境と特定のボードに応じて自動生成されます。

U-Boot 2013.07 以降のバージョンでは "Verified Boot" (セキュアブート) を設定します。 Verified Boot はデフォルトでは有効になっておらず、少なくとも以下の構成でのボードサポートが必要です。

CONFIG_ENABLE_VBOOT=y #Enables Verified Boot

CONFIG_FIT_SIGNATURE=y #Enables signature verification of FIT images.

CONFIG_RSA=y #Enables RSA algorithm used for FIT image verification

CONFIG_OF_SEPARATE=y #Enables separate build of u-Boot from the device tree.

CONFIG_FIT=y #Enables support for Flat Image Tree (FIT) uImage format.

CONFIG_OF_CONTROL=y #Enables Flattened Device Tree (FDT) configuration.

CONFIG_OF_LIBFDT=y

CONFIG_DEFAULT_DEVICE_TREE=y #Specifies the default Device Tree used for the run-time configuration of U-Boot.

それから、Verified Boot を構成するために一連の手順が必要になります。Beaglebone black ボード用の Verified Boot 構築の概要例は以下の通りです。

  1. Verified Boot オプションを有効にして、ボードの U-Boot を構築します。

  2. 適切な Linux カーネル (できれば最新のもの) を入手します。

  3. カーネルをどのようにパッケージ化、圧縮、署名したいかを記述した Image Tree Source (ITS) ファイルを作成します。

  4. RSA2048 で RSA 鍵ペアを作成し、認証に SHA256 ハッシュアルゴリズムを使用します。 (秘密鍵を安全な場所に保管します。ファームウェアにハードコードしてはいけません。)

  5. カーネルに署名します。

  6. 公開鍵 を U-Boot のイメージに入れます。

  7. U-Boot とカーネルをボードに入れます。

  8. イメージとブート設定をテストします。

上記に加えて、適切な構成を組込みデバイスのコンテキストに合わせて有効にします。以下は注目すべき構成です。

CONFIG_BOOTDELAY -2. #Prevents access to u-boot's console when auto boot is used

CONFIG_CMD_USB=n #Disables basic USB support and the usb command

CONFIG_USB_UHCI: defines the lowlevel part.

CONFIG_USB_KEYBOARD: enables the USB Keyboard

CONFIG_USB_STORAGE: enables the USB storage devices

CONFIG_USB_HOST_ETHER: enables USB ethernet adapter support

以下の構成マクロで U-Boot のシリアルコンソール出力を無効にします。

CONFIG_SILENT_CONSOLE

CONFIG_SYS_DEVICE_NULLDEV

CONFIG_SILENT_CONSOLE_UPDATE_ON_RELOC

不変 (immutable) の U-Boot 環境編集を有効にして許可されていない変更 (bootargs の変更、Verified Boot 公開鍵の更新など) やファームウェアのサイドローディングを防止するには、以下のように不揮発性メモリ設定を削除します。

#define CONFIG_ENV_IS_IN_MMC

#define CONFIG_ENV_IS_IN_NAND

#define CONFIG_ENV_IS_IN_NVRAM

#define CONFIG_ENV_IS_IN_SPI_FLASH

#define CONFIG_ENV_IS_IN_REMOTE

#define CONFIG_ENV_IS_IN_EEPROM

#define CONFIG_ENV_IS_IN_FLASH

#define CONFIG_ENV_IS_IN_DATAFLASH

#define CONFIG_ENV_IS_IN_MMC

#define CONFIG_ENV_IS_IN_FAT

#define CONFIG_ENV_IS_IN_ONENAND

#define CONFIG_ENV_IS_IN_UBI

検討事項 (免責: 以下のリストは完全なものではありません):

  • SSH などのサービスにセキュアなパスワードが作成されていることを確認します。

  • perl, python, lua など未使用の言語インタプリタを削除します。

  • 未使用ライブラリ関数からデッドコードを削除します。

  • ash, dash, zsh などの未使用のシェルインタプリタを削除します。

    • /etc/shell をレビューします。

  • 旧来のセキュアではないデーモンを削除します。以下を含みますがこれに限定されません。

    • telnetd

    • ftpd

    • ftpget

    • ftpput

    • tftp

    • rlogind

    • rshd

    • rexd

    • rcmd

    • rhosts

    • rexecd

    • rwalld

    • rbootd

    • rusersd

    • rquotad

    • rstatd

    • nfs

  • 以下のような未使用/不要なユーティリティを削除します。

    • sed, wget, curl, awk, cut, df, dmesg, echo, fdisk, grep, mkdir, mount (vfat), printf, tail, tee, test (directory), test (file), head, cat

    Automotive Grade Linux (AGL) はデバック環境または製品環境 (ビルド) での一般的なユーティリティとその使用法のサンプル表を開発しました。

  • 監査や提案を強化するために Lynis などのツールを利用します。 wget --no-check-certificate https://github.com/CISOfy/lynis/archive/master.zip && unzip master.zip && cd lynis-master/ && bash lynis audit system

    • /var/log/lynis.log のレポートをレビューします。

  • 組込みデバイスで実行されているソフトウェアについて、開発者および関係者との間で繰り返し脅威モデル演習を実行します。

その他の参考情報

Last updated