- CERTコーディングスタンダードの利用条件/著作権・免責事項
- はじめに
- Androidアプリケーション開発へのルールの適用
- 00. 入力値検査とデータの無害化 (IDS)
- 01. 宣言と初期化 (DCL)
- 02. 式 (EXP)
- 03. 数値型とその操作 (NUM)
- 04. 文字と文字列 (STR)
- 05. オブジェクト指向 (OBJ)
- 06. メソッド (MET)
- 07. 例外時の動作 (ERR)
- 08. 可視性とアトミック性 (VNA)
- 09. ロック (LCK)
- 10. スレッド API (THI)
- 11. スレッドプール (TPS)
- 12. スレッドの安全性に関する雑則 (TSM)
- 13. 入出力 (FIO)
- 14. シリアライズ (SER)
- 15. プラットフォームのセキュリティ (SEC)
- 16. 実行環境 (ENV)
- 49. 雑則 (MSC)
- AA. 参考情報
- BB. Glossary
- XX. お問い合わせ
00入力値検査とデータの無害化 (IDS)
ルール
| IDS00-J | SQL インジェクションを防ぐ |
| IDS01-J | 文字列は検査する前に正規化する |
| IDS03-J | ユーザ入力を無害化せずにログに保存しない |
| IDS04-J | ZipInputStream からファイルを安全に展開する |
| IDS06-J | 無害化されていないユーザ入力を使って書式指定文字列を組み立てない |
| IDS07-J | Runtime.exec()メソッドに渡す信頼できないデータは無害化する |
| IDS08-J | 信頼できないデータは、正規表現に含める前に無害化する |
| IDS11-J | 文字列の変更はすべて検査の前に行う |
| IDS14-J | hiddenが指定された入力欄の内容を信頼しない |
| IDS16-J | XML インジェクションを防ぐ |
| IDS17-J | XML 外部エンティティ(実体)攻撃を防ぐ |
移動または廃止されたルール
| IDS02-J | パス名は検証する前に正規化する |
| IDS05-J | ファイル名やファイルパスにはASCII文字セットの一部の文字のみを使用する |
| IDS09-J | 適切なロケールを指定せずに、ロケール依存メソッドをロケール依存データに対して使用しない |
| IDS10-J | 一文字を構成するデータを分割しない |
| IDS12-J | 異なる文字コードへの文字列データの変換はデータが欠損しないように行う |
| IDS13-J | ファイル入出力やネットワーク入出力の両端で互換性のある文字エンコーディングを使う |
レコメンデーション
| IDS50-J | ファイル名には厳しい命名規則を使う |
01宣言と初期化 (DCL)
ルール
| DCL00-J | クラスの初期化を循環させない |
| DCL01-J | Java標準ライブラリが使用するパブリック宣言された識別子を再利用しない |
| DCL02-J | 拡張 for 文のループ変数は必ず final 宣言する |
02式 (EXP)
ルール
| EXP00-J | メソッドの返り値を無視しない |
| EXP01-J | null ポインタ参照しない |
| EXP02-J | 配列の中身を比較するには2引数の Arrays.equals() メソッドを使う |
| EXP03-J | ボクシングされたプリミティブ型の値の比較に等値演算子を使わない |
| EXP04-J | オートボクシングされた値が想定した型を持つようにする |
| EXP05-J | ひとつの式の中で同じ変数に2回以上書込みを行わない |
| EXP06-J | アサーションに副作用を持つ式を使わない |
03数値型とその操作 (NUM)
ルール
| NUM00-J | 整数オーバーフローを検出あるいは防止する |
| NUM01-J | 同一のデータに対してビット演算と算術演算の両方を行わない |
| NUM02-J | 除算と剰余演算でゼロ除算エラーを起こさない |
| NUM03-J | 符号無しデータのとり得る値をすべて表現できる整数型を使う |
| NUM04-J | 正確な計算が必要なときは浮動小数点数を使わない |
| NUM05-J | 非正規化数を使用しない |
| NUM06-J | どのプラットフォームでも一貫した浮動小数点数演算を行うために strictfp 修飾子を使う |
| NUM07-J | NaNとの比較を行わない |
| NUM08-J | 浮動小数点数入力が例外値でないかを検査する |
| NUM09-J | 浮動小数点数型変数をループカウンタとして使用しない |
| NUM10-J | 浮動小数点数リテラルから BigDecimal クラスのオブジェクトを生成しない |
| NUM11-J | 浮動小数点数の文字列表現を比較したり内容を調べたりしない |
| NUM12-J | 数値型の縮小変換時にデータの欠損や誤解釈を引き起こさない |
| NUM13-J | プリミティブ整数を浮動小数点数に変換する際、精度を低下させない |
04文字と文字列 (STR)
ルール
| STR01-J | Java の char 型が Unicode のコードポイントを完全に表現できると想定しない |
| STR02-J | 適切なロケールを指定せずに、ロケール依存メソッドをロケール依存データに対して使用しない |
| STR04-J | JVM 間で文字列データを通信するときは互換性のある文字エンコーディングを使う |
05オブジェクト指向 (OBJ)
ルール
06メソッド (MET)
ルール
07例外時の動作 (ERR)
ルール
| ERR00-J | チェック例外を抑制あるいは無視しない |
| ERR01-J | センシティブな情報を例外によって外部に漏えいしない |
| ERR02-J | ログ保存中の例外発生を防ぐ |
| ERR03-J | メソッドが処理に失敗した場合はオブジェクトの状態を元に戻す |
| ERR04-J | finally ブロックの処理を途中で終了しない |
| ERR05-J | チェック例外を finally ブロックの外に伝播させない |
| ERR06-J | 宣言されていないチェック例外をスローしない |
| ERR07-J | RuntimeException, Exception, Throwable をスローしない |
| ERR08-J | NullPointerException およびその親クラスの例外をキャッチしない |
| ERR09-J | 信頼できないコードにJVMを終了させない |
08可視性とアトミック性 (VNA)
ルール
| VNA00-J | 共有プリミティブ型変数の可視性を確保する |
| VNA01-J | 不変オブジェクトへの共有参照の可視性を確保する |
| VNA02-J | 共有変数への複合操作のアトミック性を確保する |
| VNA03-J | アトミックなメソッドをまとめた呼び出しがアトミックであると仮定しない |
| VNA04-J | メソッドチェーン呼出しのアトミック性を確保する |
| VNA05-J | 64ビット値の読み書きはアトミックに行う |
09ロック (LCK)
ルール
10スレッド API (THI)
ルール
| THI00-J | Thread.run() メソッドを直接呼び出さない |
| THI01-J | ThreadGroup クラスのメソッドを使用しない |
| THI02-J | 1つではなくすべての待ち状態スレッドへ通知を行う |
| THI03-J | wait() および await() メソッドは常にループ内部で呼び出す |
| THI04-J | ブロックしているスレッドやタスクが確実に終了できるようにする |
| THI05-J | スレッドの強制終了にThread.stop()メソッドを使用しない |
11スレッドプール (TPS)
ルール
12スレッドの安全性に関する雑則 (TSM)
ルール
| TSM00-J | スレッドセーフなメソッドを、スレッドセーフでないメソッドでオーバーライドしない |
| TSM01-J | オブジェクトの構築時にthis参照を逸出させない |
| TSM02-J | クラスの初期化中にバックグラウンドスレッドを使用しない |
| TSM03-J | 初期化が完了していないオブジェクトを公開しない |
13入出力 (FIO)
ルール
| FIO00-J | 共有ディレクトリにあるファイルを操作しない |
| FIO01-J | 適切なパーミッションを設定してファイルを作成する |
| FIO02-J | ファイル関連エラーを検知し、処理する |
| FIO03-J | 一時ファイルはプログラムの終了前に削除する |
| FIO04-J | 不要になったリソースは解放する |
| FIO05-J | wrap() や duplicate() メソッドで作成したバッファを信頼できないコードにアクセスさせない |
| FIO06-J | 1つの InputStream に対して複数のバッファ付きラッパーを作成しない |
| FIO07-J | 外部プロセスに IO バッファをブロックさせない |
| FIO08-J | 文字やバイトを読み取るメソッドの返り値はintで受ける |
| FIO09-J | 0から255の範囲に収まらない整数値を出力するときには write() メソッドを信用しない |
| FIO10-J | read() を使って配列にデータを読み込むときには配列への読み込みが意図した通りに行われたことを確認する |
| FIO11-J | バイナリデータを文字データとして読み込もうとしない |
| FIO12-J | リトルエンディアン形式のデータを読み書きするメソッドを用意する |
| FIO13-J | センシティブな情報を信頼境界の外に記録しない |
| FIO14-J | プログラムの終了時には適切なクリーンアップを行う |
| FIO16-J | パス名は検証する前に正規化する |
14シリアライズ (SER)
ルール
| SER00-J | 開発中のクラスにおいてシリアライズの互換性を維持する |
| SER01-J | シリアライズに関連するメソッドは正しいシグネチャで実装する |
| SER02-J | センシティブなオブジェクトは信頼境界を越えて送信する前に署名し暗号化する |
| SER03-J | 暗号化されていないセンシティブなデータをシリアライズしない |
| SER04-J | シリアライズと復元においてセキュリティマネージャによるチェックをバイパスさせない |
| SER05-J | 内部クラスのインスタンスをシリアライズしない |
| SER06-J | 復元時には private 宣言された可変コンポーネントはディフェンシブコピーする |
| SER07-J | 実装上必要となる不変条件がある場合にはデフォルトのシリアライズ形式を使わない |
| SER08-J | 特権を持ったコンテキストでは必要最小限の権限でオブジェクトを復元する |
| SER09-J | オーバーライド可能なメソッドを readObject() メソッドから呼び出さない |
| SER10-J | シリアライズの過程でメモリリークやリソースリークをしない |
| SER11-J | Externalizable を実装したオブジェクトの上書きを防ぐ |
| SER12-J | 信頼できないクラスの復元はしない |
| SER13-J | デシリアライズするデータは悪質なものという前提で処理する |
15プラットフォームのセキュリティ (SEC)
ルール
16実行環境 (ENV)
ルール
| ENV00-J | 特権の必要ない動作のみを行うコードを署名しない |
| ENV01-J | セキュリティ上重要なコードは署名付きの1つの JAR にまとめてシールする |
| ENV02-J | 環境変数の値を信頼しない |
| ENV03-J | 危険な組み合わせのパーミッションを割り当てない |
| ENV04-J | バイトコード検証機能を無効にしない |
| ENV05-J | 遠隔から監視できる状態のままアプリケーションを実運用しない |
49雑則 (MSC)
ルール
| MSC00-J | セキュアなデータ交換には Socket クラスではなく SSLSocket クラスを使用する |
| MSC01-J | 空の無限ループを使用しない |
| MSC02-J | 高品質の乱数を生成する |
| MSC03-J | センシティブな情報をハードコードしない |
| MSC04-J | メモリリークしない |
| MSC05-J | ヒープメモリを使い果たさない |
| MSC06-J | 繰り返し処理中に基となるコレクションを変更しない |
| MSC07-J | シングルトンオブジェクトのインスタンスを複数作らない |
AA参考情報
- References (CERT Oracle Coding Standard for Java のページにとびます)
- 『Java セキュアコーディング 並行処理編』
BBGlossary
Glossary (CERT Oracle Coding Standard for Java のページにとびます)
XXお問い合わせ
本ページに関するご質問・お問い合わせは、secure-coding@jpcert.or.jp までメールにてお願いいたします。




