【问题标题】:Dynamic Code Evaluation: Unsafe Deserialization Fortify Issue动态代码评估:不安全的反序列化强化问题
【发布时间】:2019-11-07 15:45:05
【问题描述】:

我遇到了 Fortify 问题:

Dynamic Code Evaluation: Unsafe Deserialization

在下面一行:

rapidMtoorderObj = (MyMessageObject)theMessage.getObject(); 

我附上了我的 JMS 代码 sn-p。 任何人都可以检查我的 JMS 代码并解释为什么我会遇到这个问题并分享修复。

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;

public class MyMessageBean extends MessageReceiver {
   private static final long serialVersionUID = 1L;

   public MyMessageBean() { 
       super();
   }

   public void onMessage(Message message) {
      MyMessageObject rapidMtoorderObj = new MyMessageObject(); 

      try {  
         ObjectMessage theMessage = (ObjectMessage)message;
         rapidMtoorderObj = (MyMessageObject)theMessage.getObject(); 
         // Getting "Dynamic Code Evaluation: Unsafe Deserialization" in this line 

      }
   }
}

【问题讨论】:

    标签: java jms fortify


    【解决方案1】:

    ObjectMessage 对象依赖于 Java 序列化来编组和解组其对象有效负载。这个过程通常被认为是不安全的,因为恶意负载可以利用主机系统。 Lots of CVEs 已为此创建。出于这个原因,大多数 JMS 提供程序强制用户将可以使用ObjectMessage 消息交换的包显式列入白名单。例如,这里是相关的documentation for ActiveMQ Artemis

    除了完全从您的代码中删除ObjectMessage 的使用(这是我真正推荐的)之外,没有针对此问题的神奇代码修复程序可以消除来自 Fortify 的警告。

    使用 JMS ObjectMessage 还存在许多其他与安全无关的问题,您应该 read about

    【讨论】:

      【解决方案2】:

      如果您无权访问 JMS 提供程序或他们不提供此功能,另一个选项(取决于您的方案)是在您的代码中使用(前瞻)ValidatingInputStream,以便您可以在内部加入白名单。

      【讨论】:

        【解决方案3】:
            if (ois.readObject() instanceof Object) {
                  return (ois.readObject());
                } else {
                    return null;
                }
        

        如果您有使用 readObject() 的情况,请使用它

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-27
          • 2018-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-08
          • 2023-04-11
          • 1970-01-01
          相关资源
          最近更新 更多