- はじめに
- Androidアプリケーション開発へのルールの適用
- 00入力値検査とデータの無害化 (IDS)
- IDS00-JSQL インジェクションを防ぐ
- 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ファイル入出力やネットワーク入出力の両端で互換性のある文字エンコーディングを使う
- 01宣言と初期化 (DCL)
- 02式 (EXP)
- 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プリミティブ整数を浮動小数点数に変換する際、精度を低下させない
- 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コンストラクタが例外をスローする場合には細心の注意を払う
- 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ファイナライザは使わない
- 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を終了させない
- 07可視性とアトミック性 (VNA)
- 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一貫したロック方式を定めていないクラスを使用する場合、クライアントサイドロックを行わない
- 09スレッド API (THI)
- 10スレッドプール (TPS)
- 11スレッドの安全性に関する雑則 (TSM)
- 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プログラムの終了時には適切なクリーンアップを行う
- 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 を実装したオブジェクトの上書きを防ぐ
- SER12-J信頼できないクラスの復元はしない
- SER13-Jデシリアライズするデータは悪質なものという前提で処理する
- 14プラットフォームのセキュリティ (SEC)
- SEC00-Jセンシティブな情報を特権ブロックから信頼境界を越えて漏えいさせない
- SEC01-J汚染された変数を特権ブロックの中で使わない
- SEC02-J信頼できない入力値に基づいてセキュリティチェックを行わない
- SEC03-J信頼できないコードに任意のクラスのロードを許可した後で信頼するクラスをロードしない
- SEC04-Jセンシティブな処理はセキュリティマネージャによるチェックで保護する
- SEC05-Jリフレクションを使ってクラス、メソッド、フィールドのアクセス範囲を広げない
- SEC06-JURLClassLoader と java.util.jar が提供するデフォルトの署名自動検証機能に頼らない
- SEC07-Jクラスローダを独自に実装する場合スーパークラスの getPermissions() メソッドを呼び出す
- SEC08-Jネイティブメソッドにはラッパーメソッドを定義する
- 15実行環境 (ENV)
- 49雑則 (MSC)
- AA参考情報
- References (英語版)
- 『Java セキュアコーディング 並行処理編』
- BBGlossary
- Glossary (英語版)