Java セキュアコーディングスタンダード CERT/Oracle 版
最終更新: 2012-04-26
Fred Long,Dhruv Mohindra,Robert C.Seacord,Dean F.Sutherland,David Svoboda 著
JPCERTコーディネーションセンター
歌代和正 監修、久保正樹・戸田洋三 訳
発行:アスキー・メディアワークス
定価:本体3,800円 + 税 190円
ISBN:978-4-04-886070-3
Web版 (Java セキュアコーディングスタンダード CERT/Oracle 版)
内容
安全で信頼性の高いソフトウェアを開発するためには、言語仕様やその実行環境に潜む落し穴を知り、攻撃可能な脆弱性につながる危険なコーディング作法を取り除くこと、すなわちセキュアコーディングが重要である。本書は、Java 言語やそのライブラリを使用したセキュアコーディングを実践するためのルールを提供する。また、各ルールに対し、Android アプリケーション開発において考慮すべき度合を2段階で評価し、コメントをつけた表を付録としてつけた。
Topへ
目次
- 訳者まえがき
- 本書によせて
- はじめに
- 謝辞
- 著者について
Topへ
序章 ソフトウエアの脆弱性
第1章 入力値検査とデータ無害化(IDS)
IDS00-J. |
信頼境界を越えて渡される信頼できないデータは無害化する |
IDS01-J. |
文字列は検査するまえに標準化する |
IDS03-J. |
ユーザ入力を無害化せずにログに保存しない |
IDS07-J. |
信頼できない、無害化されていないデータをRuntime.exec()メソッドに渡さない |
IDS09-J. |
適切なロケールを指定せずに、ロケール依存メソッドをロケール依存データに対して使用しない |
IDS11-J. |
非文字コードポイントは検証を行う前に削除する |
Topへ
第2章 式(EXP)
EXP00-J. |
メソッドの返り値を無視しない |
EXP02-J. |
配列の中身を比較するには2引数のArrays.equals()メソッドを使う |
EXP03-J. |
ボクシングされたプリミティブ型の値の比較に等値演算子を使わない |
EXP04-J. |
オートボクシングされた値が想定した型を持つようにする |
Topへ
第3章 数値型と操作(NUM)
NUM02-J. |
除算と剰余演算でゼロ除算エラーを起こさない |
NUM09-J. |
浮動小数点数型変数をループカウンタとして使用しない |
NUM10-J. |
浮動小数点数リテラルから BigDecimal クラスのオブジェクトを生成しない |
NUM11-J. |
浮動小数点数の文字列表現を比較したり内容を調べたりしない |
Topへ
第4章 オブジェクト指向(OBJ)
OBJ00-J. |
不変条件を持つクラスやメソッドの拡張は信頼できるサブクラスのみに許す |
OBJ01-J. |
データメンバはprivate宣言し、それにアクセスするためのラッパーメソッドを提供する |
OBJ04-J. |
信頼できないコードにインスタンスを安全に渡すため、可変クラスにはコピー機能を実装する |
OBJ05-J. |
privateかつ可変なクラスメンバへの参照を返す前にそのディフェンシブコピーを作成する |
OBJ07-J. |
センシティブなクラスはコピーさせない |
OBJ08-J. |
入れ子クラスから外側のクラスのprivateメンバを公開しない |
OBJ09-J. |
クラス名を比較するのではなくクラスを比較する |
OBJ10-J. |
public static 変数を final 宣言せずに使わない |
OBJ11-J. |
コンストラクタが例外をスローする場合には細心の注意を払う |
Topへ
第5章 メソッド(MET)
MET00-J. |
メソッドの引数を検証する |
MET01-J. |
メソッドの引数の検証にassertを使わない |
MET02-J. |
非推奨(deprecated)あるいは廃止された(obsolete)クラスやメソッドを使用しない |
MET03-J. |
セキュリティチェックを行うメソッドは private もしくは final 宣言する |
MET04-J. |
メソッドをオーバーライドあるいは隠蔽するときにアクセス範囲を広げない |
MET05-J. |
コンストラクタにおいてオーバーライド可能なメソッドを呼び出さない |
MET06-J. |
clone() からオーバーライド可能なメソッドを呼び出さない |
MET12-J. |
ファイナライザを使わない |
Topへ
第6章 例外時の動作(ERR)
ERR02-J. |
ログ保存中の例外発生を防ぐ |
ERR07-J. |
RuntimeException, Exception, Throwable をスローしない |
ERR08-J. |
NullPointerException およびその親クラスの例外をキャッチしない |
Topへ
第7章 可視性とアトミック性(VNA)
VNA00-J. |
共有プリミティブ型変数の可視性を確保する |
VNA02-J. |
共有変数への複合操作のアトミック性を確保する |
Topへ
第8章 ロック(LCK)
LCK01-J. |
再利用されるオブジェクトを使って同期しない |
LCK02-J. |
getClass() メソッドが返す Class オブジェクトを同期に使用しない |
LCK03-J. |
高水準な並行処理オブジェクトの固有ロックを使って同期を行わない |
LCK06-J. |
共有staticデータの保護にインスタンスロックを使用しない |
LCK08-J. |
例外発生時には保持しているロックを解放する |
Topへ
第9章 スレッド安全性(TSM)
TSM03-J. |
初期化が完了していないオブジェクトを公開しない |
Topへ
第10章 入出力(FIO)
FIO03-J. |
一時ファイルはプログラムの終了前に削除する |
FIO05-J. |
wrap() や duplicate() メソッドで作成したバッファを信頼できないコードにアクセスさせない |
FIO08-J. |
文字やバイトを読み取るメソッドの返り値はintで受ける |
FIO14-J. |
プログラムの終了時には適切なクリーンアップを行う |
Topへ
第11章 シリアライゼーション(SER)
SER01-J. |
シリアライズに関連するメソッドは正しいシグネチャで実装する |
SER03-J. |
暗号化されていないセンシティブなデータをシリアライズしない |
SER04-J. |
シリアライズと復元においてセキュリティマネージャによるチェックをバイパスさせない |
SER05-J. |
内部クラスのインスタンスをシリアライズしない |
SER08-J. |
特権を持ったコンテキストでは必要最小限の権限でオブジェクトを復元する |
SER11-J. |
Externalizable を実装したオブジェクトの上書きを防ぐ |
Topへ
第12章 プラットフォームセキュリティ(SEC)
SEC00-J. |
センシティブな情報を特権ブロックから信頼境界を越えて漏えいさせない |
SEC01-J. |
汚染された変数を特権ブロックの中で使わない |
SEC02-J. |
信頼できない入力に基づいてセキュリティチェックを行わない |
SEC03-J. |
信頼できないコードに任意のクラスのロードを許可した後で信頼するクラスをロードしない |
SEC04-J. |
センシティブな処理はセキュリティマネージャによるチェックで保護する |
SEC05-J. |
リフレクションを使ってクラス、メソッド、フィールドのアクセス範囲を広げない |
SEC06-J. |
URLClassLoader と java.util.jar が提供するデフォルトの署名自動検証機能に頼らない |
SEC07-J. |
クラスローダを独自に実装する場合スーパークラスの getPermissions() メソッドを呼び出す |
Topへ
第13章 実行環境(ENV)
ENV00-J. |
特権の必要ない動作のみを行うコードを署名しない |
ENV01-J. |
セキュリティ上重要なコードは署名付きの1つの JAR にまとめてシールする |
ENV02-J. |
環境変数の値を信頼しない |
ENV03-J. |
危険な組み合わせのパーミッションを割り当てない |
ENV04-J. |
バイトコード検証機能を無効にしない |
ENV05-J. |
遠隔から監視できる状態のままアプリケーションを実運用しない |
Topへ
第14章 雑則(MSC)
MSC00-C. |
セキュアなデータ交換には Socket クラスではなく SSLSocket クラスを使用する |
MSC02-C. |
高品質の乱数を生成する |
MSC03-C. |
センシティブな情報をハードコードしない |
Topへ
付録 Androidアプリケーション開発へのルールの適用
用語集
参考文献
索引
Topへ