如何删除这种使用动态类加载或替换此类加载?

时间:2016-11-18 18:12:36

标签: java string dynamic-class-loaders

othersMap.put("maskedPan", Class.forName("Some Class"));

删除动态类加载的使用。

规则

更改日志 不应动态加载类 动态加载的类可能包含由静态类初始化程序执行的恶意代码。 I.E.你甚至不必在这些类上实例化或显式调用方法就容易受到攻击。 此规则为每次使用动态类加载提出了一个问题。 不合规的代码示例

String className = System.getProperty("messageClassName");
Class clazz = Class.forName(className);  // Noncompliant

3 个答案:

答案 0 :(得分:1)

一种选择是这样的:

Class<?> cls;

switch (System.getProperty("messageClassName")){
   case "com.example.Message1":
     cls = com.example.Message1.class;
     break;
...
}

答案 1 :(得分:1)

你可以尝试超越声纳规则,例如通过使用反射来调用Class.forName()方法,但我觉得你会在那里解决错误的问题:

Class.class.getDeclaredMethod("forName", String.class).invoke(null, className);

正确的方法是说服在你的组织中管理声纳的人,你所做的是必要的,他们需要为你制定规则的例外。或者,如果你无法说服他们,那就停止这样做。

答案 2 :(得分:1)

我们首先要指出一个明显的问题:SonarQube规则不应被理解为宇宙中唯一的真理。这只是一种将注意力转移到潜在敏感代码段上并由您采取适当措施的方法。如果组织中的人员强迫您遵守SonarQube的规则,那么他们将不了解该工具的目的。

在这种情况下,该规则告诉您,由于通过系统属性加载类名而没有任何安全检查,因此您有执行任意代码的风险。我只能同意该规则所说的话。

现在,由您决定如何处理此信息:

  • 如果您认为自己的构建和部署系统足够健壮,因此无法通过此渠道对恶意代码进行旁载,则可以将此问题标记为无法解决,可以选择提供一个评论一下为什么您认为这不是问题并继续
  • 如果相反,您假设攻击者可以在应用程序的类路径中的某个位置放置.class.jar文件,并将其用作执行任意代码的侧加载通道,则应至少确认提供的类名是您期望的类名,并拒绝任何意外的类名