动态代码评估:不安全的反序列化 Fortify 问题

Dynamic Code Evaluation: Unsafe Deserialization Fortify Issue

我遇到了 Fortify 问题:

Dynamic Code Evaluation: Unsafe Deserialization

在下一行:

rapidMtoorderObj = (MyMessageObject)theMessage.getObject(); 

我附上了我的 JMS 代码片段。 任何人都可以检查我的 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 

      }
   }
}

ObjectMessage 对象依赖于 Java 序列化来编组和解组它们的对象负载。这个过程通常被认为是不安全的,因为恶意负载可以利用主机系统。 Lots of CVEs have been created for this. For this reason, most JMS providers force users to explicitly whitelist packages that can be exchanged using ObjectMessage messages. For example, here's the related documentation for ActiveMQ Artemis.

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

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

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

    if (ois.readObject() instanceof Object) {
          return (ois.readObject());
        } else {
            return null;
        }

如果您遇到使用 readObject()

的情况,请使用此选项