如何删除此动态 class 加载或替换此 class 加载?
How to remove this use of dynamic class loading or replace this class loading?
othersMap.put("maskedPan", Class.forName("Some Class"));
删除动态 class 加载的使用。
规则
更新日志
类 不应动态加载
动态加载的 classes 可能包含由静态 class 初始化程序执行的恶意代码。 IE。您甚至不必在此类 classes 上实例化或显式调用方法就容易受到攻击。
此规则会为每次使用动态 class 加载提出问题。
不合规代码示例
String className = System.getProperty("messageClassName");
Class clazz = Class.forName(className); // Noncompliant
见
一个选项是这样的:
Class<?> cls;
switch (System.getProperty("messageClassName")){
case "com.example.Message1":
cls = com.example.Message1.class;
break;
...
}
好吧,你可以尝试超越声纳规则,例如通过使用反射调用 Class.forName()
方法,但我觉得你会在那里解决错误的问题:
Class.class.getDeclaredMethod("forName", String.class).invoke(null, className);
正确的做法是说服您组织中 运行 Sonar 的人您所做的事情是必要的,他们需要为您破例。或者,如果你不能说服他们,就停止这样做。
让我们首先声明一个显而易见的事实:SonarQube 规则并不意味着被视为宇宙中唯一的真理。它只是一种将您的注意力吸引到可能敏感的代码段的方法,并由您采取适当的措施。如果您组织中的人强迫您遵守 SonarQube 的规则,那么他们不了解该工具的用途。
在这种情况下,规则告诉您您有任意代码执行的风险,因为 class 名称是通过系统 属性 加载的,没有任何安全检查.我只能同意规则所说的。
现在,由您决定如何处理这些信息:
- 如果您认为您的构建和部署系统足够健壮,没有恶意代码可以通过此通道旁加载,您可以将此问题标记为不会修复,可选择就您认为这 不是问题 的原因发表评论,然后继续
- 如果相反,您假设攻击者可以将
.class
或 .jar
文件放在应用程序 class 路径中的某处,并将其用作任意代码执行的侧载通道,您应该至少验证所提供的 class 名称是否符合您的预期,并拒绝任何意外的名称
othersMap.put("maskedPan", Class.forName("Some Class"));
删除动态 class 加载的使用。
规则
更新日志 类 不应动态加载 动态加载的 classes 可能包含由静态 class 初始化程序执行的恶意代码。 IE。您甚至不必在此类 classes 上实例化或显式调用方法就容易受到攻击。 此规则会为每次使用动态 class 加载提出问题。 不合规代码示例
String className = System.getProperty("messageClassName");
Class clazz = Class.forName(className); // Noncompliant
见
一个选项是这样的:
Class<?> cls;
switch (System.getProperty("messageClassName")){
case "com.example.Message1":
cls = com.example.Message1.class;
break;
...
}
好吧,你可以尝试超越声纳规则,例如通过使用反射调用 Class.forName()
方法,但我觉得你会在那里解决错误的问题:
Class.class.getDeclaredMethod("forName", String.class).invoke(null, className);
正确的做法是说服您组织中 运行 Sonar 的人您所做的事情是必要的,他们需要为您破例。或者,如果你不能说服他们,就停止这样做。
让我们首先声明一个显而易见的事实:SonarQube 规则并不意味着被视为宇宙中唯一的真理。它只是一种将您的注意力吸引到可能敏感的代码段的方法,并由您采取适当的措施。如果您组织中的人强迫您遵守 SonarQube 的规则,那么他们不了解该工具的用途。
在这种情况下,规则告诉您您有任意代码执行的风险,因为 class 名称是通过系统 属性 加载的,没有任何安全检查.我只能同意规则所说的。
现在,由您决定如何处理这些信息:
- 如果您认为您的构建和部署系统足够健壮,没有恶意代码可以通过此通道旁加载,您可以将此问题标记为不会修复,可选择就您认为这 不是问题 的原因发表评论,然后继续
- 如果相反,您假设攻击者可以将
.class
或.jar
文件放在应用程序 class 路径中的某处,并将其用作任意代码执行的侧载通道,您应该至少验证所提供的 class 名称是否符合您的预期,并拒绝任何意外的名称