SV.CLASSDEF.INJ

ClassLoader を使用して信頼できないソースから実行可能コンテンツを定義およびインスタンス化

このエラーは、ClassLoader の派生を使用して、信頼できないソースからの実行可能クラスを定義およびインスタンス化する場合に報告されます。

脆弱性とリスク

ClassLoader オブジェクトにより、バイトまたは文字の文字列から実行可能クラスの作成が可能になります。

攻撃者が代替のコンテンツを挿入できる場合、信頼できないコードが実行され、実行中の JVM またはローカルリソースへのアクセスが与えられる可能性があります。

軽減と防止

この問題は、信頼できないソースからのコンテンツを使用してクラスを定義しないようにすることで防止できます。

脆弱コード例 1

この例では、SecureClassLoader を拡張することにより、まずクラス作成メソッドが公開されます。次に、信頼できないソースからのデータがローダーを通じて渡され、クラスの実行可能バージョンが作成されます。このソースは信頼できないため、クラスは危険にさらされます。

コピー
   private class LocalLoader extends SecureClassLoader {
   
       public Class<?> createClass(String name, byte[] b, int off, int len) {
           return defineClass(name, b, off, len);
       }
   }
   
   ...
   
  public Class<?> createClassData(final ServletRequest req) {
      final String classData = req.getParameter("class.data");
      final byte[] bytes = classData.getBytes();
  
      final TestLoader loader = new TestLoader();
      Class<?> newClass = loader.createClass("name", bytes, 0, bytes.length);
      Return newClass;
  }

修正コード例 1

このケースでは、generateClassData() と呼ばれる関数が実行可能クラスに必要とされるコンテンツを自動的に作成し、その結果はインスタンス化されて、実行する準備が整います。

コピー
   private class LocalLoader extends SecureClassLoader {
   
       public Class<?> createClass(String name, byte[] b, int off, int len) {
           return defineClass(name, b, off, len);
       }
   }
   
   ...
   
  public Class<?> createClassData() {
      final String classData = generateClassData();
      final byte[] bytes = classData.getBytes();
  
      final TestLoader loader = new TestLoader();
      Class<?> newClass = loader.createClass("name", bytes, 0, bytes.length);
      Return newClass;
  }

関連チェッカー