SV.CLASSDEF.INJ

使用 ClassLoader 定义和实例化来自不受信任来源的可执行内容

使用派生 ClassLoader 定义和实例化来自不受信任来源的可执行类时,将报告此错误。

漏洞与风险

ClassLoader 对象允许利用一串字节或字符来创建可执行类。

如果攻击者可注入替代的内容,则不受信任的代码有可能会执行并访问正在运行的 JVM 或本地资源。

缓解与预防

此问题的解决方法是不使用不受信任来源的内容来定义类。

漏洞代码示例 1

在此示例中,通过扩展 SecureClassLoader 首先暴露类创建方法。然后,将来自不受信任来源的数据传递给 Loader,以创建类的可执行版本。由于来源不受信任,类会受到威胁。

复制
   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;
  }

相关检查器