Java Checkmarx错误:反序列化不受信任的数据
在接受JMS消息的onMessage()方法中,我在checkmarx扫描(在代码中查找与安全相关的漏洞)期间得到了不可信数据的反序列化:Java Checkmarx错误:反序列化不受信任的数据,java,jms,deserialization,checkmarx,validationmessage,Java,Jms,Deserialization,Checkmarx,Validationmessage,在接受JMS消息的onMessage()方法中,我在checkmarx扫描(在代码中查找与安全相关的漏洞)期间得到了不可信数据的反序列化: @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public void onMessage(Message message) { log.debug("Code Run Started - In Queue"); if (message instanceof Obje
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public void onMessage(Message message) {
log.debug("Code Run Started - In Queue");
if (message instanceof ObjectMessage) {
ObjectMessage objMes = (ObjectMessage) message;
try {
ChangeOperationType changeOperation = null;
changeOperation = (ChangeOperationType) objMes.getObject();
} catch (JMSException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
log.error("Message Type is incorrect (Not ChangeOperationType). ", e1);
}
try {
callBackEndpoint = message.getStringProperty(CRMCommonProcessing.CALLBACK_ENDPOINT_URI_PROPERTY);
} catch (JMSException e) {
log.error("CALLBACK ENDPOINT VALUE ERROR. ", e);
}
change(changeOperation);
} else {
log.error("WRONG MESSAGE TYPE GIVEN");
}
log.debug("Code Run Complete - In Queue");
}
此问题的任何修复或解决方案?
ObjectMessage
对象(您在onMessage()
方法中使用)依赖于Java序列化来封送和解封其对象负载。此过程通常被认为是不安全的,因为恶意负载可以利用主机系统进行攻击。已经为此创建了。出于这个原因,大多数JMS提供程序强制用户显式地列出可以使用ObjectMessage
消息交换的包。例如,下面是相关的
对于这个问题,除了从代码中完全删除ObjectMessage
之外,没有神奇的代码修复程序可以消除checkmarx中的警告(这是我实际建议的)。如果可能,为有效负载定义数据表示(JSON、protobuf、XML),并使用javax.jms.TextMessage
或javax.jms.ByteMessage
来携带它
使用JMS
ObjectMessage
还有许多其他问题与安全性无关,您也应该这样做。那么,在这种情况下,我们应该在代码中使用什么来代替ObjectMessage呢?有什么建议吗?我当时没有评论,但我更新了我的答案以回应你的评论。如果我的回答针对您的问题,请将其标记为正确,以帮助将来可能有相同问题的其他人。谢谢