ブログ

組み込みデバイスおよび組み込みシステム開発の概要

August 11, 2021
Secure Code Warrior
金属製のヒートシンク、チップ、コネクタが搭載された緑色の電子回路基板のクローズアップ。

Secure Code Warriorでは、常にトレーニングの対象範囲を拡大しています。組み込み開発者やセキュリティマネージャーがセキュアな組み込みシステムを構築できるよう支援するため、私たちは組み込みシステムのセキュリティ分野に注力しています。本記事では、開発者やアーキテクトがセキュアな組み込みシステムを構築する上で知っておくべき重要なポイントを共有します。

組み込みデバイスとは、独自のマイクロプロセッサベースのハードウェアとソフトウェアを備えた独立したコンピューティングユニットです。通常、単独で、あるいはより大きなシステムの一部として、特定の機能を実行するために使用されます。

組み込みデバイスと組み込みシステムとは?

組み込みデバイスは、特定の機能を実行するようにプログラムされた、最小限のハードウェアとソフトウェアで構成される専用のコンピューティングシステムです。その目的によって、組み込みデバイスの複雑さは異なります。

組み込みシステムが複雑でリソースを大量に消費する操作を実行する必要がある場合、そのハードウェアは複数のプロセッサとさまざまな相互接続された周辺機器で構成されることがあります。一方、単純なタスクを実行するように設計されている場合は、単一のマイクロコントローラのみで構成されることもあります。

ユーザーインターフェースを持たないブラックボックスのような組み込みシステムもあれば、詳細なグラフィカルユーザーインターフェースを備えたものもあります。

組み込みデバイスの例

組み込みデバイスは、航空宇宙からコンピューティング、家電製品からヘルスケアまで、さまざまな業界で活用されています。以下にいくつかの例を挙げます。

  • エアコンのサーモスタット。
  • 健康状態の記録と同期のみを行う、小さなオペレーティングシステムと電子部品を搭載したフィットネストラッカー。
  • デジタル空調制御システム。
  • 航空機のナビゲーションシステム。
  • デジタル時計。
  • GPSデバイス。
  • 電子レンジやその他の家電製品に組み込まれたWi-Fiコンポーネント。
  • 血圧計や心拍数モニター。
  • MRI装置内でデータをクラウドに送信するネットワークコンポーネント。

ノートパソコンは組み込みデバイスですか?

結論から言うと、いいえです。詳しく説明すると:

定義上、組み込みデバイスは機能を実行するために必要なすべてのソフトウェアとハードウェアを内包しています。確かにノートパソコンも金属製の筐体にさまざまなハードウェアコンポーネントを収め、機能を提供するために必要なすべてのソフトウェアを網羅しています。

しかし、あらかじめ定義された最小限の機能セットを持つ一般的な組み込みシステムとは異なり、ノートパソコンはより汎用的であり、幅広い活動に使用できます。

IoTにおける組み込みデバイス

組み込みシステムはIoTの中核を担っています。スマート冷蔵庫をモバイルデバイスから操作できるのは、組み込みデバイスのおかげです。遠く離れた場所からCCTVの映像を確認できるのも、セキュリティシステム内の組み込みデバイスによるものです。また、車の自動運転ボタンを押したとき、その裏側で魔法のようにすべてを処理しているのも組み込みデバイスです。

組み込みソフトウェア開発ライフサイクル

組み込み機器の一般的なソフトウェア開発ライフサイクルには、以下のステップが含まれます。

ステップ1:目的と要件の定義

組み込み機器には、明確かつ精密な機能セットが求められます。そのため、開発を開始する前に目的と要件を明文化しておくことが非常に重要です。システムの詳細な設計書を作成することを推奨します。以下の問いに対する答えを明確にしましょう。

  • デバイスはどのような機能を実行するのか?
  • 他の機械の一部として機能するのか、それとも単体で動作するのか?
  • ユーザーインターフェースは必要か?必要な場合、コマンドラインで十分か、それともグラフィカルなUIが必要か?
  • サイズ、コスト、消費電力に関してどのような制限があるか?
  • パフォーマンスの基準はあるか?(例:リアルタイムでの応答が求められるか、あるいは特定の閾値内での処理が必要かなど)

