TransformerFactory по-прежнему уязвима для атак XXE - PullRequest
0 голосов
/ 07 августа 2020

У меня есть способ, как показано ниже. Я установил для параметра FEATURE_SECURE_PROCESSING значение true.

    public String getString(org.w3c.dom.Node node) throws TransformerException {
        StringWriter writer = new StringWriter();
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);

        Transformer transformer = transformerFactory.newTransformer();
        transformer.transform(new DOMSource(node), new StreamResult(writer));

        return writer.toString();
    }

Когда я запускаю свой модульный тест ниже, я могу перечислить файлы в каталоге проекта, что означает, что он уязвим для атак XXE.

    @Test
    public void test() throws Exception {
        String dir = new File("").getAbsolutePath();
        String xml =
                "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                        "<!DOCTYPE test[" +
                        "<!ENTITY problemEntity SYSTEM \"" + dir + "\">" +
                        "]>" +
                        "<Response>" +
                        "&problemEntity;" +
                        "</Response>";

        org.w3c.dom.Element node = DocumentBuilderFactory
                .newInstance()
                .newDocumentBuilder()
                .parse(new ByteArrayInputStream(xml.getBytes()))
                .getDocumentElement();

        String name = getString(node);
        System.out.println(name);
    }

Как я могу защитить TransformerFactory от таких атак?

1 Ответ

1 голос
/ 07 августа 2020

Вы передаете DOMSource в TransformerFactory, поэтому DTD было обработано до появления TransformerFactory. Вам нужно применить любые элементы управления в момент анализа документа XML, то есть когда создается узел DOM.

...