2015-08-19 4 views
6

ich zu diesem Thema recherchiert, aber konnte keine relevanten Informationen finden in Bezug auf dieWie javax.xml.transform.TransformerFactory von XML externen Angriffen sichern

Müssen wir alle Sicherheitsmaßnahmen ergreifen javax.xml zu sichern .transform.Transformer gegen externe XML-Entitätsangriffe?

Ich habe folgendes getan und es scheint die dtd zu erweitern.

String fileData = "<!DOCTYPE acunetix [ <!ENTITY sampleVal SYSTEM \"file:///media/sample\">]><username>&sampleVal;</username>"; 
TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); 
Transformer transformer = transformerFactory.newTransformer(); 
StringWriter buff = new StringWriter(); 
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
transformer.transform(new StreamSource(new StringReader(fileData)), new StreamResult(buff)); 
System.out.println(buff.toString()); 

Ausgabe enthält den Wert aus der Datei

<username>test</username> 

Antwort

3

Ihr Code korrekt zu sein scheint. Als ich diese leicht modifizierte JUnit-Testfall ausgeführt wird:

@Test 
public void test() throws TransformerException, URISyntaxException { 
    File testFile = new File(getClass().getResource("test.txt").toURI()); 
    assertTrue(testFile.exists()); 
    String fileData = "<!DOCTYPE acunetix [ <!ENTITY foo SYSTEM \"file://" + 
        testFile.toString() + 
        "\">]><xxe>&foo;</xxe>"; 
    TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
    System.out.println(transformerFactory.getClass().getName()); 
    transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); 
    Transformer transformer = transformerFactory.newTransformer(); 
    StringWriter buff = new StringWriter(); 
    transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
    transformer.transform(new StreamSource(new StringReader(fileData)), new StreamResult(buff)); 
    assertEquals("<xxe>&foo;</xxe>", buff.toString()); 
} 

bekomme ich folgende Ausgabe:

com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl 
[Fatal Error] :1:182: External Entity: Failed to read external document 'test.txt', because 'file' access is not allowed due to restriction set by the accessExternalDTD property. 
ERROR: 'External Entity: Failed to read external document 'test.txt', because 'file' access is not allowed due to restriction set by the accessExternalDTD property.' 

Vom setFeatureJavaDocs:

Alle Implementierungen sind erforderlich, um die XMLConstants zu unterstützen. FEATURE_SECURE_PROCESSING-Funktion.

  • wahr: Wenn die Funktion ist die Implementierung wird die XML-Verarbeitung begrenzen, um die Umsetzung Grenzen und verhalten sich in einer sicheren Weise zu entsprechen, wie sie durch die Implementierung definiert. Beispiele umfassen das Auflösen von benutzerdefinierten Stylesheets und Funktionen. Wenn die XML-Verarbeitung aus Sicherheitsgründen eingeschränkt ist, wird sie über einen Aufruf an den registrierten ErrorListener.fatalError (TransformerException-Ausnahme) gemeldet. Siehe setErrorListener (ErrorListener-Listener).

Dieser Fehler geht weg, wenn ich transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); Kommentar und dann der Test schlägt fehl, da das Unternehmen aufgelöst wird.

Versuchen Hinzufügen eines ErrorListener sowohl die TransformerFactory und Transformator:

transformerFactory.setErrorListener(new ErrorListener() { 

    @Override 
    public void warning(TransformerException exception) throws TransformerException { 
    System.out.println("In Warning: " + exception.toString()); 
    } 

    @Override 
    public void error(TransformerException exception) throws TransformerException { 
    System.out.println("In Error: " + exception.toString()); 
    } 

    @Override 
    public void fatalError(TransformerException exception) throws TransformerException { 
    System.out.println("In Fatal: " + exception.toString()); 
    } 
}); 

Transformer transformer = transformerFactory.newTransformer(); 
transformer.setErrorListener(transformerFactory.getErrorListener()); 

ich die folgende neue Konsolenausgabe jetzt sehen:

In Error: javax.xml.transform.TransformerException: External Entity: Failed to read external document 'test.txt', because 'file' access is not allowed due to restriction set by the accessExternalDTD property. 

Vielleicht ist Ihre Implementierung es als Warnung Behandlung? Ansonsten ist es vielleicht die Implementierung, die Sie verwenden? Es sieht so aus, als ob die JavaDoc-Spezifikation nicht präzise ist. Daher könnte eine Implementierung etwas anderes als eine andere machen. Ich wäre an fehlerhaften Implementierungen interessiert!