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

时间:2019-11-07 15:45:05

标签: java jms fortify

我遇到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 

      }
   }
}

3 个答案:

答案 0 :(得分:0)

ObjectMessage对象依靠Java序列化来封送和取消封送其对象有效负载。通常认为此过程是不安全的,因为恶意负载可能会利用主机系统。为此已创建Lots of CVEs。因此,大多数JMS提供程序都会强制用户将可使用ObjectMessage消息交换的程序包明确列入白名单。例如,这是相关的documentation for ActiveMQ Artemis

除了完全从您的代码中完全删除ObjectMessage的使用(我实际上建议的)之外,没有解决该问题的魔术代码可以消除Fortify的警告。

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

答案 1 :(得分:0)

如果您无权访问JMS提供者或他们不提供此功能,则另一个选择(取决于您的情况)是在代码中使用(超前)ValidatingInputStream,以便您可以在内部将白名单。 / p>

答案 2 :(得分:0)

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

如果您使用readObject()

,请使用此选项