車載ソフトウェアのコーディングの課題と、実用的な解決策:セキュアな車載ソフトウェア開発の在り方(2)(1/2 ページ)
静的コード解析やソフトウェアコンポジション解析、ファジングテストの使用など、車載ソフトウェア開発ライフサイクルのセキュリティを向上させるソリューションの概要を説明した前回の記事に続き、今回は静的コード解析をテーマにする。最初にコーディングの問題について説明し、次に実用的な解決策について解説する。
静的コード解析やソフトウェアコンポジション解析、ファジングテストの使用など、車載ソフトウェア開発ライフサイクルのセキュリティを向上させるソリューションの概要を説明した前回の記事に続き、今回は静的コード解析をテーマにする。最初にコーディングの問題について説明し、次に実用的な解決策について解説する。
→連載「セキュアな車載ソフトウェア開発の在り方」バックナンバー
コーディング問題の例
車載システムのコーディング問題の例(※1)を図1に示し、以下に簡単に説明する。テレマティクスユニットにはモデムソフトウェアがあり、テレマティクスユニットとバックエンドサーバ間の通信チャネルを作成する。このモデムソフトウェアは、最大1024バイトのパケットサイズの外部メッセージの受信に対応する。テレマティクスユニットにはカスタムコードがあり、モデムソフトウェアからのメッセージを処理し、コマンドプログラムに転送する。カスタムコードは、約100バイトのパケットサイズしか想定されていない。従ってカスタムコードにコーディングの問題、つまりバッファオーバーフローの脆弱性があり、リモートで悪用される可能性がある。
(※1)S. Checkoway, D. McCoy, B. Kantor, D. Anderson, H. Shacham, S. Savage, K. Koscher, A. Czeskis, F. Roesner and T. Kohno, "Comprehensive Experimental Analyses of Automotive Attack Surfaces," in USENIX Security, San Francisco, CA, USA, 2011
研究者によるとこのテレマティクスユニットにリモート攻撃者が約300バイトのエクスプロイトコードを送信することができる。このエクスプロイトコードはモデムソフトウェアで対応されてはいるもののカスタムコードでのバッファオーバーフローが悪用される。エクスプロイトコードにより、攻撃者はテレマティクスユニットを乗っ取り、最終的にCANバス上で任意のメッセージを送信して車両の機能を制御できてしまう。
静的コード解析ツール:セキュリティと品質の問題に対処
自動車業界でソフトウェア開発を行う組織は、静的コード解析ツールを使用することによって上記のようなコーディング問題を防ぐことが可能だ。静的コード解析は主に「セキュリティと品質の問題点の検出」「コーディング規約の準拠の確認」の2つの目的で使用される。
まず1つ目は、セキュリティと品質の問題点の検出について説明しよう。静的コード解析ツールは、ソースコードをスキャンして、さまざまなセキュリティと品質に関連する不具合を見つけることができる。不具合の例としてはバッファーオーバーフローやメモリ破壊、リソースリーク、NULLポインタの間接参照、プログラムのハングなどがある。組織がよくある重大な弱点のリストを参照し、優先順位を検討することが重要である。
例えば、「2020 CWE Top 25 Most Dangerous Software Weaknesses」(※2、3)には、攻撃者が見つけやすく、悪用が容易で、ターゲットシステムを完全に乗っ取る危険性がある25の弱点リストが示されている。このリストには、CWE(共通脆弱性タイプ一覧、Common Weakness Enumeration)のIDと、それに該当するCVSS(共通脆弱性評価システム、Common Vulnerability Scoring System)のスコアが含まれている。さらに、CISQ(Consortium for Information & Software Quality)にはセキュアなソフトウェア開発のために回避すべき74の重大なコーディングとアーキテクチャの弱点が示されている(※4)。
(※2)MITRE, “2020 CWE Top 25 Most Dangerous Software Weaknesses”, https://cwe.mitre.org/top25/archive/2020/2020_cwe_top25.html
(※3)Synopsys, “MITRE releases 2020 CWE Top 25 most dangerous software weaknesses”, https://www.synopsys.com/blogs/software-security/mitre-2020-cwe-top-25-most-dangerous-software-weaknesses/
(※4)CISQ, “Coding Rules for Secure Software” https://www.it-cisq.org/standards/code-quality-standards/security/index.htm
自動車業界でソフトウェア開発を行う組織は、上記のようなCWEリストに基づいて潜在的な不具合を特定するために静的コード解析ツールを使うことができる(※5)。
(※5)Synopsys, “Coverity release ties in well to the latest MITRE CWE Top 25”, https://www.synopsys.com/blogs/software-security/code-quality-issues-static-analysis/
CWE Top 25とCISQから幾つかの重大な弱点の事例は以下の通りだ。
- CWE-119: Improper Restriction of Operations within the Bounds of a Memory Buffer
- CWE-416: Use After Free
- CWE-476: NULL Pointer Dereference
- CWE-798: Use of Hard-coded Credentials
- CWE-369: Divide By Zero
- CWE-561: Dead code
上記のCWEの例は静的コード解析ツールでチェック可能だが一部のCWEは静的コード解析ツールでチェックできないため、設計レビュー(例:CWE-306: Missing Authentication for Critical Function)などの手動レビュー、または脆弱性スキャンツールやファジングツール(例:CWE-862 Missing Authorization)のようなテストツールが必要になることに注目してほしい。
また、静的コード解析ツールは、CやC++などのさまざまなプログラミング言語の特有な品質とセキュリティのチェッカーをサポートしている。より複雑なソフトウェア開発では、特に自動運転機能のために、C/C++を拡張したCUDA(Compute Unified Device Architecture)がよく使用される。
CUDAを使用すると計算の並列化可能な部分にGPU(Graphics Processing Unit)を活用することにより、計算集約型のアプリケーションの高速化が可能になる。図2に示すように、アプリケーションコードの一部、例えば「計算集約型関数」は「デバイス」で実行され(GPUとデバイスメモリを使用)、コードの残りの部分は「ホスト」で実行される(CPUとホストメモリを使用)。
図のフローの例では次の4つのステップが実施される。まず、1つ目のステップはデータがホストメモリからデバイスメモリにコピーされる。2つ目のステップはホストがデバイスに計算集約型関数の実行コマンドの指示をする。
3つ目のステップはデバイスがステップ1でデバイスメモリにコピーされたデータを使用し、GPU上の複数コアで並列計算を実行する。こういった関数はGPUを活用した方がより効率的だ。GPU上で処理した後、関数の結果はデバイスメモリに保存される。最後に、4つ目のステップはデバイスメモリからホストメモリに関数の結果がコピーされる。続いて、ホスト側で次のコマンドが実行され、先ほどデバイス側で計算された関数結果をホスト側で使用することが可能になる。
上記のCUDAを使用した開発プロジェクトでの潜在的なコーディングの問題の検出には、静的コード解析ツールは、例えば、メモリ管理などのチェッカーを含む、CUDA特有のチェッカー(※6)をサポートする必要がある。
(※6)Synopsys, ”Coverity Coverage for Common Weakness Enumeration (CWE)”, https://www.synopsys.com/software-integrity/security-testing/static-analysis-sast/coverity-cwe.html
Copyright © ITmedia, Inc. All Rights Reserved.