Prévenir L'attaque XXE avec JAXB

récemment, nous avons eu un audit de sécurité sur notre code, et l'un des problèmes est que notre application est soumise au XML External Entity (XXE) attaque.

fondamentalement, l'application est une calculatrice qui reçoit des entrées XML, par le biais d'un service Web.

voici un exemple D'attaque XXE sur notre application:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header/>
   <soapenv:Body>
      <foo:calculateStuff>
         <!--Optional:-->
         <xmlInput><![CDATA[<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE currency [  
   <!ENTITY include SYSTEM "file:///d:/" >]>
<calcinput>...</calcinput>
]]></xmlInput>
      </foo:calculateStuff>
   </soapenv:Body>
</soapenv:Envelope>

comme vous pouvez le voir, nous pouvons faire référence à une entité qui pointe vers un fichier externe ("file:///d:/").

concernant la saisie XML elle-même (le <calcinput>...</calcinput> partie) est non fractionné avec JAXB (v2.1). La partie web-service est basée sur jaxws-rt (2.1).

Que dois-je faire pour sécuriser mon service web?

Merci.

33
demandé sur freshbm 2012-10-19 19:14:45

1 réponses

JAXB

vous pouvez empêcher L'attaque de L'entité externe Xml (XXE) en désactivant un XMLStreamReader qui a l' IS_SUPPORTING_EXTERNAL_ENTITIES et/ou XMLInputFactory.SUPPORT_DTD propriétés false.

JAX-WS

une implémentation JAX-WS devrait s'occuper de cela pour vous. Si ce n'est pas le cas, je recommande d'ouvrir un bug contre le implmententation.


exemple

Démo

package xxe;

import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        XMLInputFactory xif = XMLInputFactory.newFactory();
        xif.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false);
        xif.setProperty(XMLInputFactory.SUPPORT_DTD, false);
        XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource("src/xxe/input.xml"));

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Customer customer = (Customer) unmarshaller.unmarshal(xsr);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(customer, System.out);
    }

}

entrée.xml

ce document XML contient une entité qui a été configurée pour obtenir la liste des fichiers que j'ai utilisés pour créer cet exemple.

<?xml version="1.0"?>
<!DOCTYPE customer
[
<!ENTITY name SYSTEM "/Users/bdoughan/Examples/src/xxe/">
]
>
<customer>
  <name>&name;</name>
</customer>

Client

package xxe;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Customer {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

Sortie - Par Défaut Configuration

Par défaut, l'entité sera résolu.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
    <name>Customer.java
Demo.java
input.xml
</name>
</customer>

sortie quand XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES propriété est définie à false

Lorsque cette propriété est définie, l'entité n'est pas résolu.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
    <name></name>
</customer>

sortie quand XMLInputFactory.SUPPORT_DTD propriété est définie à false

quand cette propriété est définie une exception est lancée en essayant de résoudre le entité.

Exception in thread "main" javax.xml.bind.UnmarshalException
 - with linked exception:
[javax.xml.stream.XMLStreamException: ParseError at [row,col]:[8,15]
Message: The entity "name" was referenced, but not declared.]
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:436)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:372)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:342)
    at xxe.Demo.main(Demo.java:18)
Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[8,15]
Message: The entity "name" was referenced, but not declared.
    at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:598)
    at com.sun.xml.bind.v2.runtime.unmarshaller.StAXStreamConnector.bridge(StAXStreamConnector.java:196)
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:370)
    ... 2 more
44
répondu Blaise Doughan 2012-10-19 17:28:45