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