CERT Cセキュアコーディングスタンダード
Robert C. Seacord 著
JPCERTコーディネーションセンター
久保正樹・戸田洋三 共訳
発行:アスキー・メディアワークス
定価:本体4,800円+税
ISBN:978-4-04-867796-7
Web版 (CERT C Secure Coding Standard 日本語版)
JPCERTコーディネーションセンター
久保正樹・戸田洋三 共訳
発行:アスキー・メディアワークス
定価:本体4,800円+税
ISBN:978-4-04-867796-7
Web版 (CERT C Secure Coding Standard 日本語版)
内容
セキュアなコーディングを実践することは、脆弱性を作りこまないためにも重要だが、ソフトウェアの品質向上のためにも考慮すべきである。その考えのもとCERT/CCの上級アナリストによる、実績のあるコーディングルールを体系的にまとめている。
- 第1章 本コーディングスタンダードの使い方
- 第2章 プリプロセッサ(PRE)
- 第3章 宣言と初期化(DCL)
- 第4章 式(EXP)
- 第5章 整数(INT)
- 第6章 浮動小数点(FLP)
- 第7章 配列(ARR)
- 第8章 文字と文字列(STR)
- 第9章 メモリ管理(MEM)
- 第10章 入出力(FIO)
- 第11章 環境(ENV)
- 第12章 シグナル(SIG)
- 第13章 エラー処理(ERR)
- 第14章 雑則(MSC)
- 付録 POSIX(POS)
目次
- 訳者まえがき
- はじめに
- 謝辞
- 著者について
第1章 本コーディングスタンダードの使い方
システムの品質 |
自動生成されるコード |
スタンダードへの準拠 |
第2章 プリプロセッサ(PRE)
PRE30-C. | 文字列連結によってユニバーサル文字名を作成しない |
---|---|
PRE31-C. | 代入、インクリメント、デクリメント、volatile アクセス、または関数呼び出しを含む引数を使って安全でないマクロを呼び出さない |
第3章 宣言と初期化(DCL)
DCL30-C. | 適切な記憶域期間を持つオブジェクトを宣言する |
---|---|
DCL31-C. | 識別子は宣言してから使用する |
DCL32-C. | 相互に可視である識別子が一意であることを保証する |
DCL33-C. | 関数引数中でrestrict 修飾されたコピー元およびコピー先が、重複したオブジェクトを参照しないようにする |
DCL34-C. | キャッシュできないデータにはvolatile を使う |
DCL35-C. | 関数定義と一致しない型で関数を呼び出さない |
DCL36-C. | 矛盾する結合の種類を使用して識別子を宣言しない |
第4章 式(EXP)
EXP30-C. | 副作用完了点間の評価の順序に依存しない |
---|---|
EXP31-C. | assert() の中では副作用を避ける |
EXP32-C. | volatile 修飾子をキャストにより無効にしない |
EXP33-C. | 未初期化のメモリを参照しない |
EXP34-C. | NULL ポインタを参照しない |
EXP35-C. | 関数呼び出しの結果の次の副作用完了点よりあとでアクセスや変更を行わない |
EXP36-C. | ポインタをより厳密にアラインされるポインタ型に変換しない |
EXP37-C. | API が意図した引数で関数を呼び出す |
EXP38-C. | ビットフィールドメンバや無効な型でoffsetof() を呼び出さない |
EXP39-C. | 適合しない型のポインタを使って変数にアクセスしない |
第5章 整数(INT)
INT30-C. | 符号なし整数の演算結果がラップアラウンドしないようにする |
---|---|
INT31-C. | 整数変換によってデータの消失や解釈間違いが発生しないことを保証する |
INT32-C. | 符号付き整数演算がオーバーフローを引き起こさないことを保証する |
INT33-C. | 除算および剰余演算がゼロ除算エラーを引き起こさないことを保証する |
INT34-C. | 負のビット数、あるいはオペランドのビット数以上シフトしない |
INT35-C. | 整数式をより大きなサイズの整数に対して比較や代入をする際には、事前に演算後のサイズで評価する |
第6章 浮動小数点(FLP)
FLP30-C. | 浮動小数点変数をループカウンタに使用しない |
---|---|
FLP31-C. | 実数値を引数にとる関数を複素数値で呼び出さない |
FLP32-C. | 数学関数における定義域エラーおよび値域エラーを防止または検出する |
FLP33-C. | 浮動小数点数の演算時には整数を浮動小数点数に変換する |
FLP34-C. | 浮動小数点の型変換が新しい型の範囲に収まるようにする |
FLP35-C. | 浮動小数点数値を比較する際には精度を考慮する |
第7章 配列(ARR)
ARR30-C. | 配列のインデックスが適切な範囲内にあることを保証する |
---|---|
ARR31-C. | すべてのソースファイルにわたり一貫性のある配列表記を用いる |
ARR32-C. | 可変長配列のサイズ引数は適切な範囲内にあることを保証する |
ARR33-C. | コピーは必ず十分なサイズの記憶領域に対して行われることを保証する |
ARR34-C. | 式中の配列の型は互換性があることを保証する |
ARR35-C. | ループが配列の最後を越えて反復処理しない |
ARR36-C. | 異なる配列を指す2 つのポインタに対して減算や比較を行わない |
ARR37-C. | 配列以外のオブジェクトを指すポインタに対して整数の加算や減算を行わない |
ARR38-C. | 結果の値が有効な配列要素を指さないような、ポインタに対する整数の加算や減算を行わない |
第8章 文字と文字列(STR)
STR30-C. | 文字列リテラルを変更しない |
---|---|
STR31-C. | 文字データとNULL 終端文字を格納するために十分な領域を確保する |
STR32-C. | 文字列はNULL 終端させる |
STR33-C. | ワイド文字の文字列サイズは正しく求める |
STR34-C. | 文字データをより大きなサイズの整数型に変換するときは事前にunsigned 型に変換する |
STR35-C. | 長さに制限のないコピー元から固定長配列へデータをコピーしない |
STR36-C. | 文字列リテラルで初期化された文字配列の範囲を指定しない |
STR37-C. | 文字処理関数への引数はunsigned char として表現できなければならない |
第9章 メモリ管理(MEM)
MEM30-C. | 解放済みメモリにアクセスしない |
---|---|
MEM31-C. | 動的に割り当てられたメモリは一度だけ解放する |
MEM32-C. | メモリ割り当てエラーを検出し、対処する |
MEM33-C. | フレキシブル配列メンバには正しい構文を使用する |
MEM34-C. | 動的に割り当てられたメモリのみを解放する |
MEM35-C. | オブジェクトに対して十分なメモリを割り当てる |
第10章 入出力(FIO)
FIO30-C. | ユーザ入力を使って書式指定文字列を組み立てない |
---|---|
FIO31-C. | 同一のファイルを同時に複数回開かない |
FIO32-C. | 通常ファイルに固有の操作をデバイスファイルに対して行わない |
FIO33-C. | 未定義の動作となる入出力のエラーを検出して処理する |
FIO34-C. | 文字入出力関数の返り値の取得にはint 型を使用する |
FIO35-C. | sizeof(int) == sizeof(char) の場合、EOF およびファイルエラーの検出にfeof() とferror() を使用する |
FIO36-C. | fgets() が改行文字を読み取ると仮定しない |
FIO37-C. | 読み取られたデータが文字データであると思い込まない |
FIO38-C. | 入出力操作にFILE オブジェクトのコピーを使用しない |
FIO39-C. | fflush 関数やファイル位置付け関数を呼び出さずにストリームへの入出力を交互に行わない |
FIO40-C. | fgets() が失敗したときは引数に渡した配列をリセットする |
FIO41-C. | 副作用を持つストリーム引数をgetc() またはputc() に渡さない |
FIO42-C. | 不要になったファイルは正しくクローズする |
FIO43-C. | 共有ディレクトリに一時ファイルを作成しない |
FIO44-C. | fsetpos() にはfgetpos() が返す値を使用する |
第11章 環境(ENV)
ENV30-C. | getenv() が返す文字列を変更しない |
---|---|
ENV31-C. | 環境変数へのポインタを無効にするかもしれない操作の後で、そのポインタを参照しない |
ENV32-C. | atexit() でしたハンドラ関数は必ずreturn する |
第12章 シグナル(SIG)
SIG30-C. | シグナルハンドラ内では非同期安全な関数のみを呼び出す |
---|---|
SIG31-C. | シグナルハンドラ内で共有オブジェクトにアクセスしない |
SIG32-C. | シグナルハンドラ内からlongjmp() を呼び出さない |
SIG33-C. | raise() 関数を再帰的に呼び出さない |
SIG34-C. | 割り込み可能なシグナルハンドラ内からsignal() を呼び出さない |
第13章 エラー処理(ERR)
ERR30-C. | 関数を呼び出す前にerrno をゼロに初期化し、関数の異常終了時にのみerrnoを参照する |
---|---|
ERR31-C. | errno を再定義しない |
ERR32-C. | errno の不定の値を参照しない |
第14章 雑則(MSC)
MSC30-C. | 擬似乱数の生成にrand() 関数を使用しない |
---|---|
MSC31-C. | 関数の返り値は適切な型と比較する |
MSC32-C. | 乱数生成器は適切なシード値を与えて使う |
付録 POSIX(POS)
POS30-C. | readlink() 関数を正しく使用する |
---|---|
POS31-C. | 他のスレッドのミューテックスをアンロックしたり破壊した りしない |
POS32-C. | 複数スレッドによるビットフィールドへのアクセスは、ミューテックスで保護する |
POS33-C. | vfork() は使用しない |
POS34-C. | 自動変数へのポインタを引数としてputenv() を呼び出さない |
POS35-C. | シンボリックリンクの有無のチェック時の競合状態を避ける |
POS36-C. | 権限は正しい順序で破棄する |
POS37-C. | 権限の破棄は確実に行う |