如何修复 CWE-470:使用外部控制输入 Select 类 或代码 ('Unsafe Reflection')

How to Fix CWE-470: Use of Externally-Controlled Input to Select Classes or Code ('Unsafe Reflection')

我的代码中有一行是 470,正如 Vera 所定义的那样。

Vera 说要修复:

Apply strict input validation by using whitelists or indirect selection to ensure that the user is only selecting allowable classes or code.

所以我创建了一个严格的白名单,其中包含 class 名称反射可以作为 Set<String>

访问的内容

然后我将 Class.forName 包裹在

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

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

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

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

您可以使用一些很棒的验证代码来确保没有发生任何问题,但它不会通过,因为它不是硬编码的字符串。在这种情况下,您可以缓解并提供解释,并希望这足以让审阅结果的人满意。

他们确实说

Apply strict input validation by using whitelists or indirect selection to ensure that the user is only selecting allowable classes or code.

我只是没有意识到白名单在 classes 中是严格的字符串常量。我的错误是认为我可以在 运行 时间用代码构建白名单。有时我需要这样做,所以我会保留我的验证器和索赔缓解措施。

我已经设法使用消毒剂 class/method 解决了这个问题,它从硬编码值中获取 class 名称验证和 return 值 - 例如:

public class 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";
}