笔者通过对数百个真实项目引入组件的分析选出了Quartz组件的常见漏洞进行分析。本次分析的是CVE-2019-13990。
该漏洞是由于XMLSchedulingDataProcessor.java的initDocumentParser()方法不禁止DTD,导致的XXE。
漏洞编号:CVE-2019-13990
漏洞类型:CWE-611 XML外部实体引用限制不当
CVSS评分:CVSS v3.1:9.8
漏洞危害等级:超危
没有过滤恶意的XML文件
Quartz 2.3.x < 2.3.2
XML(eXtensible Markup Language)是一种标记语言,用于描述和传输结构化的数据和信息。它被设计用来在不同系统之间交换数据,并且可以在不同的应用程序中共享和解释。
在解析外部实体的过程中,XML解析器可以根据URL中指定的方案(协议)来查询各种网络协议和服务(DNS,FTP,HTTP,SMB等)。外部实体对于在文档中创建动态引用非常有用,这样对引用资源所做的任何更改都会在文档中自动更新。但是,在处理外部实体时,可以针对应用程序启动许多攻击。这些攻击包括泄露本地系统文件,这些文件可能包含密码和私人用户数据等敏感数据,或利用各种方案的网络访问功能来操纵内部应用程序。通过将这些攻击与其他缺陷相结合,这些攻击的范围可以扩展到客户端内存损坏,任意代码执行,甚至服务中断,具体取决于这些攻击的上下文。
DTD
DTD(Document Type Definition)是一种用于定义 XML 文档结构和内容的语法规范。它是一种基于标记的语言,用于描述 XML 文档中可以包含的元素、属性、实体、数据类型以及它们之间的关系。DTD 可以确保 XML 文档遵循特定的结构和语义。
属性定义: 可以定义元素可以包含的属性及其数据类型。属性定义允许指定是否必需、默认值等。
实体定义: 实体用于定义可重用的文本块或特殊字符,可以在 XML 文档中引用。有两种类型的实体:内部实体和外部实体。
内容模型: DTD 可以定义元素之间的关系,如顺序、选择和重复。这些定义构成了元素的内容模型。
<!DOCTUPE>声明: 用于将 DTD 与 XML 文档关联起来。在 XML 文档中,通常以 声明的形式指定 DTD 的位置和名称。
docBuilderFactory.setAttribute(“http[:]//java[.]sun[.]com/xml/jaxp/properties/schemaSource”, this.resolveSchemaSource());设置了解析器使用的XML Schema源。其并未对外部实体进行了禁用,因此若XML引用了外部实体就会导致XXE攻击。
1. 升级Quartz至该漏洞不存在的版本
更新 Quartz >= 2.2.4
更新 Quartz >= 2.3.2
Quartz官方的修复方案是通过setFeature方法对XML的解析器加了一些限制,具体新增的限制如下:
- 禁止解析器处理DTD;
- 禁止加载外部DTD;
- 禁止加载外部通用实体;
- 禁止加载外部参数实体;
- 禁用XInclude功能;
- 禁止扩展实体引用。
使用WAF可以阻止攻击者上传恶意XML输入进入应用程序,从而保护免受XXE攻击。
3. 使用白名单
定义一个白名单,只允许特定的实体和内容被解析,而拒绝其他实体。
安全工程师:hu1y40
2023 年 8 月 18 日晚
作者:洞源实验室