この投稿は「How to Use the Best Security for Your Embedded System」の抄訳です。
組み込みデバイスに悪質な攻撃が仕掛けられると、デバイス本体のみならず、組み込み先の最終製品、さらには企業全体にまでダメージが及ぶ恐れがあります。そこで、組み込みデバイスを最大限保護するためのベストプラクティスやヒントについて専門家から収集した情報をご紹介します。ぜひお役立てください。
本ブログ記事の内容:
組み込みシステムにおけるセキュリティ
組み込みシステムのセキュリティを徹底することで、悪質な侵入者からシステムを保護できます。セキュリティの専門家の手を借りれば、攻撃を防止したり被害を抑制するメカニズムを備えた組み込みシステムの開発・調整が可能です。
ソフトウェア向けとハードウェア向けセキュリティの違い
組み込みデバイスにおけるセキュリティの多くは、組み込みソフトウェアの保護を重視しています。ネットワークトラフィックをフィルタリングし、部外者をブロックするためのファイアウォールなどがその一例です。しかし企業努力次第で、組み込みハードウェアのセキュリティを強化することもできます。
ソフトウェアのセキュリティは通常、外部ネットワーク経由の攻撃対策が主目的です。しかし、組み込みシステムのハードウェアについては、これ以外の手段(キー管理、暗号化、ハードウェア機能の分離など)を用いてセキュリティを確保します。
組み込みソフトウェア開発エンジニア兼コンサルタントのDan Zimmerman氏は、分離とは、「セキュリティが必要なものをハードウェア上のある部分に隔離すること」と定義しています”つまり、「明確に定義され、対象範囲がきわめて狭いインターフェースを介したセキュリティ制限付きのアクセスを除き、同じハードウェア上の残りのコンポーネント(安全でない恐れあり)から当該箇所にはアクセスできない」という意味になります。
NCC Groupのハードウェアおよび組み込みセキュリティサービス部門バイスプレジデントのRob Wood氏は、「システムを俯瞰し、組み込みシステムの至る所にセキュリティの問題が潜んでいる可能性を理解しておくのが一番だ」と述べています。
同氏は「すべては基盤上に構築されている。アプリケーションの構築基盤となるライブラリやフレームワークはOS上で稼働しており、OSの依存先であるドライバやファームウェアはハードウェア上で稼働している。これらすべてが、人間が関与する、すなわち人為的ミスがつきものの設計方針や製造プロセスに従って設計・開発されている。このため、あらゆる側面でセキュリティの問題が発生する。人間が開発するすべてのものにおいて、脆弱性の密度はほぼ同程度だろう」と述べています。
セキュリティを左右する組み込みシステムの特性
組み込みシステムの特性がセキュリティリスクにつながることがあります。外部デバイスとの通信頻度によってもセキュリティの問題が発生する恐れがあります。
組み込みデバイスが侵害されるとソフトウェアを簡単に更新できない、という課題もあります。
セキュリティ問題につながる特性は他にもあります。以下はその具体例です。
- 接続範囲:数年前まで、組み込みシステムにとって外部通信の必要性はほぼ皆無でした。今日では、多くの組み込みシステムがネットワークに接続し、外部システムやデバイスと相互通信しています。そのため、残念ながら当該ネットワークから侵入する外部攻撃者に狙われる確率が格段に上がっています。
- 必要な通信レベル:組み込みデバイス/システムが外部デバイスと通信する頻度に比例して、サイバーセキュリティのリスクが高まります。ネットワーク接続を介して常時通信するデバイスは、より脆弱性が高くなります。
- 製品ライフサイクルの期間:製造元は、デバイスに組み込まれたシステムの寿命を数年程度(デバイスの種類による)と見積もっていますが、セキュリティ対策用ソフトウェアの更新版は手に入りにくく、インストールする手段はほとんどありません。組み込みシステムの製造元は、この点を念頭に置く必要があります。
- 組み込みOSの種類:組み込みシステムに搭載されるOSの種類もセキュリティに影響します。多くの組み込みシステムでは、セキュリティパッチの適用やソフトウェアの更新が難しく、OSの種類によってはさらに複雑になることもあります。(詳細は、組み込みシステムのOSおよび最適な組み込みOSの選び方に関するブログをご参照ください。)
- 更新やセキュリティパッチ適用の対応力:組み込みシステムは様々なデバイスの一部として機能するため、「組み込みシステムのソフトウェアを最新版にアップデートする」という想定がないまま開発されています。製造元が組み込みシステムのセキュリティを検討する際はこの点を考慮すべきです。もしくは、セキュリティ問題の発生時に組み込みシステム全体を入れ替える、または更新版を提供するためのコストについて検討する必要があります。
前述のWood氏は「組み込みシステムの脆弱性を放置しないための最優先対策のひとつは、素早くパッチ適用することだ。ごくわずかな例外はあるものの、大半のガジェットは内蔵ソフトウェアやファームウェアの自動更新を想定した設計になっておらず、ユーザーの手による更新に頼っている。これは明らかに問題だ。火災警報器のバッテリーでさえ、メーカーの推奨どおりに定期交換する人はいない。つまり、『お持ちのガジェットすべてを対象に、ファームウェアの更新版を手動でダウンロードして適用してください』と呼びかけても上手くいくはずがない」と述べています。
- システム上のデータの価値:様々な理由により、組み込みシステムには他のシステムに比べて価値の高いデータが保存されていることがあります。悪質な侵入者は通常、最も利用価値の高いデータが存在するシステムを狙います。
- 組み込みシステムの多くはカスタム開発品:組み込みシステムの多くは、特定のデバイスに限定した機能を実現するためにカスタム開発されている、という特性も持っています。数百~数千人もの従業員が日夜、自社製品のセキュリティ対策に取り組んでいる世界的企業が製造するノートパソコンとは大きく異なる特性です。
Qt GroupのSenior Product Manager Vladimir Minenkoは「ノートパソコンとの根本的な違いは、常に(組み込みシステムのセキュリティに関わる)製造元、あるいは社内のネットワークシステム管理者などの第三者が介在する点だ。しかし、セキュリティ対策の大半は、組み込みシステムを開発する製造元単体が責任を負うことになる」と述べています。
- 組み込みデバイスの多くは低単価:別の製品の一部である組み込みデバイスの多くは低価格です。単価はせいぜい数ドルのため、販売後にコストをかけてソフトウェア更新を提供し続けるベンダーはあまりいないでしょう。
「最大の要因はコストだ」とWood氏は述べています。「デバイスが市販された後にソフトウェアやファームウェアの保守を継続するには、ベンダーの開発リソース面で費用がかかる。大半の消費者向けデバイスは、固定価格、しかも低単価の売り切り型で、継続保守サービスが付いていない。解決策としてハードウェアのサブスクリプションモデルも考えられるが、ユーザー側の意識を変える必要がある。コストが積み上がれば、いずれはベンダーが手抜きをしたり、デバイスの耐用期間満了前にサポートが打ち切られることもあるだろう」と同氏は語っています。
組み込みソフトウェアに共通する脆弱性
組み込みシステムのソフトウェアは、攻撃への耐性が弱い可能性があります。よくある問題のひとつは、組み込みシステムに流れる通信内容の認証が脆弱である、という点です。また、メモリにアクセスするプログラムに対する制限が不十分である、という問題もあります。
以下は、組み込みソフトウェアに共通する脆弱性の詳細です。
- 脆弱な認証:すべての発信元が信頼できるソースであることを組み込みシステムのソフトウェア側で徹底する必要があります。適切かつ信頼できるソースであることをシステム側で確認するまでは、不明な受信内容すべてをソフトウェア側で拒否すべきです。一部の外部通信が認証をすり抜けてシステムに入り込み、トラブルに発展する事例も頻発しています。
- ユーザー入力値の検証不足:システムに入力されるあらゆるデータが、侵入攻撃またはシステムを無効化するための経路となる恐れがあります。外部通信の検証と同様、システムに取り込まれる入力データの形式や内容を事前チェックすることも組み込みソフトウェアが果たすべき役割です。つまり、データが入力される都度、その信頼性を証明する必要があります。良質なソフトウェアでは入力値の検証が必須ですが、こうした検証を義務付けていないシステムコンポーネントが多すぎると、攻撃を招く恐れがあります。
- 他のプログラムによるメモリへの直接アクセス制限の欠如:時には、組み込みシステムのOSやプログラミング言語による適切なアクセス制限が実施されずに、プログラムによるメモリアクセスが許可されることがあります。これにより第三者にシステムが破壊されたり、乗っ取られる恐れがあります。(詳細は、組み込みシステムで選択可能なメモリおよび最適なメモリの選び方に関するブログをご参照ください。)
- 粗悪な暗号文:組み込みシステムの攻撃対策には暗号技術が用いられます。しかし、なかには適切に符号化されていない暗号文もあり、「暗号化したから大丈夫」という誤った安心感を与えてしまいます。
「セキュリティ対策として暗号化を『試みる』組み込みシステムの多くが、その実施方法を誤っているため、いとも簡単に突破されてしまいます」とZimmerman氏は述べています。
組み込みシステムへのサイバー攻撃における基本ステップ
ほとんどの攻撃者は、システムの脆弱性に狙いを定め、一般的なステップに沿って攻撃を仕掛けます。たとえば、第一段階としてよくあるステップは「不適切な、またはセキュリティが甘いパスワードの悪用によるアクセス確立」です。これが成功すると、後続のステップが実施されます。
以下は、組み込みシステムへのサイバー攻撃の流れです。
- ネットワークへのアクセスを確立する:
ハッカーは通常、様々な手段を用いてネットワークへのアクセスを試みます。アクセスを確立すると、様々な方法で標的デバイスの動作に影響を与えることができます。
もちろん複雑な方法が使われることもありますが、専門家は「高度な攻撃や防御対策だけがすべてではない」と警鐘を鳴らしています。多くのサイバー攻撃では、「システムへの侵入経路になりそうなパスワードを物色し、見つかったものを使う」というきわめて初歩的な方法が用いられています。
Minenkoは「私見だが、セキュリティにおける脆弱性の大半はごく単純なものだ」と述べています。「たとえば、組み込みLinuxで最もよくあるのが、単純なパスワードを設定する/使い続ける、もしくは以前設定したパスワードを再利用する、などの問題だ。こうしたデバイスがインターネットに接続されると、その日の夜には乗っ取られてしまうだろう」とMinenkoは語ります。
Zimmerman氏も同様の見解を示しています。「多くの組み込みシステムは、同一製品すべてに同じ管理者パスワードが設定された状態で出荷されています。なかには製品の種類を問わず、同一メーカーの製品全体で一律の設定になっていることもあります。セキュリティ確保において、この点は最大の問題だと言えるでしょう」と同氏は述べます。
侵入経路は、前述のシンプルな方法だけではありません。たとえば、既知の脆弱性を悪用したハッカーに、デバイスから発信される通信内容が監視/傍受される恐れもあります。
- 組み込みOSとハードウェアの動作パターンを把握する:
ネットワークへのアクセスを確立したハッカーが次に行うことは、組み込みシステムの動作や仕組みの確認です。
- ホストデバイスのセキュリティ対策における脆弱性を探す:
ハッカーは続いて、組み込みシステム自体の外部侵入対策における脆弱性を探します。PLC(プログラマブルロジックコントローラ)、組み込みOS、ミドルウェアなどに脆弱性が存在する可能性があります。
- 見つかった脆弱性を悪用し、当該システム(および、場合によっては他のシステム)を攻撃する:システム内部に深く入り込んだハッカーは、標的システムを掌握し、自由に操作できるようになります。連携先のデバイスへのアクセスも可能になります。
組み込みシステムを保護するためのベストプラクティス
適切なパスワードポリシーの整備からハードウェア/ソフトウェアのコンポーネント分離に至るまで、組み込みシステムを保護するための各種ベストプラクティスが専門家によって提唱されています。
以下は、組み込みシステムを保護するためのベストプラクティスの詳細です。
- パスワードの問題を解決する:強固なパスワードを設定し、厳格なパスワードポリシーを整備しましょう。自社の組み込みシステムに含まれるコンポーネントにデフォルトパスワードが設定されている場合は変更してください。システムへのログイン試行回数には上限を設定しましょう。
「個々のデバイスに一意の、適切なパスワードを製造段階で設定しておけば、単純なセキュリティ問題の多くはたちまち解決するでしょう」とZimmerman氏は述べています。
- 攻撃対象領域を最小化する:攻撃対象領域とは、組み込みシステムやコンピュータシステムが外部に露出する場所を指します。コンピュータコード、ポート、アプリケーション、ウェブサイトなどがその一例です。こうした攻撃対象領域が何者か、または何らかのプログラムに悪用されると、システムに侵入される可能性があります。組み込みシステムを設計する際は、不要な部分(必須でないドライバや余剰なコンピュータコードなど)をそぎ落として、システム上の攻撃対象領域を極力減らしましょう。
Zimmerman氏は「たとえば、冷蔵庫などのスマート家電でWebサーバーやFTPサーバーを実行する必要はありません。これらのサーバーはインターネットに接続しているため、あらゆる場所から任意のリクエストが実行される恐れがあります。組み込みシステムは、その目的を果たすために必要不可欠な外部サービス以外には露出させないように設計すべきです。そのうえで、何らかのアクセス制御機能を設けるとなお良いでしょう」と述べています。
- 起動時の認証またはセキュアブートなどの仕組みを実装する:システムの起動時に、侵入者や悪質なコードによって組み込みシステム/ソフトにアクセスされる可能性があります。
Minenkoは「ハッカーが、システム起動時のプロセスを欺いて侵入を試みることに注意すべきだ。たとえば、起動時の設定とは異なるユーザー名を使ってシステムを立ち上げて起動プロセスを改ざんし、システムにログインしたりアクセス範囲を拡大したりする恐れがある」と注意喚起しています。
ブートシーケンスに認証手順などを組み入れて入念に設計することで、こうした試みからシステムを保護できます。セキュリティ対策に役立つツールやテクノロジーも活用しましょう。
- ハードウェアコンポーネントの分離:組み込みシステムのソフトウェアすべてが同一基盤上のハードウェアコンポーネントすべてにアクセス可能な状態(あるソフトウェアにとって必要のないコンポーネントにまでアクセス権が付与されている、などの状態)は望ましくありません。これでは侵入者に付け入られる隙がさらに増えてしまいます。
組み込みシステムの開発者にとって、この点は設計課題のひとつです。設計の初期段階で「組み込みソフトウェアそれぞれに、自らの動作に必要なハードウェアコンポーネントへのアクセスのみを許可する」というシステムを考える必要があります。これにより、システム構成がよりシンプルかつ安全になります。あるアプリケーションに脆弱性が存在したとしても、当該アプリケーションが分離されていれば、組み込みデバイス全体に影響が広がる恐れはありません。
ロンドンを拠点とするセキュリティコンサルティング企業Classifiedで研究開発エンジニアを務めるGeorge Zaher氏は「ハードウェア分離の大きなメリットは、あるエンティティが攻撃された場合でも、残りのエンティティには基本的に被害が及ばない、ということです」と述べています。
詳細は、別のブログ記事(組み込みシステム開発における設計プロセス)をご参照ください。
- 自己完結型またはコンテナ型のソフトウェアアプリケーションを利用する:ハードウェアコンポーネントの分離も重要ですが、「たったひとつのコードにセキュリティ不備があったせいで組み込みシステム全体が侵害されてしまう」という事態に陥らないように対策を徹底することも重要です。ソフトウェアを可能な限り「コンテナ化」することで保護を強化できます。プログラムコード、ツール、設定、ライブラリなどをポータブルな機能パッケージに一元化できるため、個々のコンポーネントに攻撃が仕掛けられたり脆弱性が発覚した場合でも、他の部分への影響拡大を防止できます。
- 保存データを保護する: 組み込みデバイスに保存されているデータ(data at rest)も保護の対象です。デバイスのアプリケーションやデータを暗号化することが有効な対策です。
- TEE(Trusted Execution Environment)を使用する:TEEとは、組み込みシステムのプロセッサー上に隔離された安全な実行環境を指します。TEEを実装すると、組み込みシステムそのものではなく、信頼性の高いアプリケーションに安全な方法で処理を代行させることもできます。(詳細は、組み込みプロジェクトに適したCPUまたはSoCの選択方法(およびSoCの選択肢)について解説したブログ記事をご参照ください。
- 認証未完了の外部ソースとの通信を禁止する:IoT環境の至る所で組み込みデバイスが使われているため、IoTのセキュリティを常に徹底する必要があります。デバイスが信頼し、認証が完了している外部ソース以外との通信は避けましょう。つまり、組み込みデバイス開発の際は「不要な外部通信の排除」という点も考慮する必要があります。
Zimmerman氏は「組み込みデバイスをインターネット接続から極力、または全面的に切り離すことも効果的です。世界中のハッカーに狙われるインターネット接続システムに比べ、ローカルネットワーク上の組み込みデバイスの場合は、たとえ狙われたとしても問題の範囲が限定され、対処しやすいからです」とアドバイスしています。
- あらゆる入力データを検証する:組み込みシステムによるデータ処理に先立ち、あらゆる外部ソースから入力されたデータを組み込みデバイスのソフトウェアアーキテクチャ側で事前検証する必要があります。さらに、受信するすべての外部メッセージがデータ仕様に準拠しているか否かについても組み込みデバイス側でチェックする必要があります。
- アドレス空間配置のランダム化(ASLR):ASLRを実装すると、主なメモリ領域のアドレス空間と場所が常に変更されます。情報の保存場所をハッカーに知られずに済むため、「バッファオーバーフロー」と呼ばれる攻撃への抑止効果があります。
- • 問題が発生していないか常時監視する:デバイスへの攻撃発生状況(未遂および実害)を、ネットワークやOSの異常検出機能を使って定期的に監視しましょう。システムログを常時監視する、既知のマルウェア対策としてスキャンを継続的に実施するなどの対策も可能です。こうしたステップをもとに、潜在的な攻撃者に対処する、または特定の外部デバイスに付与された信頼を無効にする、などの措置を講じることができます。
- 検知された問題を修復する:侵入阻止に全力を尽くしても、被害に遭うことはあります。その際に最も重要なベストプラクティスのひとつが「侵入を検知したら、速やかに問題を修復すること」です。
Minenkoは、「すべてを完璧に保護することは到底できない。それよりも、迅速に対応して問題を修復するほうが重要だ」と述べます。
ファームウェアやソフトウェアの製造元は、セキュリティの問題に対処するための更新版を継続的にリリースしています。リリース動向を注視し、更新版が提供され次第インストールしましょう。
一方Zimmerman氏からは「正式な更新版を装った偽物に気を付けるべきだ」という指摘もあります。「不正な提供元による更新版をインストールして、ソフトウェアやファームウェアがトロイの木馬に感染した、という実例もいくつか確認されています。このような事態は避けたいところです」と同氏は述べています。
組み込みシステムのセキュリティ対策チェックリスト(ダウンロード版)
組み込みシステムのセキュリティ対策チェックリストをダウンロードする
組み込みシステムには様々なセキュリティ対策が必要
組み込みシステムを保護するためには、強力な手段が必要です。システム全体の安全を損なう脆弱な箇所(weak link)をすべて特定し、該当箇所のセキュリティを強化しましょう。また、信頼性が確認できないソフトウェアおよびソフトウェアコードの使用は避けましょう。セキュリティ対策はここから始まります。
組み込みシステムのセキュリティを確保するQtの開発フレームワーク
組み込みシステムを開発する際は、侵入者による改ざんやリバースエンジニアリングからデバイスを保護する必要があります。Qtの商用ライセンスをご購入いただくと、改造やリバースエンジニアリングを防止し、開発対象の組み込みシステムを法的に保護できるため、様々な攻撃への対策として大変有効です。
組み込みデバイスを最大限保護するためには、幅広い領域におけるセキュリティ項目を考慮して開発を進める必要があります。Qtの製品は、すべてソースコードが提供されていますそのため監査しやすく、緊急対応が必要な問題を迅速に修復できます。Qtのソフトウェアは常に「セキュリティの最適化」を中核に据え、皆様の組み込みデバイスを保護します。Qtで実現する組み込みデバイスのセキュリティについて解説した短い動画(77秒)も、ぜひご覧ください。