在用户控制的数据中解析 XML 外部实体¶
ID: swift/xxe
Kind: path-problem
Security severity: 9.1
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-611
- external/cwe/cwe-776
- external/cwe/cwe-827
Query suites:
- swift-code-scanning.qls
- swift-security-extended.qls
- swift-security-and-quality.qls
使用配置较弱的 XML 解析器解析不受信任的 XML 文件可能会导致 XML 外部实体 (XXE) 攻击。这种类型的攻击使用外部实体引用来访问系统上的任意文件,执行拒绝服务攻击或服务器端请求伪造。即使解析结果没有返回给用户,带外数据检索技术也可能允许攻击者窃取敏感数据。在这种情况下,也可能执行拒绝服务攻击。
建议¶
防止 XXE 攻击的最简单方法是在解析不受信任的数据时禁用外部实体处理。如何做到这一点取决于所使用的库。请注意,某些库(例如最近版本的 XMLParser
)默认情况下会禁用实体扩展,因此,除非您已明确启用实体扩展,否则无需采取进一步措施。
示例¶
以下示例使用 XMLParser
类解析字符串 data
。如果该字符串来自不受信任的来源,则此代码可能容易受到 XXE 攻击,因为解析器还会将其 shouldResolveExternalEntities
选项设置为 true
let parser = XMLParser(data: remoteData) // BAD (parser explicitly enables external entities)
parser.shouldResolveExternalEntities = true
为了防止 XXE 攻击,应保留 shouldResolveExternalEntities
选项,不进行设置,或明确将其设置为 false
。
let parser = XMLParser(data: remoteData) // GOOD (parser explicitly disables external entities)
parser.shouldResolveExternalEntities = false
参考资料¶
OWASP:XML 外部实体 (XXE) 处理.
OWASP:XML 外部实体预防备忘单.
Timothy D. Morgan 和 Omar Al Ibrahim XML 架构、DTD 和实体攻击:已知技术的汇编.
Timur Yunusov、Alexey Osipov:XML 带外数据检索.
通用弱点枚举:CWE-611.
通用弱点枚举:CWE-776.
通用弱点枚举:CWE-827.