0

我在接受 JMS 消息的 onMessage() 方法中的 checkmarx 扫描(在代码中找到与安全相关的漏洞)期间对不受信任的数据进行反序列化:

@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");
}

该问题的任何修复或解决方案?

4

1 回答 1

1

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

除了完全从您的代码中删除使用之外,没有针对此问题的神奇代码修复程序可以消除 checkmarx 的警告ObjectMessage(这是我实际推荐的)。如果可能,为有效负载(JSON、protobuf、XML)定义数据表示并使用javax.jms.TextMessageorjavax.jms.BytesMessage来携带它。

使用 JMS 时还有许多其他ObjectMessage与安全性无关的问题,您也应该阅读这些问题

于 2019-11-28T16:02:53.260 回答