【问题标题】:Checkmarx error: Deserialization of untrusted dataCheckmarx 错误:不可信数据的反序列化
【发布时间】:2019-11-28 09:43:30
【问题描述】:

在使用 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");
}

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

【问题讨论】:

    标签: java jms deserialization checkmarx validationmessage


    【解决方案1】:

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

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

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

    【讨论】:

    • 那么在这种情况下,我们应该在代码中使用什么来代替 ObjectMessage 呢?有什么建议吗?
    • 我当时没有发表评论,但我更新了我的答案以解决您的评论。如果我的回答解决了您的问题,请将其标记为正确,以帮助将来可能有同样问题的其他人。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多