初心者向け解説!SEI CERT コーディング規約ってなんだろう?

安全なソフトウェア開発のための道しるべ

こんにちは!ソフトウェア開発の世界へようこそ! プログラミングをしていると、「セキュリティ」という言葉をよく耳にするかもしれませんね。 安全で信頼性の高いソフトウェアを作ることは、とても重要です。そこで登場するのが「SEI CERT コーディング規約」(SEI CERT Coding Standards)です。

なんだか難しそう…と感じるかもしれませんが、心配いりません!このブログでは、SEI CERT コーディング規約がどんなものなのか、なぜ大切なのかを初心者の方にも分かりやすく解説します。

SEI CERT コーディング規約って、いったい何?

SEI CERT コーディング規約は、ソフトウェアをより安全に、信頼性が高く、そしてセキュア(攻撃されにくく)にするために作られた、プログラミングのお作法集(ルールブック)のようなものです。

この規約は、アメリカのカーネギーメロン大学にある「CERT/CC (Coordination Center)」という、コンピュータセキュリティを専門に研究している組織の一部門(Software Engineering Institute、略してSEI)が中心となって開発しています。CERTは、ソフトウェア開発者やセキュリティ専門家コミュニティの知識を集めて、これらの規約を作成・更新しています。

これらの規約は、特にセキュリティ上の「脆弱性(ぜいじゃくせい)」、つまりソフトウェアの弱点や欠陥につながりやすい、危険な書き方や、プログラムがどう動くか予測できない「未定義の動作」を避けるための具体的なルールや推奨事項を定めています。

例えば、2003年頃にC言語の標準化委員会との議論からC言語版の規約のアイデアが生まれ、その後、C++版やJava版などが開発されてきました。

主な目的は?

SEI CERT コーディング規約が目指しているのは、主に以下の3つです。
  • 安全性 (Safety): ソフトウェアが予期せぬ動作をせず、意図しない損害を与えないようにすること。
  • セキュリティ (Security): 悪意のある攻撃や不正アクセスからソフトウェアを守ること。
  • 信頼性 (Reliability): ソフトウェアが期待された通りに、安定して動作すること。
これらを実現することで、バグが少なく、攻撃にも強い、高品質なソフトウェアを作ることができます。

どんな言語に対応しているの?

SEI CERT コーディング規約は、広く使われているいくつかのプログラミング言語に対応しています。

  • C言語
  • C++言語
  • Java言語 (Oracle)
  • Perl言語
  • Android OS 向け

それぞれの言語の特性に合わせた規約が用意されています。特にC言語やC++言語は、メモリ管理などで注意が必要な部分が多いため、規約の重要性が高いと言われています。

規約の構成:ルールと推奨事項

規約は主に「ルール (Rule)」と「推奨事項 (Recommendation)」の2種類で構成されています。

  • ルール (Rule): これは「守るべき決まりごと」です。違反すると、セキュリティ上の問題や予期せぬ動作を引き起こす可能性が高いとされるものです。
  • 推奨事項 (Recommendation): これは「従うことが望ましいアドバイス」です。必ずしも守らなければならないわけではありませんが、従うことでソフトウェアの品質や安全性をさらに向上させることができます。

さらに、各ルールや推奨事項には、リスク評価(深刻度、脆弱性が悪用される可能性、修正コスト)に基づいて優先度が付けられていることがあります (L1: 高, L2: 中, L3: 低など)。これにより、どの項目から対応すべきかの判断材料になります。

規約は分野ごとに分類されています。例えばC言語規約では、以下のようなカテゴリがあります。

カテゴリ略称 カテゴリ名 (日本語例) 内容の例
PRE プリプロセッサ マクロの安全な使い方など
DCL 宣言と初期化 変数の宣言や初期化に関する注意点
EXP 演算子の優先順位や副作用に関する注意点
INT 整数 整数オーバーフローなどの問題
ARR 配列 配列の範囲外アクセス(バッファオーバーフロー)など
STR 文字と文字列 文字列操作に関する注意点
MEM メモリ管理 メモリ解放忘れ(メモリリーク)や解放済みメモリへのアクセスなど
FIO 入出力 ファイル操作や標準入出力の安全な使い方
ERR エラー処理 エラー発生時の適切な対応
CON 並行性 複数処理を同時に動かす際の注意点

具体的なルール例:バッファオーバーフローを防ぐ (C言語)

たくさんあるルールの中から、代表的なものを一つ見てみましょう。C言語でよく問題になる「バッファオーバーフロー」に関するルールです。

バッファオーバーフローとは、用意されたメモリ領域(バッファ)よりも大きなデータが書き込まれてしまい、メモリがあふれてしまう現象です。これが起こると、プログラムが異常終了したり、最悪の場合、攻撃者にプログラムを乗っ取られたりする可能性があります。

脆弱な可能性のあるコード (例: CERT C ARR30-C違反の可能性)

// 文字列をコピーするが、コピー先のサイズをチェックしていない
void vulnerable_copy(char *input) {
  char buffer[10]; // 10バイトのバッファ
  strcpy(buffer, input); // inputが10バイト以上だとバッファオーバーフロー!
  printf("Copied: %s\n", buffer);
}

上のstrcpy関数は、コピー先のbufferのサイズを考慮せずにinputの内容をコピーします。もしinputが10文字以上の文字列だったら、bufferからあふれてメモリを破壊してしまいます。

対策されたコード (例: CERT Cルールに従った改善)

// コピー先のサイズを指定して安全にコピーする
#include <string.h> // strncpyのため
#include <stdio.h> // printfのため

void secure_copy(char *input) {
  char buffer[10]; // 10バイトのバッファ
  // bufferのサイズを超えないように、最大9文字までコピーし、最後にNULL文字を追加
  strncpy(buffer, input, sizeof(buffer) - 1);
  buffer[sizeof(buffer) - 1] = '\0'; // 必ずNULL終端する
  printf("Copied safely: %s\n", buffer);
}

改善後のコードではstrncpy関数を使っています。この関数は、コピーする最大文字数を指定できるため、バッファサイズを超える書き込みを防ぐことができます。最後の行で確実にNULL終端している点も重要です。これにより、バッファオーバーフローのリスクを大幅に減らすことができます。

このように、SEI CERT コーディング規約は、危険なコードの書き方を具体的に示し、より安全な代替手段を教えてくれます。

SEI CERT コーディング規約を使うメリット

まとめ

SEI CERT コーディング規約は、安全で信頼性の高いソフトウェアを作るための、とても役立つガイドラインです。最初は難しく感じるかもしれませんが、一つ一つのルールには、ソフトウェアを良くするための理由があります。

すべてのルールをすぐに完璧に覚える必要はありません。まずは、このような規約があることを知り、なぜそれが必要なのかを理解するところから始めましょう。そして、少しずつ開発に取り入れていくことで、あなたの書くコードはより安全で、高品質なものになっていくはずです。

安全なコーディングの世界を探求する旅を楽しんでくださいね!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です