CMP.CLASS
このエラーは、プログラムが 2 つのオブジェクトのクラス名を比較し、これらが同一かどうかを調べようとしている場合に表示されます。また、オブジェクトが現在ロードされているクラスとは異なる方法を使用する特定のクラスを持つ場合やクラスローダーそのものから特定クラスを持つ場合にも表示されます。
脆弱性とリスク
名前でクラスを比較する場合、多種多様な攻撃を許すことになります。攻撃者は、ユーザーのコードを悪意のあるクラスに結合するコードや、もともとは結合を意図していないクラス同士を結合するコードを新たに作成します。
軽減と防止
クラス名の検索にオブジェクトの equals メソッドを使用しないでください。その代わりに、getClass メソッドで最初のオブジェクトのクラスを検索し、現在のクラスローダーの方法で 2 番目のオブジェクトのクラスを検索してください。
例 1
コピー
public void privateMethod(Object object1, Object object2) {
if (object1.getClass().getName().equals("anotherClass")) {// wrong
// do work based on the assumption we're dealing with
// the right object
}
if (object1.getClass() == object2.getClass()) { // correct
// do work based on the fact that the objects are the
// of the same class
}
}
CMP.CLASS が 11 行目に対して報告されています。クラス名による比較が行われています。
外部参考資料
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。