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

Androidアプリケーション開発へのルールの適用

CERT Oracle Java セキュアコーディングスタンダードの各ルールを、Androidアプケーション開発においてどの程度考慮すべきであるかを以下の表に示す。評価は A、C の2段階で行う。

ルール 評価 コメント
IDS00-J. SQL インジェクションを防ぐ A コード例ではMS SQL Serverを使った接続例を示しているが、AndroidではSQLiteのDatabaseHelperクラスを使ってDBにアクセスする。Androidでもネットワーク接続等信頼できない情報源からデータを受け取るので、このルールは適用できる
IDS01-J. 文字列は検査するまえに標準化する A 入力文字列を受け取るということはあるので、このルールは適用できる
IDS02-J. パス名は検証する前に正規化する A
IDS03-J. ユーザ入力を無害化せずにログに保存しない A
IDS04-J. ZipInputStream からファイルを安全に展開する A
IDS05-J. ファイル名やファイルパスにはASCII文字セットの一部の文字のみを使用する A
IDS06-J. ユーザからの入力を使って書式を組み立てない A
IDS07-J. 信頼できない、無害化されていないデータを Runtime.exec() メソッドに渡さない A Androidでも、同様にRuntime.exec()でコマンドを実行することができる
IDS08-J. 信頼できないデータは regex に渡す前に無害化する A
IDS09-J. 適切なロケールを指定せずに、ロケール依存メソッドをロケール依存データに対して使用しない A Androidでも、同様にロケールを指定することができる
IDS10-J. 一文字を構成するデータを分割しない A
IDS11-J. 非文字コードポイントは検証を行う前に削除する A
IDS12-J. 異なる文字コードへの文字列データの変換はデータが欠損しないように行う A
IDS13-J. ファイル入出力やネットワーク入出力の両端で互換性のある文字エンコーディングを使う A
DCL01-J. Java標準ライブラリが使用するパブリック宣言された識別子を再利用しない A
EXP00-J. メソッドの返り値を無視しない A
EXP01-J. null ポインタ参照しない A
EXP02-J. 配列の中身を比較するには2引数の Arrays.equals() メソッドを使う A
EXP03-J. ボクシングされたプリミティブ型の値の比較に等値演算子を使わない A
EXP04-J. オートボクシングされた値が想定した型を持つようにする A
EXP05-J. ひとつの式の中で同じ変数に2回以上書込みを行わない A
EXP06-J. アサーションに副作用を持つ式を使わない A
NUM00-J. 整数オーバーフローを検出あるいは防止する A
NUM01-J. 同一のデータに対してビット演算と算術演算の両方を行わない A
NUM02-J. 除算と剰余演算でゼロ除算エラーを起こさない A
NUM03-J. 符号無しデータのとり得る値をすべて表現できる整数型を使う A
NUM04-J. 正確な計算が必要なときは浮動小数点数を使わない A
NUM05-J. 非正規化数を使用しない A
NUM06-J. どのプラットフォームでも一貫した浮動小数点数演算を行うために strictfp 修飾子を使う A
NUM07-J. NaNとの比較を行わない A
NUM08-J. 浮動小数点数入力が例外値でないかを検査する A
NUM09-J. 浮動小数点数型変数をループカウンタとして使用しない A
NUM10-J. 浮動小数点数リテラルから BigDecimal クラスのオブジェクトを生成しない A Androidでも同様に適用できる
NUM11-J. 浮動小数点数の文字列表現を比較したり内容を調べたりしない A Androidでも、同様に一部予期せぬ結果が得られる場合がある
NUM12-J. 数値型の縮小変換時にデータの欠損や誤解釈を引き起こさない A
NUM13-J. プリミティブ整数を浮動小数点数に変換する際、精度を低下させない A
MET00-J. メソッドの引数を検証する A
MET01-J. メソッドの引数の検証にassertを使わない A Dalvik VMではassertステートメントをサポートしているが、デフォルトでは無効になっている。有効にするには adb shell setprop debug.assert 1 でプロパティをセットするか dalvikvm に引数 -ea を付加する必要がある
MET02-J. 非推奨(deprecated)あるいは廃止された(obsolete)クラスやメソッドを使用しない A Android SDKにも同様に非推奨(deprecated)や廃止(obsolete)されたAPIが存在する。また、SDKのバージョン間で非互換APIが存在するため、Android API Difference Reportを参考に、推奨APIに置き換えることも検討する必要がある
MET03-J. セキュリティチェックを行うメソッドは private もしくは final 宣言する A コード例で使われているSystem.getSecurityManager(); はAndroidでは使われていない。しかし、何かしらチェックを行うメソッドを実装したとして考えると、このルールの考え方はAndroidアプリケーション開発にも適用できるのではないか
MET04-J. メソッドをオーバーライドあるいは隠蔽するときにアクセス範囲を広げない A
MET05-J. コンストラクタにおいてオーバーライド可能なメソッドを呼び出さない A
MET06-J. clone() からオーバーライド可能なメソッドを呼び出さない A
MET07-J. スーパークラスやスーパーインタフェースで宣言されているメソッドを隠蔽するようなクラスメソッドを宣言しない A
MET08-J. equals() メソッドをオーバーライドする時は等価性に関する契約を守る A
MET09-J. equals() メソッドを実装するクラスでは hashCode() メソッドも実装する A
MET10-J. compareTo() メソッドを実装する場合メソッドの一般契約に従う A
MET12-J. ファイナライザは使わない A
ERR01-J. センシティブな情報を例外によって外部に漏えいしない A
ERR02-J. ログ保存中の例外発生を防ぐ A
ERR07-J. RuntimeException, Exception, Throwable をスローしない A
ERR08-J. NullPointerException およびその親クラスの例外をキャッチしない A
ERR09-J. 信頼できないコードにJVMを終了させない A
VNA00-J. 共有プリミティブ型変数の可視性を確保する A
VNA02-J. 共有変数への複合操作のアトミック性を確保する A
LCK01-J. 再利用されるオブジェクトを使って同期しない A
LCK02-J. getClass() メソッドが返す Class オブジェクトを同期に使用しない A
LCK03-J. 高水準な並行処理オブジェクトの固有ロックを使って同期を行わない A
LCK06-J. 共有staticデータの保護にインスタンスロックを使用しない A
LCK08-J. 例外発生時には保持しているロックを解放する A
THI00-J. Thread.run() メソッドを直接呼び出さない A
THI01-J. ThreadGroup クラスのメソッドを使用しない A
THI05-J. スレッドの強制終了にThread.stop()メソッドを使用しない A
TSM03-J. 初期化が完了していないオブジェクトを公開しない A
FIO00-J. 共有ディレクトリにあるファイルを操作しない A
FIO01-J. 適切なパーミッションを設定してファイルを作成する A
FIO02-J. ファイル関連エラーを検知し、処理する A
FIO03-J. 一時ファイルはプログラムの終了前に削除する A
FIO04-J. 不要になったリソースは解放する A
FIO05-J. wrap() や duplicate() メソッドで作成したバッファを信頼できないコードにアクセスさせない A
FIO08-J. 文字やバイトを読み取るメソッドの返り値はintで受ける A
FIO09-J. 0から255の範囲に収まらない整数値を出力するときには write() メソッドを信用しない A
FIO11-J. バイナリデータを文字データとして読み込もうとしない A
FIO12-J. リトルエンディアン形式のデータを読み書きするメソッドを用意する A
FIO13-J. センシティブな情報を信頼境界の外に記録しない A
FIO14-J. プログラムの終了時には適切なクリーンアップを行う A コード例はAndroidには向かないが、ルールの考え方はAndroidアプリケーション開発にも適用できる。プログラムを終了させる方法は、Activity#finish(), Activity#moveTaskToBack(boolean flag), android.os.Process.killProcess(ind pid), System.exit()
SER01-J. シリアライズに関連するメソッドは正しいシグネチャで実装する A
SER02-J. センシティブなオブジェクトは信頼境界を越えて送信する前に署名し暗号化する A
SER03-J. 暗号化されていないセンシティブなデータをシリアライズしない A
SER04-J. シリアライズと復元においてセキュリティマネージャによるチェックをバイパスさせない C Androidではjava.securityパッケージは互換性のために存在しているだけなので、使用するべきではない
SER05-J. 内部クラスのインスタンスをシリアライズしない A
SER08-J. 特権を持ったコンテキストでは必要最小限の権限でオブジェクトを復元する A
SER11-J. Externalizable を実装したオブジェクトの上書きを防ぐ A
SEC00-J. センシティブな情報を特権ブロックから信頼境界を越えて漏えいさせない C Androidではjava.securityパッケージは互換性のために存在しているだけなので、使用するべきではない
SEC01-J. 汚染された変数を特権ブロックの中で使わない A java.securityパッケージを用いたコード例はAndroidには向かないが、ルールの考え方はAndroidアプリケーション開発にも適用できる
SEC02-J. 信頼できない入力値に基づいてセキュリティチェックを行わない A java.securityパッケージを用いたコード例はAndroidには向かないが、ルールの考え方はAndroidアプリケーション開発にも適用できる
SEC03-J. 信頼できないコードに任意のクラスのロードを許可した後で信頼するクラスをロードしない A AndroidではDexClassLoaderPathClassLoaderの使い方に気をつける必要がある
SEC04-J. センシティブな処理はセキュリティマネージャによるチェックで保護する C Androidではjava.securityパッケージは互換性のために存在しているだけなので、使用するべきではない
SEC05-J. リフレクションを使ってクラス、メソッド、フィールドのアクセス範囲を広げない A Androidでも同様に適用できる。また、リフレクションを使うとAndroidの非公開のAPIにアクセスすることができるので気を付ける必要がある
SEC06-J. URLClassLoader と java.util.jar が提供するデフォルトの署名自動検証機能に頼らない C
SEC07-J. クラスローダを独自に実装する場合スーパークラスの getPermissions() メソッドを呼び出す C Androidではjava.securityパッケージは互換性のために存在しているだけなので、使用するべきではない
ENV00-J. 特権の必要ない動作のみを行うコードを署名しない C Androidでのコード署名は、開発者の識別、アプリケーション間の信頼関係を確立するために存在している
ENV01-J. セキュリティ上重要なコードは署名付きの1つの JAR にまとめてシールする C Androidではjava.security.AccessControllerは互換性のために存在しているだけであり、使用してはならない。
ENV02-J. 環境変数の値を信頼しない A コード例にあるuser.nameはAndroidでは使われないので空になっているが、環境変数という仕組みはもちろんAndroidにも存在するので当てはまる
ENV03-J. 危険な組み合わせのパーミッションを割り当てない C Androidではjava.securityパッケージは互換性のために存在しているだけなので、使用するべきではない。ルールで示されているJavaのパーミッションとは別に、Androidには独自のパーミッションがありそれについては別途注意する必要がある
ENV04-J. バイトコード検証機能を無効にしない A Dalvik VMではデフォルトでバイトコード検証機能が有効になっている。設定を変更したい場合は、例えば adb shell setprop dalvik.vm.dexopt-flags v=a でプロパティをセットするか dalvikvm に引数 -Xverify:all で有効にできる
ENV05-J. 遠隔から監視できる状態のままアプリケーションを実運用しない C Dalvik VMではJVMTIはサポートされていない
MSC00-J. セキュアなデータ交換には Socket クラスではなく SSLSocket クラスを使用する A
MSC02-J. 高品質の乱数を生成する A
MSC03-J. センシティブな情報をハードコードしない A Androidアプリケーションであっても、apktoolでデコンパイルしたり、またはdex2jarでdexをjarファイルに変換することで、ハードコードされた情報を容易に取得することができる

Top へ

Topへ
最新情報(RSSメーリングリストTwitter