XML 外部实体扩展¶
ID: cpp/external-entity-expansion
Kind: path-problem
Security severity: 9.1
Severity: warning
Precision: high
Tags:
- security
- external/cwe/cwe-611
Query suites:
- cpp-code-scanning.qls
- cpp-security-extended.qls
- cpp-security-and-quality.qls
使用配置不当的 XML 解析器解析不受信任的 XML 文件可能会导致 XML 外部实体 (XXE) 攻击。这种类型的攻击使用外部实体引用来访问系统上的任意文件、执行拒绝服务 (DoS) 攻击或服务器端请求伪造。即使解析结果没有返回给用户,DoS 攻击仍然可能发生,并且带外数据检索技术可能允许攻击者窃取敏感数据。
建议¶
防止 XXE 攻击的最简单方法是在解析不受信任的数据时禁用外部实体处理。如何做到这一点取决于所使用的库。请注意,某些库(例如 libxml
的最新版本)默认禁用实体扩展,因此除非您明确启用了实体扩展,否则无需采取进一步操作。
示例¶
以下示例使用 Xerces-C++
XML 解析器来解析字符串 data
。如果该字符串来自不受信任的来源,则此代码可能容易受到 XXE 攻击,因为解析器是在其默认状态下构造的,其中 setDisableDefaultEntityResolution
设置为 false
XercesDOMParser *parser = new XercesDOMParser();
parser->parse(data); // BAD (parser is not correctly configured, may expand external entity references)
为了防止 XXE 攻击,应将 setDisableDefaultEntityResolution
选项设置为 true
。
XercesDOMParser *parser = new XercesDOMParser();
parser->setDisableDefaultEntityResolution(true);
parser->parse(data);
参考¶
OWASP:XML 外部实体 (XXE) 处理。
OWASP:XML 外部实体防御备忘单。
Timothy Morgen:XML 模式、DTD 和实体攻击。
Timur Yunusov、Alexey Osipov:XML 带外数据检索。
常见弱点枚举:CWE-611。