2015-08-19 14 views
6

ja zbadali na ten temat, ale nie mógł znaleźć wszelkie istotne informacje dotyczące tejJak zabezpieczyć javax.xml.transform.TransformerFactory przed atakami zewnętrznymi XML

Czy musimy podejmować żadnych pomiarów zabezpieczeń, aby zabezpieczyć javax.xml .transform.Transformer przeciwko atakom zewnętrznym XML?

Zrobiłem następujące i wydaje się, że rozszerzyć dtd.

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()); 

wyjściowy zawiera wartość z pliku

<username>test</username> 

Odpowiedz

3

Kod wydaje się prawidłowe. Gdy ten nieznacznie zmodyfikowany przypadek testowy JUnit:

@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()); 
} 

pojawia się następujący komunikat:

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.' 

Z setFeatureJavaDocs:

Wszystkie implementacje są zobowiązane do wspierania XMLConstants. Funkcja FEATURE_SECURE_PROCESSING. Gdy funkcja jest:

  • true: wdrożenie ograniczy przetwarzanie XML w celu dostosowania się do limitów implementacji i zachowywać się w bezpieczny sposób zgodnie z definicją w implementacji. Przykłady obejmują rozwiązywanie zdefiniowanych przez użytkownika arkuszy stylów i funkcji. Jeśli przetwarzanie XML jest ograniczone ze względów bezpieczeństwa, zostanie zgłoszone przez wywołanie do zarejestrowanego ErrorListener.fatalError (wyjątek TransformerException). Zobacz setErrorListener (detektor ErrorListener).

Błąd odchodzi gdybym wykomentuj transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); a następnie test nie powiedzie się, ponieważ jednostka nie zostanie rozwiązany.

spróbować dodać ErrorListener zarówno do TransformerFactory i Transformers:

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()); 

widzę następującą nową wyjścia konsoli now:

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. 

Może implementacja traktuje to jako ostrzeżenie? W przeciwnym razie może jest to implementacja, z której korzystasz? Wygląda na to, że specyfikacja JavaDoc nie jest precyzyjna, więc jedna implementacja może zrobić coś innego niż inna. Byłbym zainteresowany, aby poznać wadliwe wdrożenia!

Powiązane problemy