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

安全・安心なIT社会のための、国内・国際連携を支援する

お問い合わせ 採用情報 サイトマップ English

Home > ラーニング > セキュアコーディング > Java セキュアコーディングスタンダード

最終更新: 2013-10-17

Java セキュアコーディングスタンダード CERT/Oracle 版


Java セキュアコーディングスタンダード CERT/Oracle 版

00入力値検査とデータの無害化 (IDS)
IDS00-J信頼境界を越えて渡される信頼できないデータは無害化する
IDS01-J文字列は検査するまえに標準化する
IDS02-Jパス名は検証する前に正規化する
IDS03-Jユーザ入力を無害化せずにログに保存しない
IDS04-JZipInputStream からファイルを安全に展開する
IDS05-Jファイル名やファイルパスにはASCII文字セットの一部の文字のみを使用する
IDS06-Jユーザからの入力を使って書式を組み立てない
IDS07-J信頼できない、無害化されていないデータを Runtime.exec() メソッドに渡さない
IDS08-J信頼できないデータは regex に渡す前に無害化する
IDS09-J適切なロケールを指定せずに、ロケール依存メソッドをロケール依存データに対して使用しない
IDS10-J一文字を構成するデータを分割しない
IDS11-J非文字コードポイントは検証を行う前に削除する
IDS12-J異なる文字コードへの文字列データの変換はデータが欠損しないように行う
IDS13-Jファイル入出力やネットワーク入出力の両端で互換性のある文字エンコーディングを使う

Top へ

01宣言と初期化 (DCL)
DCL00-Jクラスの初期化を循環させない
DCL01-JJava標準ライブラリが使用するパブリック宣言された識別子を再利用しない
DCL02-J拡張 for 文のループ変数は必ず final 宣言する

Top へ

02式 (EXP)
EXP00-Jメソッドの返り値を無視しない
EXP01-Jnull ポインタ参照しない
EXP02-J配列の中身を比較するには2引数の Arrays.equals() メソッドを使う
EXP03-Jボクシングされたプリミティブ型の値の比較に等値演算子を使わない
EXP04-Jオートボクシングされた値が想定した型を持つようにする
EXP05-Jひとつの式の中で同じ変数に2回以上書込みを行わない
EXP06-Jアサーションに副作用を持つ式を使わない

Top へ

03数値型とその操作 (NUM)
NUM00-J整数オーバーフローを検出あるいは防止する
NUM01-J同一のデータに対してビット演算と算術演算の両方を行わない
NUM02-J除算と剰余演算でゼロ除算エラーを起こさない
NUM03-J符号無しデータのとり得る値をすべて表現できる整数型を使う
NUM04-J正確な計算が必要なときは浮動小数点数を使わない
NUM05-J非正規化数を使用しない
NUM06-Jどのプラットフォームでも一貫した浮動小数点数演算を行うために strictfp 修飾子を使う
NUM07-JNaNとの比較を行わない
NUM08-J浮動小数点数入力が例外値でないかを検査する
NUM09-J浮動小数点数型変数をループカウンタとして使用しない
NUM10-J浮動小数点数リテラルから BigDecimal クラスのオブジェクトを生成しない
NUM11-J浮動小数点数の文字列表現を比較したり内容を調べたりしない
NUM12-J数値型の縮小変換時にデータの欠損や誤解釈を引き起こさない
NUM13-Jプリミティブ整数を浮動小数点数に変換する際、精度を低下させない

Top へ

04オブジェクト指向 (OBJ)
OBJ00-J不変条件を持つクラスやメソッドの拡張は信頼できるサブクラスのみに許す
OBJ01-Jデータメンバはprivate宣言し、それにアクセスするためのラッパーメソッドを提供する
OBJ02-Jスーパークラスに変更を加える場合、サブクラスの依存性を保つ
OBJ03-Jジェネリックな未加工型とジェネリックでない未加工型を新規コードに混在させない
OBJ04-J信頼できないコードにインスタンスを安全に渡すため、可変クラスにはコピー機能を実装する
OBJ05-Jprivateかつ可変なクラスメンバへの参照を返す前にそのディフェンシブコピーを作成する
OBJ06-J可変入力や可変な内部コンポーネントはディフェンシブコピーを作成する
OBJ07-Jセンシティブなクラスはコピーさせない
OBJ08-J入れ子クラスから外側のクラスのprivateメンバを公開しない
OBJ09-Jクラス名を比較するのではなくクラスを比較する
OBJ10-Jpublic static 変数を final 宣言せずに使わない
OBJ11-Jコンストラクタが例外をスローする場合には細心の注意を払う

