Las vulnerabilidades conocidas asociadas con JAXB son:
- XXE
- billones de risas
- RCE
que se deben a la deserialización de datos no confiables y la resolución de referencias externas. Soy consciente de las siguientes configuraciones que deben recomendarse para JAXB para protegerse de (1) y (2):
val factory = XMLInputFactory.newInstance factory.setProperty(XMLConstants.FEATURE_SECURE_PROCESSING, true); factory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, ""); factory.setProperty(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, false); factory.setProperty(XMLInputFactory.SUPPORT_DTD, false); val xmlReader = factory.createXMLStreamReader(new StringReader(xml))
Para prevenir (3), es decir, para evitar objetos inesperados no deseados, sé que la mejor manera es crear una lista blanca de las clases que pueden crearse instancias sobre XML mediante la personalización del método de mapeo de JAXB.
Sin embargo, no pude encontrar un solo ejemplo de esto en ningún lugar.
(no supongo que "desobstruir por tipo declarado" va a ayudar, dado que la descripción del método - citando:
The unmarshal methods with a declaredType parameter enable an application to deserialize a root element of XML data, even when there is no mapping in JAXBContext of the root element's XML name
que significa lo siguiente:
val elem: JAXBElement[MyClassType] = unmarshaller.unmarshal(xmlReader, classOf[MyClassType])
no tiene nada que ver con restringir lo no riguroso solo a la clase especificada.)
Estaría muy agradecido si alguien pudiera proporcionar un código de muestra concreto que muestre cómo protegerse contra (3) al usar JAXB (sé que para otras deserializaciones en java se debe usar el "Lookahead ObjectInputStream" pero para JAXB esa solución no funciona t aplicar) - ¡gracias un millón!