なぜMISRA/CWE/CERTをもとにした静的解析が重要か
静的解析ツールC-STATはIAR Embedded Workbenchに完全に統合されており、アプリケーションがMISRAで規定された車載向けコーディング標準に準拠することを確認するのに便利な方法を提供します。しかし、C-STATは、車載向けに限らず、全ての分野のアプリケーションの品質に貢献します。MISRAのルールに加え、CWEとCERTをもとにした数百にも及ぶチェックやC-STAT特有のチェックが可能です。
C-STATは、MISRAやCERT、CWEによって危険と指摘された特定のコード構造を回避するのに役立ちます。本稿では、それらの指摘についての背景と、なぜそれらを遵守することにこだわる必要があるのかご紹介します。
MISRA C/C++
MISRA-Cルールは、英国の自動車業界団体MISRA(Motor Industry Software Reliability Association)が、車載ソフトウェアのみを対象とした取り組みとして始まりました。長年にわたり、MISRA-Cは世界中に、その他の産業も含めて広まり、組込み業界で最も広く使用されるC言語のサブセットとなっています。
最新のMISRA-C:2012では143のルールと16の指針が規定されます。ルールは、必須・必要・推奨に分類されます。コンパイラ毎の整数のサイズの違いを回避すること・不具合のもととなりやすい関数や構造体の使用を控えること・コードの複雑さを制限すること・命名規則やコメントによるメンテナンス性の確保といったことをカバーします。
Common Weakness Enumeration (CWE)
CWE(共通脆弱性タイプ一覧)は、コミュニティーベースでまとめられたソフトウェアの弱点や脆弱性の辞書です。各項目にはIDが振られ、脆弱性の背景と起こりうる問題、緩和策とコード例、分類と参考文献、といった情報が説明されます。CWEはソフトウェア脆弱性のより深い理解とマネジメント、ソフトウェア脆弱性を検出するツールやサービスの効果的な選択を助けることを目的としています。プロジェクトは米国NPOで、米国政府の支援を受けるMITRE社を中心に、仕様策定が行われました。
ソフトウェア脆弱性とは何か?MITRE社はソフトウェアの実装・設計・アーキテクチャに存在し、対処しないことでシステムやネットワークを攻撃に対して脆弱にしうる、欠陥・障害・バグ・脆弱性・その他のエラーと定義しています。
一覧に掲載された脆弱性の全てが組込みシステムに関するものではないですが、CWE/SANS top 25 listの最も危険なソフトウェアエラーについて見れば、それらの多くが間違いなく注意すべきものとわかるでしょう。リストは、例えば、バッファの大きさを確認しないで行うバッファのコピー、バッファの大きさの間違った計算、制御不能なフォーマット文字列と整数のオーバーフローとラップアラウンドといったものを含みます。これはトップ25のリストだけで、完全な辞書としては1000を超える項目が存在します。
CERT C/C++
CERT C/C++セキュアコーディング標準はC/C++によるセキュアなコーディングのためのルールと推奨を提供します。カーネギーメロン大学ソフトウェア工学研究所 (SEI)のCERT部門が発行しています。SEIは、主に米国国防総省と国土安全保障省から資金提供を受けている研究開発センターです。
CERTは、CとC++のセキュアコーディングのルールを規定します。各ガイドラインは、名称・説明・非準拠のコーディング例・準拠の例で構成されます。コーディング標準は、実装エラーや抽象度の低い設計に関するエラーの回避のための、ガイドラインを含みます。目的は、脆弱性となりうる、非セキュアな実装および未定義動作を減らすことです。
異なる標準間の関係
異なる標準同士は、お互いに重なりあい、補完をする関係です。CWEはソフトウェアの既知の脆弱性の概要を示し、一方でCERTとMISRAはソフトウェアの脆弱性を露呈する恐れのある構造を特定するものです。CWEの全てのルールを包含するコーディング標準はありません。それは、一つのプログラミング言語にCWEの全てのルールが含まれるわけではないからです。加えて、いくつかの脆弱性は、コーディングというよりは設計に関連するものだからです。また、MISRAやCERTで規定されるガイドラインの全てがCWEの各項目にマッピングできるものでもありません。それは、問題のあるコーディングがいつも特定の脆弱性に結びつくとは限らないからです。しかしながら、CERTのガイドラインは、可能な限りCWEの各項目への参照をするようにしています。
以上のように標準間には相互に補完関係があるので、開発中のソフトウェアが安全でセキュアであることを確実にするために、各事例を参照することが賢明で、必要とさえ言えます。
自動化しましょう!
C-STATは、MISRA準拠・CERT C/C++セキュアコーディング標準・CWEで定義された脆弱性、のセキュリティチェックを実行します。コーディングの各種準拠の確認をより簡素にするため、C-STATはCWEに既定の名称で脆弱性を出力することができます。
C-STATのすべての検査は、CWEやMISRA、CERT規格の対応する項目を参照しながら、文書化されています。ユーザはルールセットに対するチェックと、個別のルールに対するチェックを選択することができます。
図:配列の範囲外へのアクセスの可能性に関するチェックの概要と、関連するCWEの項目とCERTとMISRAのルール
C-STATはIAR Embedded Workbenchに完全に統合され、通常のビルドツールと同様に簡単に使用できます。静的解析のセットアップの煩雑さや、言語サポートやビルドに対する追加の設定などはありません。C-STATは約250のユニークなチェックを行います。各チェックは、CERT・CWE・MISRA C:2012・MISRA C++:2008・MISRA C:2004などをもとにした約600のコーディング標準やルールに紐づいています。
C-STATのチェックは、CWEとCERT C/C++で言及される数百の問題に対応しています。
C-STATはCとC++の言語仕様をサポートし、さらにIAR Embedded Workbench固有の言語仕様にも対応します。これにより、直接ハードウェアを制御するコードの開発をするビルドツールにおいても簡単にご使用可能です。最先端の静的解析は、バッファオーバフロー・算術演算と型変換による問題・ヒープの問題など、大小の問題を特定します。
モジュールを超えた解析が有効なチェックに対して、C-STATはモジュール間で解析情報を共有し、実施します。C-STATは複数ファイルのコンパイルモードで実行できます。このとき、全ソースコードが1つのモジュールとして解析され、一部の解析では精度を向上させることができます。
C-STATは開発中のコードの品質向上のため、ユーザに有用な手段となります。コードの品質チェックを各開発者が日々の業務に取り入れることで、製品の問題をいち早く検出し、出荷後の不具合の影響を最小化し、そしてプロジェクトのタイムラインを守ることができます。