【问题标题】:How to remove this use of dynamic class loading or replace this class loading?如何删除这种使用动态类加载或替换此类加载?
【发布时间】:2017-04-02 16:27:42
【问题描述】:
othersMap.put("maskedPan", Class.forName("Some Class"));

删除对动态类加载的这种使用。

规则

更新日志 类不应动态加载 动态加载的类可能包含由静态类初始化程序执行的恶意代码。 IE。您甚至不必实例化或显式调用此类类上的方法就容易受到攻击。 这条规则在每次使用动态类加载时都会引发一个问题。 不合规代码示例

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

【问题讨论】:

  • 你应该描述你想做什么;为什么动态加载首先存在。
  • 因为这是要求。或者您可以说动态加载用于运行时,但在 SONAR 中进行测试时,它会捕获异常。如何解决这个我尝试使用静态但无法解决。请帮助我们将不胜感激。
  • 为什么会有javascript标签?
  • 抱歉,现在误删了。

标签: java string dynamic-class-loaders


【解决方案1】:

让我们首先声明一个显而易见的事实:SonarQube 规则并不意味着被视为宇宙中唯一且唯一的真理。这只是一种将您的注意力吸引到可能敏感的代码片段上并由您来采取适当行动的方法。如果您组织中的人强迫您遵守 SonarQube 的规则,那么他们就不了解该工具的用途。

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

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

  • 如果您认为您的构建和部署系统足够强大,没有恶意代码可以通过该渠道被旁加载,您可以将此问题标记为无法修复,也可以选择提供评论为什么您认为这不是问题并继续前进
  • 如果您假设攻击者可以将.class.jar 文件放在应用程序的类路径中的某个位置,并将其用作任意代码执行的侧载通道,那么您至少应该 验证提供的类名是您期望的,并拒绝任何意外的类名

【讨论】:

    【解决方案2】:

    一个选项是这样的:

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

    【讨论】:

    • 它是否工作? @k5_ 我不知道类名是什么。它是由用户提供给我的,有 100 个类。
    【解决方案3】:

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

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

    正确的做法是说服在您的组织中运行 Sonar 的人员您所做的事情是必要的,并且他们需要为您打破规则。或者,如果你不能说服他们,就不要再这样做了。

    【讨论】:

    • 将尝试让您知道 SONAR 现在是否正在检测,这里的 className 最后是这个吗? :String className = System.getProperty("messageClassName");
    • 你为什么用String.class能解释一下你的回答吗?这将如何取代我的class.forname请。
    猜你喜欢
    • 2022-01-24
    • 2010-09-27
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多