ProcessDiagramLayoutFactory 中的 XML 外部实体 (XXE) 注入

作者: geo-chen创建于 2026年6月15日更新于 2026年6月15日

摘要

ProcessDiagramLayoutFactory.parseXml(InputStream) 创建了一个不具有 XXE 防护的 DocumentBuilderFactory,并解析了流程定义的 BPMN XML:

java
protected Document parseXml(InputStream bpmnXmlStream) {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    DocumentBuilder builder;
    Document bpmnModel;
    try {
        builder = factory.newDocumentBuilder();
        bpmnModel = builder.parse(bpmnXmlStream);  // <-- DTD + external entities enabled by default
    } catch (Exception e) {
        throw new FlowableException("Error while parsing BPMN model.", e);
    }
    return bpmnModel;
}

没有设置 disallow-doctype-declexternal-general-entitiesexternal-parameter-entitiesload-external-dtdsetExpandEntityReferences(false)XMLConstants.ACCESS_EXTERNAL_DTD。JAXP 默认解析外部实体,因此解析的 XML 中的 SYSTEM 实体引用会被提取并嵌入 DOM 中。

内容来源: flowable/flowable-engine