CXX.SV.XXE

禁用尝试解析实体的函数调用缺失

应用程序容易遭受针对 XML 的攻击

应用程序应该能够有效抵御 XML 外部实体 (XXE) 处理,这是一种针对 XML 的攻击。

漏洞与风险

在应用程序解析 XML 输入时,可能会发生 XML 外部实体攻击。当 XML 分析程序的配置较弱时,应用程序可能会处理对外部实体的引用。处理该外部实体可能会导致严重的问题,比如机密数据的泄露、服务器端请求伪造,以及其他不太严重的问题,比如拒绝服务。

缓解与预防

常见的缓解策略是确保对读取 XML 输入的 XML 分析程序进行适当配置,使其不遵循外部实体(实体解析)。查看 XML 分析程序 API,了解如何禁用此行为。

漏洞代码示例

复制
void funSAXParser(const char *file_name)
{
SAXParser parser;
parser.parse(file_name);   //CXX.DISA.XXE
}

在此示例中,Klocwork 在第 4 行报告了 CXX.DISA.XXE 缺陷,以标记 XML 文件的解析。因为没有调用 SAXParser API 的 setDisableDefaultEntityResolution() 实体,该代码无法阻止外部实体的解析。

修正代码示例

复制
void funSAXParser(const char *file_name)
{
SAXParser parser;
parser.setDisableDefaultEntityResolution(true);
parser.parse(file_name);   //no DISA.XXE since entity resolution has been disabled
}

SAXParser 对象的默认(易受攻击)行为是允许外部实体的解析。在该修正代码示例中,Klocwork 报告了缺陷,因为使用参数 true 调用 setDisableDefaultEntityResolution() API。当调用 resolveEntity() 方法时,分析程序不会尝试解析外部实体。

相关检查器

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。