====== Seguridad en XML: Evitar Ataques XXE ======
--- //[[juanmiguelbg@um.es|JUAN MIGUEL BERNAL GONZALEZ]] 2014/10/16 09:15//
El procesamiento de documentos XML, no esta exento de problemas de seguridad en aplicaciones web, sea cual sea, el lenguaje de programación en el que se utilicen. Para evitar estos ataques en JAVA, tenemos que modificar la configuración de las APIs de manipulación de XML.
En FundeWeb (tanto para la versión 1.x como para la versión 2.x), esta disponible una librería llamada [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/|fundeweb-xml]] que contiene la clase [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html|XmlSafeFactory]] que permite obtener parseadores, lectores o manipuladores de documentos XML seguros, que evitan los ataques XXE.
===== API JAXP SAX =====
Para la API SAX contenida en JAXP, tenemos disponibles los siguientes métodos:
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeSAXParserFactory()|getSafeSAXParserFactory()]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/SAXParserFactory.html|SAXParserFactory]] de la API SAX segura para evitar ataques XXE. Tiene activado por defecto la condicion [[http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#FEATURE_SECURE_PROCESSING|XMLConstants.FEATURE_SECURE_PROCESSING]]. Activa la seguridad al máximo.
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeSAXParserFactory(boolean)|getSafeSAXParserFactory(boolean secureProcessingfeature)]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/SAXParserFactory.html|SAXParserFactory]] de la API SAX segura para evitar ataques XXE. Permite indicar si se activa la condición //XMLConstants.FEATURE_SECURE_PROCESSING//.
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeSAXParser()|getSafeSAXParser()]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/SAXParser.html|SAXParser]] seguro para evitar ataques XXE. condición [[http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#FEATURE_SECURE_PROCESSING|XMLConstants.FEATURE_SECURE_PROCESSING]]. Activa la seguridad al máximo.
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeSAXParser(boolean)|getSafeSAXParser(boolean secureProcessingfeature)]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/SAXParser.html|SAXParser]] seguro para evitar ataques XXE. Permite indicar si se activa la condición [[http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#FEATURE_SECURE_PROCESSING|XMLConstants.FEATURE_SECURE_PROCESSING]].
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeSAXXMLReader()|getSafeSAXXMLReader()]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/org/xml/sax/XMLReader.html|XMLReader]] seguro para evitar ataques XXE. Tiene activado por defecto la condición [[http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#FEATURE_SECURE_PROCESSING|XMLConstants.FEATURE_SECURE_PROCESSING]]. Activa la seguridad al máximo.
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeSAXXMLReader(boolean)|getSafeSAXXMLReader(boolean secureProcessingfeature)]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/org/xml/sax/XMLReader.html|XMLReader]] seguro para evitar ataques XXE. Permite indicar si se activa la condición [[http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#FEATURE_SECURE_PROCESSING|XMLConstants.FEATURE_SECURE_PROCESSING]].
===== API JAXP DOM =====
Para la API DOM contenida en JAXP, tenemos disponibles los siguientes métodos:
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeDocumentBuilderFactory()|getSafeDocumentBuilderFactory()]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilderFactory.html|DocumentBuilderFactory]] de la API JAXP DOM seguro para evitar ataques XXE. Tiene activado por defecto la condición [[http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#FEATURE_SECURE_PROCESSING|XMLConstants.FEATURE_SECURE_PROCESSING]]. Activa la seguridad al máximo.
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeDocumentBuilderFactory(boolean)|getSafeDocumentBuilderFactory(boolean secureProcessingfeature)]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilderFactory.html|DocumentBuilderFactory]] de la API JAXP DOM seguro para evitar ataques XXE. Permite indicar si se activa la condición [[http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#FEATURE_SECURE_PROCESSING|XMLConstants.FEATURE_SECURE_PROCESSING]].
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeDocumentBuilder()|getSafeDocumentBuilder()]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilder.html|DocumentBuilder]] de la API JAXP DOM seguro para evitar ataques XXE. Tiene activado por defecto la condición [[http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#FEATURE_SECURE_PROCESSING|XMLConstants.FEATURE_SECURE_PROCESSING]]. Activa la seguridad al máximo.
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeDocumentBuilder(boolean)|getSafeDocumentBuilder(boolean secureProcessingfeature)]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/parsers/DocumentBuilder.html|DocumentBuilder]] de la API JAXP DOM seguro para evitar ataques XXE. Permite indicar si se activa la condición [[http://docs.oracle.com/javase/7/docs/api/javax/xml/XMLConstants.html#FEATURE_SECURE_PROCESSING|XMLConstants.FEATURE_SECURE_PROCESSING]].
===== API StAX =====
Para la API StAX, tenemos disponibles los siguientes métodos:
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeXMLInputFactory()|getSafeXMLInputFactory()]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/stream/XMLInputFactory.html|XMLInputFactory]] de la API StAX segura para evitar ataques XXE.
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeXMLStreamReader(java.lang.String)|getSafeXMLStreamReader(String pathToStream)]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/stream/XMLStreamReader.html|XMLStreamReader]] de la API StAX seguro para evitar ataques XXE, indicando la ruta al fichero.
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeXMLStreamReader(javax.xml.transform.stream.StreamSource)|getSafeXMLStreamReader(StreamSource streamSource)]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/stream/XMLStreamReader.html|XMLStreamReader]] de la API StAX seguro para evitar ataques XXE, indicando el [[http://docs.oracle.com/javase/7/docs/api/javax/xml/transform/stream/StreamSource.html|StreamSource]] que lo contiene.
===== API XPath =====
Para la API XPath, tenemos disponibles los siguientes métodos:
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeXPathFactory()|getSafeXPathFactory()]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/XPathFactory.html|XPathFactory]] de la API XPath segura para evitar ataques XXE.
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeXPath()|getSafeXPath()]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/XPath.html|XPath]] de la API XPath seguro para evitar ataques XXE.
===== API XSLT =====
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeTransformerFactory()|getSafeTransformerFactory()]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/transform/TransformerFactory.html|TransformerFactory]] de la API XSLT segura para evitar ataques XXE.
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeTransformer()|getSafeTransformer()]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/transform/Transformer.html|Transformer]] de la API XSLT seguro para evitar ataques XXE.
* [[https://fundeweb.um.es/prototipo/public/FundeWeb/2.x/apidoc/fundeweb-xml/es/um/atica/xml/XmlSafeFactory.html#getSafeTransformer(javax.xml.transform.Source)|getSafeTransformer(Source source)]]: Permite obtener un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/transform/Transformer.html|Transformer]] de la API XSLT seguro para evitar ataques XXE. Podemos pasarle un Un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/transform/Source.html|Source]] que puede ser un XML o instrucciones de transformación.
===== API JAXB =====
Para evitar ataques en la API JAXB, en el método [[http://docs.oracle.com/javase/7/docs/api/javax/xml/bind/helpers/AbstractUnmarshallerImpl.html#unmarshal(javax.xml.transform.Source)|unmarshal]], obtenemos un [[http://docs.oracle.com/javase/7/docs/api/javax/xml/stream/XMLStreamReader.html|XMLStreamReader]] seguro de la clase //XmlSafeFactory//. Ejemplo:
JAXBContext jc = JAXBContext.newInstance(Customer.class);
XMLStreamReader xsr = XmlSafeFactory.getSafeXMLStreamReader(new StreamSource("src/xxe/input.xml"));
Unmarshaller unmarshaller = jc.createUnmarshaller();
Customer customer = (Customer) unmarshaller.unmarshal(xsr);
....
===== Librerías y Configuración =====
La librería a utilizar y la configuración, depende de la versión de FundeWeb.
==== FundeWeb 2.x ====
Hay que modificar la versión del //// (con // parent//) en el POM principal del proyecto, estableciendo la versión //2.0.3//.
Hay que modificar el POM del módulo WEB, añadiendo la dependencia de //fundeweb-xml// justo debajo de la dependencia //fundeweb-tags//. El código es:
es.um.atica.fundeweb
fundeweb-xml
==== FundeWeb 1.x Migradas a Weblogic 12 ====
Hay que modificar la versión del //// (con // seam-parent//) en el POM principal del proyecto, estableciendo la versión //1.5.4//.
Hay que modificar el POM del módulo EJB, añadiendo la dependencia de //fundeweb-xml// justo debajo de la dependencia //fundeweb-seam-components//. El código es:
org.um.atica.fundeweb-legacy
fundeweb-xml
==== FundeWeb 1.x - Con JBoss Seam en OAS-OC4J ====
Hay que modificar la versión del //// (con // seam-parent//) en el POM principal del proyecto, estableciendo la versión //1.2.8//.
Hay que modificar el POM del módulo EJB, añadiendo la dependencia de //fundeweb-xml// justo debajo de la dependencia //fundeweb-commons//. El código es:
org.um.atica.fundeweb-legacy
fundeweb-xml
jdk5
==== FundeWeb 1.x - Sin JBoss Seam en OAS-OC4J ====
Hay que modificar la versión del //// (con // servicio-parent//) en el POM principal del proyecto, estableciendo la versión //1.2.7//.
Hay que modificar el POM del módulo EJB, añadiendo la dependencia de //fundeweb-xml// justo debajo de la dependencia //fundeweb-commons-services//. El código es:
org.um.atica.fundeweb-legacy
fundeweb-xml
jdk5
===== Referencias y Bibliografia =====
* [[https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Processing|XML External Entity (XXE) Processing]]
* [[https://www.owasp.org/index.php/Testing_for_XML_Injection_(OTG-INPVAL-008)|Testing for XML Injection (OTG-INPVAL-008)]]
* [[http://w3facility.info/question/preven-xxe-attack-with-jaxb/|Prevent XXE Attack with JAXB]]
* [[http://10-99.blogspot.com.es/2013/02/definition-xml-external-entityxxe-is.html|XML External Entity(XXE) Vulnerability and Prevention]]