JPCERT コーディネーションセンター

00. はじめに

CERT セキュアコーディングスタンダードの概要

ネットワーク化されたソフトウェアシステムへの依存度が高まるにつれ、そのようなシステムを狙った攻撃の数は増えてきている。政府、企業、教育機関、個人を狙ったこれらの攻撃は、機密データの消失や漏えい、システムの損傷、生産性の低下、および金銭的な損失につながっている。

ソフトウェアの脆弱性に関する報告は驚くべき速さで増え続けており、そのうちの大部分はテクニカルアラート(注意喚起)の発行につながっている。この増大する脅威に対処するためには、ソフトウェアの開発や継続的なメンテナンスの過程で作りこまれるソフトウェアの脆弱性を大幅に削減する必要がある。

安全なソフトウェア開発に不可欠な要素は、適切に明文化された、適用可能なコーディングスタンダードである。コーディングスタンダードがあれば、プログラマは個人の得意な方法や好みではなく、プロジェクトと組織の要件によって決められた統一的な一連のルールとガイドラインに従うことができる。一度標準が策定されれば、それを(手動または自動のプロセスにより)ソースコードの評価基準として使用し、標準への適合を確認することができる。

CERT が提案しているセキュアコーディングスタンダードは、標準化団体が定める明文化された標準言語に基づく。たとえば、CERT セキュアコーディングスタンダードは次の言語を対象としている。

  • プログラミング言語 C(ISO/IEC 9899:1999)[ISO/IEC 9899-1999]
  • プログラミング言語 C++(ISO/IEC 14882:2003)[ISO/IEC 14882-2003]
  • プログラミング言語 Java

ISO/IEC TR 24731 C言語ライブラリ拡張 [ISO/IEC TR 24731-1-2007] のような技術正誤表や言語拡張へ CERT セキュアコーディングスタンダードを適用することも検討されている。

適用範囲としては、特定の指針を広範なユーザ層に提供することを念頭に置いている。ISO/IEC が策定するプログラミング言語の標準などは、主にコンパイラ実装者を対象に書かれているが、CERT セキュアコーディングスタンダードは、それら標準で定められた言語でプログラムを書く開発者を直接の対象として書かれたルールとレコメンデーションを示す補助的な文書である。

C言語、C++言語用のCERT セキュアコーディングスタンダードの目的は、それぞれのプログラミング言語で開発されたソフトウェアシステムのセキュリティを確保するために必要な(ただし十分ではない)一連のルールを定めることである。

ルールとレコメンデーション

CERT セキュアコーディングスタンダードは、ルールとレコメンデーションから構成されている。次の条件をすべて満たすコーディング作法は、ルールとして定義されている。

  • コーディング作法に違反することが、攻撃可能な脆弱性を生み出すセキュリティ上の欠陥につながる可能性がある。
  • コーディング作法へ適合しているかどうかを、自動解析、形式的方法、手作業によるソースコード検査などを通じて確認することができる。

つまりルールとは、ソフトウェアシステムのセキュリティを確保するために必ず適用すべきコーディング作法である。

レコメンデーションは、ガイドラインまたは提案である。コーディング作法は、次の条件をすべて満たすときレコメンデーションとして定義されている。

  • コーディング作法を適用することで、システムのセキュリティが高まる可能性がある。
  • コーディング作法がルールと見なされるための要件を 1 つ以上満たすことができない。

開発作業においてどのレコメンデーションを適用するかは、最終的なソフトウェア製品のセキュリティ要件によって異なる。高いセキュリティが要求されるソフトウェア開発プロジェクトでは、より多くのリソースをセキュリティ対策に投入でき、結果的により多くのレコメンデーションを適用することだろう。

また、コーディング作法によっては、セキュリティ向上のために適用する必要のない状況が存在する。そのような場合には、個々のルールやレコメンデーションで、「例外」として記載している。

優先度とレベル

各ルールとレコメンデーションには優先度が設定されている。優先度の設定には、故障モード(failure mode)、影響(effect)、致命度解析(criticality analysis)に基づくメトリックを用いている(FMECA [IEC 60812])。各ルールには、次の3項目について 1 から 3 のスケールで3つの評価値を割り当てている。

  • 深刻度:ルールが無視された場合の結果がどれくらい深刻か
    1. 1=低 (DoS 攻撃、異常終了)
    2. 2=中 (データの完全性違反, 意図しない情報漏えい)
    3. 3=高 (任意のコード実行)
  • 可能性:ルールを無視することで作りこまれた欠陥が攻撃可能な脆弱性につながる可能性
    1. 1=低
    2. 2=中
    3. 3=高
  • 修正コスト:ルールに適合するために要するコスト
    1. 1=高 (手作業で発見・修正する)
    2. 2=中 (自動で発見し、手作業で修正する)
    3. 3=低 (自動で発見・修正する)

これら3つの評価値を掛け算した結果はルールの適用を優先度づけするための指標となる。値は1から27の範囲をとる。優先度が1から4(P1-P4)の範囲のルールとレコメンデーションはレベル3(L3)、優先度が6から9(P6-P9)はレベル2(L2)、優先度が12から27(P12-P27)はレベル1(L1)となる。次の図で示すように、すべてのルールとレコメンデーションにレベルを設定することで、レベル1、レベル2、もしくはスタンダードへ完全に適合(レベル3)を主張することができる。

レベルと優先度

Top へ

Topへ
最新情報(RSSメーリングリストTwitter