Top へ

05メソッド (MET)
MET00-Jメソッドの引数を検証する
MET01-Jメソッドの引数の検証にassertを使わない
MET02-J非推奨(deprecated)あるいは廃止された(obsolete)クラスやメソッドを使用しない
MET03-Jセキュリティチェックを行うメソッドは private もしくは final 宣言する
MET04-Jメソッドをオーバーライドあるいは隠蔽するときにアクセス範囲を広げない
MET05-Jコンストラクタにおいてオーバーライド可能なメソッドを呼び出さない
MET06-Jclone() からオーバーライド可能なメソッドを呼び出さない
MET07-Jスーパークラスやスーパーインタフェースで宣言されているメソッドを隠蔽するようなクラスメソッドを宣言しない
MET08-Jequals() メソッドをオーバーライドする時は等価性に関する契約を守る
MET09-Jequals() メソッドを実装するクラスでは hashCode() メソッドも実装する
MET10-JcompareTo() メソッドを実装する場合メソッドの一般契約に従う
MET11-J比較演算に用いるキーは不変にする
MET12-Jファイナライザは使わない

Top へ

06例外時の動作 (ERR)
ERR00-Jチェック例外を抑制あるいは無視しない
ERR01-Jセンシティブな情報を例外によって外部に漏えいしない
ERR02-Jログ保存中の例外発生を防ぐ
ERR03-Jメソッドが処理に失敗した場合はオブジェクトの状態を元に戻す
ERR04-Jfinally ブロックの処理を途中で終了しない
ERR05-Jチェック例外を finally ブロックの外に伝播させない
ERR06-J宣言されていないチェック例外をスローしない
ERR07-JRuntimeException, Exception, Throwable をスローしない
ERR08-JNullPointerException およびその親クラスの例外をキャッチしない
ERR09-J信頼できないコードにJVMを終了させない

Top へ

07可視性とアトミック性 (VNA)
VNA00-J共有プリミティブ型変数の可視性を確保する
VNA01-J不変オブジェクトへの共有参照の可視性を確保する
VNA02-J共有変数への複合操作のアトミック性を確保する
VNA03-Jアトミックなメソッドをまとめた呼び出しがアトミックであると仮定しない
VNA04-Jメソッドチェーン呼出しのアトミック性を確保する
VNA05-J64ビット値の読み書きはアトミックに行う

Top へ

08ロック (LCK)
LCK00-J信頼できないコードから使用されるクラスを同期するにはprivate finalロックオブジェクトを使用する
LCK01-J再利用されるオブジェクトを使って同期しない
LCK02-JgetClass() メソッドが返す Class オブジェクトを同期に使用しない
LCK03-J高水準な並行処理オブジェクトの固有ロックを使って同期を行わない
LCK04-J基になるコレクションにアクセス可能な場合にはコレクションビューを使って同期しない
LCK05-J信頼できないコードによって変更されうる static フィールドへのアクセスは同期する
LCK06-J共有staticデータの保護にインスタンスロックを使用しない
LCK07-Jデッドロックを回避するためにロックは同一順序で要求および解放する
LCK08-J例外発生時には保持しているロックを解放する
LCK09-J途中で待機状態になる可能性のある操作をロックを保持したまま実行しない
LCK10-Jダブルチェックロック手法を誤用しない
LCK11-J一貫したロック方式を定めていないクラスを使用する場合、クライアントサイドロックを行わない

Top へ

09スレッド API (THI)
THI00-JThread.run() メソッドを直接呼び出さない
THI01-JThreadGroup クラスのメソッドを使用しない
THI02-J1つではなくすべての待ち状態スレッドへ通知を行う
THI03-Jwait() および await() メソッドは常にループ内部で呼び出す
THI04-Jブロックしているスレッドやタスクが確実に終了できるようにする
THI05-Jスレッドの強制終了にThread.stop()メソッドを使用しない

Top へ

