独自のクラスローダで 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)