JAVA.SV.XML.INVALID

在将 XML 解组为 Java 对象前不对其进行验证

XML 架构定义 (XSD) 验证至关重要,因为它可确保 XML 数据遵循预定义的结构和类型约束。XSD 用于生成 Java 类,随后可以使用这些类将 XML 数据读入 Java 对象,并将 Java 对象写入 XML。

JAVA.SV.XML.INVALID 检查器通过检查 XML 数据在处理之前是否经过 XDS 验证来识别潜在的 XML 注入漏洞。

漏洞与风险

如果直接使用用户提供的 XML 文件来解组 Java 对象而不进行任何验证,则代码很容易受到潜在的 XML 注入攻击。XML 注入攻击可能导致未经授权的数据访问、数据损坏、拒绝服务甚至远程代码执行。所有这些情况都可能严重损害应用程序和系统的安全性和完整性。

漏洞代码示例 1

复制
import jakarta.xml.bind.*;
import java.io.File;
 
public class Test {
    class Person {}
 
    public void test() {
        File xmlFile = new File("input.xml");
        try {
                JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
                Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
                Object obj = jaxbUnmarshaller.unmarshal(xmlFile);
            } catch (JAXBException e) {
                e.printStackTrace();
            }
      }
}

Klocwork 在第 12 行报告 JAVA.SV.XML.INVALID 缺陷,指出“直接使用 XML 来解组 Java 对象而未进行任何验证。”

修正代码示例 1

复制
import jakarta.xml.bind.*;
import javax.xml.XMLConstants;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
 
import java.io.File;
 
public class TestFixed {
    class Person {}
 
    public void test() {
        File xmlFile = new File("input.xml");
        try {
                 JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
 
                 SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
                 Schema schema = schemaFactory.newSchema(xsdFile);
 
                 Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
                 jaxbUnmarshaller.setSchema(schema);
 
                Object obj = jaxbUnmarshaller.unmarshal(xmlFile);
            } catch (JAXBException e) {
                e.printStackTrace();
            }
    }
}

在此修正示例中,Klocwork 不再报告 JAVA.SV.EMAIL.HOST 缺陷,因为 Unmarshaller 配置了一个可以调用 Unmarshaller::setSchema() 的架构。

安全培训

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