4

我对我们的应用程序进行了安全扫描,出现的安全问题之一是“下载没有完整性检查的代码”。这条线的风险点在Class.forName("SimpleClass");

如何保护上面的代码行?如何确保参数 forforName("")不是我要加载的恶意类。

编辑:使用的安全扫描是 Checkmarx。

4

3 回答 3

3

如果您没有从外部获得任何课程,则此弱点不适用于此处。在这种情况下,如果恶意类已经在类路径中,您就可以加载它。这意味着攻击者已经可以访问类路径——在这种情况下,抵抗是徒劳的。

如果你确实从外部获取类——比如,从某个地方下载它们或允许用户上传类或源代码并编译它——那么你就会受到这个弱点的影响,需要采取措施。如果您从用户那里获得课程,您就会遇到问题。:) 如果您从某个您认为安全的位置获取它们,您可以使用 HTTPS 或自行检查签名。但我想这不是你的情况。

于 2016-12-06T10:38:39.913 回答
1

您可以创建一个枚举,而不是使用Class.forName("SimpleClass");,它包含您希望基于该字符串利用的所有类。例如:

public enum InvokeableClasses {
    SOME_CLASS(SomeClass.class),
    ANOTHER_CLASS(AnotherClass.class),
    YET_ANOTHER_CLASS(YetAnotherClass.class),
    SIMPLE_CLASS(SimpleClass.class);

    private final Class clazz;
    InvokeableClasses(Class clazz){
        this.clazz = clazz;
    }

    public Class getClazz() {
        return this.clazz;
    }

    public static InvokeableClasses fromString(String className) {
        for(InvokeableClasses currentInvokeableClass : InvokeableClasses.values()) {
            if(currentInvokeableClass.getClazz().getSimpleName().equalsIgnoreCase(className)) {
                return currentInvokeableClass;
            }
        }
        return null;
    }
}

然后你使用枚举而不是Class.forName("SimpleClass");像这样:

InvokeableClasses.fromString("SimpleClass").getClazz();

我使用了类似的方法,选择 getCanonicalName() 代替 getSimpleName() 以确保该类来自预期的包。

这里的缺点是您需要事先枚举可能的类,但它更安全。

我知道这个问题很老,但感觉答案并不完全令人满意。

于 2019-11-19T23:05:12.847 回答
1

不要在类路径中放置包含不受信任的类的 jar。

消息不正确。这不会下载任何东西。它只会加载一个必须已经在您的类路径中才能成功加载的类。

于 2016-12-06T10:36:56.953 回答