ステップ2:システムアーキテクチャの設計

システム要件が特定できたら、次はシステムアーキテクチャの設計です。以下の問いを検討してください。

  • デバイスの開発にはどのようなハードウェアコンポーネントが必要か?(回路、プロセッサチップ、マイクロコントローラ、および必要な内外の周辺機器の特定を含む)
  • コンポーネントにはどれくらいの電力が必要か?
  • デバイスはインターネットに接続するか?
  • 他のデバイスや上位システムと接続するために、どのようなインターフェースを追加・開発する必要があるか?
  • 暗号化をどのように実装するか?(アルゴリズム、鍵の管理など)
  • 潜在的な脆弱性、エクスプロイト、マルウェアをどのように特定し、回避するか?

ステップ3:オペレーティングシステムの選択

OSの選択は組み込みアプリケーションの効率を左右するため、慎重に選ぶ必要があります。Windows for IoTはグラフィックス性能には優れていますが、ハードウェアサポートが不足している場合があります。組み込みLinuxやAndroidは無料ですが、VxWorksやWindows for IoTにはライセンス費用が発生します。

LinuxやAndroidのようなオープンソースシステムであれば、開発者はカーネルをより詳細に制御できます。一方、プロプライエタリ(商用)システムでは、カーネルのデフォルト機能の範囲内で開発を行うことになります。

OSを選択する際は、セキュリティへの影響も考慮することが重要です。脆弱性が発見された場合、セキュリティパッチは迅速にリリースされるか?一般的なサイバー攻撃に対する組み込みの保護機能はあるか?

ステップ4:開発ツールの選定

プログラミング言語やフレームワークにはそれぞれ長所と短所があります。機能、速度、信頼性の要件に応じて、最適な言語やフレームワークを選択してください。

Webベースのアプリケーションで高いパフォーマンスを求めるなら、Javaが適しています。
しかし、最も高速なスループットが必要ならC/C++を、サードパーティ製ライブラリの充実を優先するならPythonを選択するのが良いでしょう。

ステップ5:コーディング、リファクタリング、テスト、そして改善

開発プラットフォームが決まったら、コーディングを開始します。組み込みシステムはハードウェアやソフトウェアのリソースが限られた繊細なデバイスであることを忘れないでください。そのため、アプリケーションのセキュリティとパフォーマンスに関するベストプラクティスを念頭に置くことが極めて重要です。

コードレビューは、コードの最適化や潜在的なバグの特定に役立ちます。また、可能な限り厳密なテストを行う必要があります。実運用環境でデバイスが遭遇しうるあらゆるケースを網羅したテストリストを作成してください。

ステップ6:保守とサポート

他のアプリケーションやデバイスと同様に、組み込み機器のライフサイクルは出荷・設置で終わりではありません。運用が進むにつれて新たなユースケースが特定され、機能追加が必要になることがあります。また、報告されたバグに対処するためにファームウェアのアップデートが必要になる場合もあります。

主要な組み込みプログラミング言語

IEEEやTIOBEなど、プログラミング言語の人気や利用状況をランク付けしている信頼性の高い組織は数多く存在します。しかし、TIOBEインデックスであれ、IEEE Spectrumであれ、共通する傾向が見て取れます。

常に上位3位を占めるのはC言語、Python、Javaです。2021年7月のTIOBEインデックスでは、1位がC言語、2位がJava、3位がPythonとなっています。一方、IEEE Spectrumの組み込みプログラミング言語ランキングでは、Python、Java、C言語の順となっています。

Java、C言語、Pythonで書かれたファームウェアにはどのような違いがあるのでしょうか。

言語によって、メモリ管理、OSとの対話、ランタイムの処理方法は異なります。例えば、JavaアプリケーションはJava仮想マシン(JVM)と呼ばれる専用のランタイム環境で実行されます。

