Seguridad en XML: Evitar Ataques XXE
— 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 fundeweb-xml que contiene la clase 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:
- getSafeSAXParserFactory(): Permite obtener un SAXParserFactory de la API SAX segura para evitar ataques XXE. Tiene activado por defecto la condicion XMLConstants.FEATURE_SECURE_PROCESSING. Activa la seguridad al máximo.
- getSafeSAXParserFactory(boolean secureProcessingfeature): Permite obtener un SAXParserFactory de la API SAX segura para evitar ataques XXE. Permite indicar si se activa la condición XMLConstants.FEATURE_SECURE_PROCESSING.
- getSafeSAXParser(): Permite obtener un SAXParser seguro para evitar ataques XXE. condición XMLConstants.FEATURE_SECURE_PROCESSING. Activa la seguridad al máximo.
- getSafeSAXParser(boolean secureProcessingfeature): Permite obtener un SAXParser seguro para evitar ataques XXE. Permite indicar si se activa la condición XMLConstants.FEATURE_SECURE_PROCESSING.
- getSafeSAXXMLReader(): Permite obtener un XMLReader seguro para evitar ataques XXE. Tiene activado por defecto la condición XMLConstants.FEATURE_SECURE_PROCESSING. Activa la seguridad al máximo.
- getSafeSAXXMLReader(boolean secureProcessingfeature): Permite obtener un XMLReader seguro para evitar ataques XXE. Permite indicar si se activa la condición XMLConstants.FEATURE_SECURE_PROCESSING.
API JAXP DOM
Para la API DOM contenida en JAXP, tenemos disponibles los siguientes métodos:
- getSafeDocumentBuilderFactory(): Permite obtener un DocumentBuilderFactory de la API JAXP DOM seguro para evitar ataques XXE. Tiene activado por defecto la condición XMLConstants.FEATURE_SECURE_PROCESSING. Activa la seguridad al máximo.
- getSafeDocumentBuilderFactory(boolean secureProcessingfeature): Permite obtener un DocumentBuilderFactory de la API JAXP DOM seguro para evitar ataques XXE. Permite indicar si se activa la condición XMLConstants.FEATURE_SECURE_PROCESSING.
- getSafeDocumentBuilder(): Permite obtener un DocumentBuilder de la API JAXP DOM seguro para evitar ataques XXE. Tiene activado por defecto la condición XMLConstants.FEATURE_SECURE_PROCESSING. Activa la seguridad al máximo.
- getSafeDocumentBuilder(boolean secureProcessingfeature): Permite obtener un DocumentBuilder de la API JAXP DOM seguro para evitar ataques XXE. Permite indicar si se activa la condición XMLConstants.FEATURE_SECURE_PROCESSING.
API StAX
Para la API StAX, tenemos disponibles los siguientes métodos:
- getSafeXMLInputFactory(): Permite obtener un XMLInputFactory de la API StAX segura para evitar ataques XXE.
- getSafeXMLStreamReader(String pathToStream): Permite obtener un XMLStreamReader de la API StAX seguro para evitar ataques XXE, indicando la ruta al fichero.
- getSafeXMLStreamReader(StreamSource streamSource): Permite obtener un XMLStreamReader de la API StAX seguro para evitar ataques XXE, indicando el StreamSource que lo contiene.
API XPath
Para la API XPath, tenemos disponibles los siguientes métodos:
- getSafeXPathFactory(): Permite obtener un XPathFactory de la API XPath segura para evitar ataques XXE.
- getSafeXPath(): Permite obtener un XPath de la API XPath seguro para evitar ataques XXE.
API XSLT
- getSafeTransformerFactory(): Permite obtener un TransformerFactory de la API XSLT segura para evitar ataques XXE.
- getSafeTransformer(): Permite obtener un Transformer de la API XSLT seguro para evitar ataques XXE.
- getSafeTransformer(Source source): Permite obtener un Transformer de la API XSLT seguro para evitar ataques XXE. Podemos pasarle un Un Source que puede ser un XML o instrucciones de transformación.
API JAXB
Para evitar ataques en la API JAXB, en el método unmarshal, obtenemos un 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 <parent> (con <artifactId> 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:
<dependency> <groupId>es.um.atica.fundeweb</groupId> <artifactId>fundeweb-xml</artifactId> </dependency>
FundeWeb 1.x Migradas a Weblogic 12
Hay que modificar la versión del <parent> (con <artifactId> 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:
<dependency> <groupId>org.um.atica.fundeweb-legacy</groupId> <artifactId>fundeweb-xml</artifactId> </dependency>
FundeWeb 1.x - Con JBoss Seam en OAS-OC4J
Hay que modificar la versión del <parent> (con <artifactId> 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:
<dependency> <groupId>org.um.atica.fundeweb-legacy</groupId> <artifactId>fundeweb-xml</artifactId> <classifier>jdk5</classifier> </dependency>
FundeWeb 1.x - Sin JBoss Seam en OAS-OC4J
Hay que modificar la versión del <parent> (con <artifactId> 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:
<dependency> <groupId>org.um.atica.fundeweb-legacy</groupId> <artifactId>fundeweb-xml</artifactId> <classifier>jdk5</classifier> </dependency>
Referencias y Bibliografia
- fdw2.0/fundeweb2.0/gt/seguridad_xml_evitar_ataques_xxe.txt
- Última modificación: 07/11/2017 10:46
- (editor externo)