組み込み界隈のセキュリティは俺が守る!
はじめに
この記事は Akerun Advent Calendar 2022 - Qiita の13日目の記事です。
組み込みエンジニア(?)の @ishturk です。
「組」と「込」の間の「み」はつける派です。
組み込みのセキュリティ
IoTという言葉が流行り始めて最早数年。組み込み界隈もセキュリティリテラシーが求められるのが風潮になってきました。 たとえば id/passがデフォルトのままのセキュリティカメラとか世の中に溢れてますね。
www.keishicho.metro.tokyo.lg.jp
ですが、インターネットにつながらない組み込み機器でも、セキュリティは非常に重要です。 リッチなOSが搭載されてるIoTデバイスは、もはやサーバーみたいなものなので、インフラ職人さんの領域味が強いです。
この記事では、より組み込みに特化したセキュリティの話を書いていきたいと思います。
よくある構成
超ざっくり組み込みシステムを描くとこんな概念です(雑
Lv.1 言語・ライブラリの脆弱性対策
Applicaitonで使用している言語・ライブラリに脆弱性があった場合、システム全体が驚異に晒されることになります。ただし、組み込みシステムの場合、外から入力するI/Fが限定されている場合が多いので、実際に驚異になるかはシステム次第です。
例えば、キー入力を受け付ける、カメラで画像を読取るなど外部のデータを取り込むようなUIがある場合、脆弱性を悪用するI/Fとなる可能性があります。
脆弱性を含まないライブラリ・バージョンを使用する、外部からのデータをバリデーションし意図しないデータが流入しないようにするなどの対策を講じる必要があります。
Lv.1 バス通信の暗号化
MCUから外部メモリにデータを読み書きする場合、SPIなどの通信を用いることが多いですが、データを平文にしていませんか? 平文で通信すると、通信ラインの電圧をオシロスコープやロジックアナライザで観測することでデータを抜くことが非常に容易にできてしまいます。 エンジニアの皆さんはオシロの1台くらい自宅にあると思うので、非常に危険ですね。
近頃のオシロって波形から通信データに変換して出力してくれるんですよ?(最近知った
暗号通信するためには
- 暗号化ライブラリを使う(HE-CRYPTOなど)
- MCUに搭載されたHW暗号化を使用する
- SecureElementを使用する
といった方法があります。 多くの暗号化で鍵の管理が課題になるので、鍵を含めてセキュアに管理できるセキュアエレメントを使用するケースが増えています。またMCUにセキュアな領域が用意されているものも多いです(ARMのTrustZoneなど)
Lv.1 バイナリの難読化
万が一、ソフトウェアバイナリが流出してしまった場合、disassemble することでソースコードを再現することができてしまいます。すなわちソースコードが流出するのと同義です。 これを防ぐために、ソースコードを難解にしておく方法があります。つまり意味不明なロジックの羅列になった状態でソースコード再現されるようにするということです。 たとえば
void unlock_door() { do_something(); }
というコードが再現されると、なんとなくドアを開ける処理だというのが推測できます。これを
void nfjuqkk3k6,k() { ju89jgggmln(); }
という実装にすると何もわかりませんね? ただ、Wikipedia先生も言っているとおり、難読化はプログラムのリバースエンジニアリングを不可能とするものではなく、時間稼ぎです。実装者やレビュアーの負担も大きいのでメリデメ考えて採用しましょう。
Lv.2 ソフトウェア(バイナリ)ダンプへの対策
多くのMCUは、開発中はメモリを自由に読み書きできるようになっています。開発中はそれで良いのですが、その状態で製品になってしまうと、外部から バイナリの読み出し・改ざんが自由にできてしまいます
対策:多くのMCUが、外部からのアクセスをロックする機能をもっています。ReadProtect、WriteProtectと呼ばれるものです。このロックをかけるとデバッグポートからMCUのメモリにアクセスできない(2度と書き換えできない)状態や、アクセスするとハードウェアでメモリをすべて消去する動作をします。こういった機能がないMCUは趣味専用なので製品には使わない方が良いですね。
ちなみにJTAGなど多くのMCUで使われているポートから読み出すデバイスはaliba○aとかで数百円から買えます
Lv.3 セキュアブート
最近のPCでは割と当たり前になっている機能です。 HWに近いレイヤーで、bootloaderやOS・ドライバーの署名を検証し、不正を検知したら起動しないという仕組みです。 ハードウェアに依存しており、低機能なMCUでは実現できないことも多いです。
Lv.4 自壊プログラム
文字通り、実行したら自分で消してしまうプログラムです。実行後にメモリから消去してしまえば読み取られることも、実行されることもないですね。用途は限られます。
「なお、この記事は自動的に消滅する。健闘を祈る。」(消えません)
Lv.5 物理防御
MCUからの読み出しをブロックしたり暗号化したりしても、攻撃者はあらゆる手段でデータの抜き取りを試みます。あらゆる信号を観測したりMCUをスライスしてアクセスしたり。 絶対に破壊できない筐体で基板を保護してしまえば、こういった攻撃からも守ることができます。シンプルですが、もっとも安全かもしれません。絶対に破壊できない筐体が存在すれば。
セキュリティリスクの考え方
組み込みシステムのセキュリティリスクを計算する際のパラメータの一例です。*1
- 攻撃に要する時間
- 攻撃者のスキル(素人で可能〜エキスパートのみ)
- 必要な知識(公開情報のみ〜クリティカル情報)
- 攻撃できる機会
- 装置 (標準品〜オーダーメード)
所要時間や装置の入手性など、簡易であればあるほどリスクは高まります。絶対にゼロにすることはできないですが、要求にあわせて必要なレベルで対策することがものづくりでは必要ですね。
広く世の中で使われる製品であれば、ペネトレーションテストなどで安全性を評価しておくことも重要です。
何より大事なのは、関わる人全員がセキュリティに興味関心を持つことです(どやっ
株式会社フォトシンスでは、一緒にプロダクトを成長させる様々なレイヤのエンジニアを募集しています。 hrmos.co
Akerun Proにご興味のある方はこちらから akerun.com