セキュリティチェックを行うメンバメソッドがfinal宣言されていないと、悪意あるサブクラスがそのメソッドをオーバーライドし、セキュリティチェックを削除してしまう危険がある。オーバーライドされる危険を防ぐために、これらのメソッドはprivateもしくはfinal宣言しなければならない。
違反コード
以下の違反コードでは、サブクラスがreadSensitiveFile()メソッドをオーバーライドし、本来行うべきセキュリティチェックを削除できる。
public void readSensitiveFile() {
try {
SecurityManager sm = System.getSecurityManager();
if (sm != null) { // ファイルの読取り権限をチェック
sm.checkRead("/temp/tempFile");
}
// ファイルにアクセスする
} catch (SecurityException se) {
// 例外をログに保存
}
}
適合コード
以下の適合コードでは、readSensitiveFile()メソッドをfinal宣言することで、オーバーライドを防いでいる。
public final void readSensitiveFile() {
try {
SecurityManager sm = System.getSecurityManager();
if (sm != null) { // ファイルの読取り権限をチェック
sm.checkRead("/temp/tempFile");
}
// ファイルにアクセスする
} catch (SecurityException se) {
// 例外をログに保存
}
}
適合コード
以下の適合コードでは、readSensitiveFile()メソッドをprivate宣言することで、オーバーライドを防いでいる。
private void readSensitiveFile() {
try {
SecurityManager sm = System.getSecurityManager();
if (sm != null) { // ファイルの読取り権限をチェック
sm.checkRead("/temp/tempFile");
}
// ファイルにアクセス
} catch (SecurityException se) {
// 例外をログに保存
}
}
例外
MET03-EX0: クラス自体をfinal宣言している場合、メンバメソッドをオーバーライドすることができないため、このルールの適用外である。
リスク評価
クラスのメソッドをprivateもしくはfinal宣言しないと、悪意あるサブクラスが、メソッドの中で行われるセキュリティチェックを回避する可能性がある。
| ルール | 深刻度 | 可能性 | 修正コスト | 優先度 | レベル |
|---|---|---|---|---|---|
| MET03-J | 中 | 中 | 中 | P8 | L2 |
参考文献
| [Ware 2008] |
翻訳元
これは以下のページを翻訳したものです。
MET03-J. Methods that perform a security check must be declared private or final (revision 40)
