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 の欠陥を報告し、「Java オブジェクトを検証なしでマーシャリング解除するために XML が直接使用されています」を示します。
修正コード例 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();
}
}
}
修正されたこの例では、Unmarshaller::setSchema() の呼び出しがあるスキーマで Unmarshaller が構成されているため、Klocwork は JAVA.SV.EMAIL.HOST の欠陥を報告しなくなります。
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。