C/C++ではメモリ管理を手動で行う必要がありますが、JavaやPythonでは言語側が自動的に処理してくれるため、自分で管理する必要はありません。さらにC言語では、動的に割り当てたメモリを使い終わった後に明示的に解放しなければ、メモリリークが発生してしまいます。JavaやPythonでは、ガベージコレクションが自動的に行われます。ただし、本質的な処理速度においては、C言語の方がJavaやPythonよりもはるかに高速です。

C言語やJava(特にC言語)がPythonに比べて不足している点の一つに、サードパーティ製ライブラリの豊富さが挙げられます。Pythonはライブラリのデータベースが充実しており、開発者が特定の機能を追加する際の利便性が非常に高くなっています。

全体として、次のような場合はC言語を選択するのが適しています。

  • OSやハードウェアとの低レベルなインターフェースが必要な場合。
  • 最大限のパフォーマンスが求められる場合。
  • 開発チームがC/C++に精通している場合。
  • 外部ライブラリやサードパーティのサポートをあまり必要としない場合。

次のような場合はPythonを選択するのが適しています。

  • データサイエンスや機械学習のアルゴリズムを実装したい場合。
  • 豊富なサードパーティ製ライブラリのサポートが必要な場合。
  • 使いやすさを優先し、速度とのトレードオフを許容できる場合。
  • 組み込み開発の経験が限られている場合。
  • OSやハードウェアとの低レベルなインターフェースを必要としない場合。

次のような場合はJavaを選択するのが適しています。

  • Webアプリケーションを構築する場合。
  • C言語よりも開発の容易さを求めつつ、Pythonよりも高いパフォーマンスが必要な場合。
  • 外部ライブラリやサードパーティのサポートをあまり必要としない場合。

C言語は、今後組み込み開発の主要な選択肢から外れていくのでしょうか。

高水準言語は、C言語では避けられない複雑さを抽象化することで、コーディングを容易にします。しかし、より洗練された言語やフレームワークが登場して何十年も経った今でも、C言語は組み込み開発におけるトップの選択肢であり続けています。

それは、C言語が提供する速度、パフォーマンス、信頼性が依然として比類のないものだからです。PythonやJavaエコシステムの大部分(ランタイム、言語、コンパイラを含む)がC言語で書かれているという事実は、この言語の効率性と耐久性を如実に物語っています。

とはいえ、Pythonのような言語のシンプルさを好む新しい開発者にとって、C言語の習得が難しいのは否定できません。これが、C言語開発者コミュニティの縮小という目に見える変化につながっています。また、AIや機械学習アプリケーションの開発が活発化していることも、ライブラリのサポートが充実しているという理由で、C言語よりもPythonが選ばれる要因となっています。

忘れてはならないのは、Pythonが組み込みプログラミング言語のトップの議論に加わったのはごく最近のことだという点です。確かに今後採用数は増えるかもしれませんが、C言語が組み込み開発の主要な選択肢であり続けることに変わりはないでしょう。

C/C++においてセキュアコーディングが重要な理由

C/C++でのコーディングには多くのリスクが伴います。有効なデータを指していないメモリ番地にアクセスしたり、スレッド間でデータを誤って共有したりすると、アプリケーション全体がクラッシュする可能性があります。

組み込みデバイスの場合、その影響はさらに深刻です。内部でクラッシュが発生すると、より大きな機械全体の機能が停止してしまう可能性があるからです。例えば、自動車の自動運転モジュールが停止すれば、車は障害物を回避できなくなります。

C/C++アプリケーションにおけるセキュアコーディングが極めて重要である理由は、以下の通りです。

  • メモリの不適切な処理(ヌルポインタ、メモリ破損、スタックオーバーフロー、バッファおよびヒープオーバーフロー)は、アプリケーション全体のクラッシュを引き起こします。
  • ポインタはC/C++に不可欠な要素ですが、その取り扱いには細心の注意と、基盤となる概念への深い理解が求められます。
  • ガベージコレクションは手動で行う必要があるため、動的に割り当てたメモリはプログラマが明示的に解放しなければなりません。解放漏れや誤った解放は、メモリリークや破損の原因となります。
  • 高度なデータ構造(ハッシュテーブルやセットなど)のための標準化されたAPIが不足しており、開発者はその都度、車輪の再発明を強いられています。

