我遇到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
}
}
}
答案 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()