【问题标题】:How to secure Class.forName("SimpleClass")?如何保护 Class.forName("SimpleClass")?
【发布时间】:2016-12-06 10:19:04
【问题描述】:

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

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

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

【问题讨论】:

  • 请描述课程的来源。了解攻击的全部流程可能有助于我们更好地了解情况并为您提供帮助。

标签: java security checkmarx


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您可以创建一个枚举,而不是使用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() 以确保该类来自预期的包。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-10
      • 1970-01-01
      • 2013-10-06
      • 2011-05-23
      • 2015-09-22
      • 2010-12-27
      • 2011-02-07
      相关资源
      最近更新 更多