C/C++アプリケーション開発において、開発者がセキュアコーディングのトレーニングを受けることは極めて重要です。Secure Code Warriorは、インタラクティブな課題、コース、評価を通じて、開発者がセキュアなC/C++コードを書けるよう支援するパーソナライズされた学習プラットフォームを提供します。私たちが提供するのは、単なる概念的なトレーニングの枠を超えた、言語やフレームワークに特化した実践的なコンテンツです。

自動車・輸送業界における 当社の支援事例 をぜひご覧ください。また、組み込み向けコーディング課題 に挑戦して、開発者がセキュアな組み込みアプリケーションを構築するための当社のサポートを体験してください!‍

タグライン

AI主導の開発をリリース前にガバナンスする

AIを活用したリスク測定、コミット時のセキュアコーディングポリシーの強制、そしてSDLC全体を通じたセキュアなデリバリーの加速を実現します。

デモを予約する
リソースライブラリ

他のブログ記事を見る

セキュアコーディング、AIガバナンス、ソフトウェアリスク管理に関する専門的なコンテンツをご覧ください。

すべて表示
導入事例
フィルターラベル
これはdivブロック内のテキストです。

Supercharged Security Awareness: How Tournaments are Inspiring Developers at Erste Group

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse varius enim in eros elementum tristique. Duis cursus, mi quis viverra ornare, eros dolor interdum nulla, ut commodo diam libero vitae erat. Aenean faucibus nibh et justo cursus id rutrum lorem imperdiet. Nunc ut sem vitae risus tristique posuere.

詳細はこちら
導入事例
フィルターラベル
これはdivブロック内のテキストです。

Security as culture: How Blue Prism cultivates world-class secure developers

Learn how Blue Prism, the global leader in intelligent automation for the enterprise, used Secure Code Warrior's agile learning platform to create a security-first culture with their developers, achieve their business goals, and ship secure code at speed

詳細はこちら
導入事例
フィルターラベル
これはdivブロック内のテキストです。

セキュリティ文化の統一:Sageはいかにしてチャンピオンプログラムを構築したか

Sageがどのようにして柔軟かつ関係性を重視したアプローチでセキュリティを強化し、200名以上のセキュリティチャンピオンを育成して、目に見えるリスク低減を実現したのかをご紹介します。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

2026年サイバーセキュリティ意識向上月間:企業防衛に不可欠なAIセキュリティの理解

主要なAI企業の多くが、安全対策が追いつくまでの間、AI開発を世界的に減速させるよう公に呼びかける事態となっています。しかし現実には、深刻なセキュリティ問題はすでに顕在化しています。AI導入に伴う金銭的コストやリスクが増大し続ける中、多くのセキュリティリーダーや経営陣は差し迫った状況に追い込まれています。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

イネーブラー8:プログラムのブランディング

セキュアコーディングプログラムを成功させるには、優れたコンテンツ以上のものが必要です。イネーブラー8では、ブランディングによって参加を「憧れのステータスを得る体験」へと変える方法を解説します。

詳細はこちら
ブログ
フィルターラベル
これはdivブロック内のテキストです。

すべての従業員が今、AIサイバーセキュリティの最前線に立っている

エンタープライズテクノロジーの状況は、手遅れになるまで誰も予測できなかったほどの速さで変化しています。私たちは今、人間が書いたコードと基本的なコパイロット支援の時代から、エージェント型開発ライフサイクル(ADLC)の時代へと正式に足を踏み入れました。自律型AIエージェントは、複数の機能にわたってかつてない効率性をもたらす一方で、全く新しい種類のセキュリティリスクや規制リスクも引き起こしています。

詳細はこちら

AIを活用した開発をリリース前にセキュアに

開発者のリスクを可視化し、ポリシーを適用することで、ソフトウェア開発ライフサイクル全体における脆弱性を未然に防ぎます。

デモを予約する
該当する項目が見つかりません。