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

SEC07-J. クラスローダを独自に実装する場合スーパークラスの getPermissions() メソッドを呼び出す

独自のクラスローダで getPermissions() メソッドを上書きしなければならない場合、パーミッションを割り当てる前に明示的にスーパークラスの getPermissions() メソッドを呼び出し、デフォルトのシステムポリシーを確認しなければならない。スーパークラスの getPermissions() メソッドを無視する独自のクラスローダは、昇格した権限で信頼できないクラスをロードする危険がある。

違反コード

以下の違反コード例は、URLClassLoader クラスを拡張した独自のクラスローダの一部である。このコードでは、getPermissions() メソッドを上書きしているが、スーパークラスの getPermissions() メソッドを呼び出していない。そのため、このクラスローダを使ってロードされたクラスは、システムポリシーファイルで規定されたものとは独立したパーミッションを持っていることになる。実際、ロードされたクラスのパーミッションが、システムポリシーファイルで規定されたパーミッションを上書きする。

protected PermissionCollection getPermissions(CodeSource cs) {
  PermissionCollection pc = new Permissions();
  // いつでも VM を終了できるパーミッション
  pc.add(new RuntimePermission("exitVM"));
  return pc;
}
適合コード

以下の適合コードでは、getPermissions() メソッドから super.getPermissions() を呼び出している。その結果、独自のポリシーに加えて、デフォルトのシステムセキュリティポリシーも適用される。

protected PermissionCollection getPermissions(CodeSource cs) {
  PermissionCollection pc = super.getPermissions(cs);
  // いつでも VM を終了できるパーミッション
  pc.add(new RuntimePermission("exitVM"));
  return pc;
}
リスク評価

独自のクラスローダを定義する際、デフォルトのシステムポリシーを確認しないと、防御的プログラミングの精神に違反し、ロードしたクラスに意図しないパーミッションを割り当ててしまう危険がある。

ルール 脅威度 可能性 修正コスト 優先度 レベル
SEC07-J P18 L1
自動検出

FindBugs のようなヒューリスティックな検出ツールで、このルールへの違反を検出できるだろう。ヒューリスティックな検出ツール一般で問題になることだが、誤検知の数を小さくすることが本質的に重要である。

参考文献
[API 2006] Class ClassLoader
[Oaks 2001]  
[Security 2006]  
翻訳元

これは以下のページを翻訳したものです。

SEC07-J. Call the superclass's getPermissions() method when writing a custom class loader (revision 58)

Top へ

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