10スレッドプール (TPS)
TPS00-Jスレッドプールを使用しトラフィックの大量発生による急激なサービス低下を防ぐ
TPS01-Jスレッド数に上限のあるスレッドプールで相互に依存するタスクを実行しない
TPS02-Jスレッドプールにサブミットするタスクは割込み可能にする
TPS03-Jスレッドプールで実行されるタスクを通知なしに異常終了させない
TPS04-Jスレッドプールの使用時にはThreadLocal変数の再初期化を確実に行う

Top へ

11スレッドの安全性に関する雑則 (TSM)
TSM00-Jスレッドセーフなメソッドを、スレッドセーフでないメソッドでオーバーライドしない
TSM01-Jオブジェクトの構築時にthis参照を逸出させない
TSM02-Jクラスの初期化中にバックグラウンドスレッドを使用しない
TSM03-J初期化が完了していないオブジェクトを公開しない

Top へ

12入出力 (FIO)
FIO00-J共有ディレクトリにあるファイルを操作しない
FIO01-J適切なパーミッションを設定してファイルを作成する
FIO02-Jファイル関連エラーを検知し、処理する
FIO03-J一時ファイルはプログラムの終了前に削除する
FIO04-J不要になったらリソースを解放する
FIO05-Jwrap() や duplicate() メソッドで作成したバッファを信頼できないコードにアクセスさせない
FIO06-J1つの InputStream に対して複数のバッファ付きラッパーを作成しない
FIO07-J外部プロセスに IO バッファをブロックさせない
FIO08-J文字やバイトを読み取るメソッドの返り値はintで受ける
FIO09-J0から255の範囲に収まらない整数値を出力するときには write() メソッドを信用しない
FIO10-Jread() を使って配列にデータを読み込むときには配列への読み込みが意図した通りに行われたことを確認する
FIO11-Jバイナリデータを文字データとして読み込もうとしない
FIO12-Jリトルエンディアン形式のデータを読み書きするメソッドを用意する
FIO13-Jセンシティブな情報を信頼境界の外に記録しない
FIO14-Jプログラムの終了時には適切なクリーンアップを行う

Top へ

13シリアライズ (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-JExternalizable を実装したオブジェクトの上書きを防ぐ

Top へ

14プラットフォームのセキュリティ (SEC)
SEC00-Jセンシティブな情報を特権ブロックから信頼境界を越えて漏えいさせない
SEC01-J汚染された変数を特権ブロックの中で使わない
SEC02-J信頼できない入力値に基づいてセキュリティチェックを行わない
SEC03-J信頼できないコードに任意のクラスのロードを許可した後で信頼するクラスをロードしない
SEC04-Jセンシティブな処理はセキュリティマネージャによるチェックで保護する
SEC05-Jリフレクションを使ってクラス、メソッド、フィールドのアクセス範囲を広げない
SEC06-JURLClassLoader と java.util.jar が提供するデフォルトの署名自動検証機能に頼らない
SEC07-Jクラスローダを独自に実装する場合スーパークラスの getPermissions() メソッドを呼び出す
SEC08-Jネイティブメソッドにはラッパーメソッドを定義する

Top へ

15実行環境 (ENV)
ENV00-J特権の必要ない動作のみを行うコードを署名しない
ENV01-Jセキュリティ上重要なコードは署名付きの1つの JAR にまとめてシールする
ENV02-J環境変数の値を信頼しない
ENV03-J危険な組み合わせのパーミッションを割り当てない
ENV04-Jバイトコード検証機能を無効にしない
ENV05-J遠隔から監視できる状態のままアプリケーションを実運用しない

Top へ

49雑則 (MSC)
MSC00-Jセキュアなデータ交換には Socket クラスではなく SSLSocket クラスを使用する
MSC01-J空の無限ループを使用しない
MSC02-J高品質の乱数を生成する
MSC03-Jセンシティブな情報をハードコードしない
MSC04-Jメモリリークしない
MSC05-Jヒープメモリを使い果たさない
MSC06-J繰り返し処理中に基となるコレクションを変更しない
MSC07-Jシングルトンオブジェクトのインスタンスを複数作らない

Top へ

AA参考情報

Top へ

BBGlossary

Glossary (CERT Oracle Secure Coding Standard for Java のページにとびます)

Top へ

XXお問い合わせ

本ページに関するご質問・お問い合わせは、secure-coding@jpcert.or.jp までメールにてお願いいたします。

Top へ