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