【问题标题】:How to Fix CWE-470: Use of Externally-Controlled Input to Select Classes or Code ('Unsafe Reflection')如何修复 CWE-470:使用外部控制输入来选择类或代码(“不安全反射”)
【发布时间】:2018-06-28 15:28:53
【问题描述】:

我的代码中有一行 470,这是 Vera 所定义的。

维拉说要修复:

通过使用白名单或间接应用严格的输入验证 选择以确保用户只选择允许的类 或代码。

所以我创建了一个严格的白名单,以 Set<String> 的形式反射可以访问哪些类名

然后我将Class.forName 包裹在一个

if (whitelist.contains(className) {
   Veracode still fires in here with a 470
}

有谁知道维拉不开火的修复方法是什么?我觉得我已经遵循了他们推荐的补救措施。

【问题讨论】:

    标签: java reflection veracode


    【解决方案1】:

    我已经设法使用 sanitizer 类/方法来解决它,该类/方法从硬编码值中获取 className 验证并从 String 返回值 - 例如:

    公共类 MySanitizer {

    public static String sanitizeClassName(final String className) throws MyException {
    
        if(!className.equals("com.my.MyClass")) 
            throw new MyException("Class not valid: "  + className);
    
        return "com.my.MyClass";
    }
    

    【讨论】:

      【解决方案2】:

      答案是所有类名都必须来自受信任的来源。 唯一受信任的来源是类文件中的硬编码字符串。 没有从属性文件中读取任何内容,也没有您创建并传递给验证机制的集合。

      它必须看到正在加载的硬编码常量“com.dang.this.is.strict.ClassName:”。 硬编码的字符串白名单。

      你可以有一些很棒的验证代码来确保没有坏事发生,但它不会通过,因为不是硬编码的字符串。在这种情况下,您可以减轻并提供解释,并希望对审查结果的人来说足够了。

      他们确实说

      通过使用白名单或间接应用严格的输入验证 选择以确保用户只选择允许的类 或代码。

      我只是没有意识到白名单是类中严格的字符串常量。我的错误是认为我可以在运行时在代码中构建白名单。有时我需要这样做,所以我将保留我的验证器并声明缓解。

      【讨论】:

        猜你喜欢
        • 2011-01-05
        • 2021-11-05
        • 2021-09-24
        • 2018-11-23
        • 2020-12-25
        • 1970-01-01
        • 2016-08-23
        • 1970-01-01
        • 2020-09-24
        相关资源
        最近更新 更多