XML 外部实体扩展¶
ID: rb/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:
- ruby-code-scanning.qls
- ruby-security-extended.qls
- ruby-security-and-quality.qls
解析不受信任的 XML 文件时,如果 XML 解析器配置较弱,可能会导致 XML 外部实体 (XXE) 攻击。这种类型的攻击使用外部实体引用来访问系统上的任意文件、执行拒绝服务 (DoS) 攻击或服务器端请求伪造。即使解析结果没有返回给用户,DoS 攻击仍然可能发生,并且带外数据检索技术可能会允许攻击者窃取敏感数据。
建议¶
防止 XXE 攻击的最简单方法是在解析不受信任的数据时禁用外部实体处理。如何做到这一点取决于所使用的库。请注意,一些库,如 rexml
、nokogiri
和 libxml-ruby
,默认情况下会禁用实体扩展,因此除非您明确启用了实体扩展,否则无需采取任何进一步措施。
示例¶
以下示例使用 nokogiri
XML 解析器来解析字符串 xmlSrc
。如果该字符串来自不受信任的来源,则此代码可能容易受到 XXE 攻击,因为解析器是在 noent
选项设置为 true 的情况下调用的。
require "nokogiri"
def process_data1
xmlSrc = request.body
doc = Nokogiri::XML.parse(xmlSrc, nil, nil, Nokogiri::XML::ParseOptions::NOENT) # BAD
end
def process_data2
xmlSrc = request.body
doc = Nokogiri::XML.parse(xmlSrc) { |config| config.noent } # BAD
end
为了防止 XXE 攻击,应省略或清除 noent
选项(例如,使用 nonoent
)。这意味着根本不进行任何实体扩展,即使是标准的内部实体,如 &
或 >
也是如此。如果需要,可以使用实用程序函数在单独的步骤中扩展这些实体。
require "nokogiri"
def process_data1
xmlSrc = request.body
doc = Nokogiri::XML.parse(xmlSrc) # GOOD
end
def process_data2
xmlSrc = request.body
doc = Nokogiri::XML.parse(xmlSrc) { |config| config.nonoent } # GOOD
end
参考资料¶
OWASP: XML 外部实体 (XXE) 处理.
Timothy Morgen: XML 模式、DTD 和实体攻击 - 已知技术汇编.
Timur Yunusov, Alexey Osipov: XML 带外数据检索.
常见弱点枚举:CWE-611.
常见弱点枚举:CWE-776.
常见弱点枚举:CWE-827.