制御システム向けのセキュアなCコーディングルール - JPCERT/CC
紹介されたルールは次のとおり。
ARR38-C ライブラリ関数が無効なポインタを生成しないことを保証する
MSC34-C 廃止予定の関数や古い関数を使用しない
ARR30-C 境界外を指すポインタや配列添字を生成したり使用したりしない
STR31-C 文字データとnull終端文字を格納するために十分な領域を確保する
EXP33-C 未初期化のメモリを参照しない
EXP39-C 適合しない型のポインタを使って変数にアクセスしない
STR32-C 文字列はnull終端させる
FIO37-C 読み取られたデータが文字データであると思い込まない
MSC30-C 疑似乱数の生成にrand()関数を使用しない
MSC32-C 乱数生成器は適切なシード値を与えて使う
INT35-C 整数式をより大きなサイズの整数に対して比較や代入をする際には、事前に演算後のサイズで評価する
INT30-C 符号無し整数の演算結果がラップアラウンドしないようにする
INT32-C 符号付き整数演算がオーバーフローを引き起こさないことを保証する
MEM35-C オブジェクトに対して十分なメモリを割り当てる
EXP34-C NULL ポインタを参照しない
ERR33-C 標準ライブラリのエラーを検出し、対処する
MEM30-C 解放済みメモリにアクセスしない
ENV33-C コマンドプロセッサが必要ない場合はsystem()を呼び出さない
POS36-C 権限は正しい順序で破棄する
POS37-C 権限の破棄は確実に行う
FIO31-C 同一のファイルを同時に複数回開かない
FIO42-C 不要になったファイルは正しくクローズする
近年、制御システムにおいてもセキュリティ脆弱性が大きな問題になりつつある。こうしたセキュリティ脆弱性は実装上の不備から発生することが多く、今回指摘された22のルールを活用することで効果的な対策へ結びつけることが期待される。