Come utilizzare il mapping personalizzato JAXB per istanziare classi istanziabili su XML

2

Le vulnerabilità note associate a unMarshalling di JAXB sono:

  1. XXE
  2. miliardi di risate
  3. RCE

che sono dovuti alla deserializzazione di dati non fidati e alla risoluzione di riferimenti esterni. Sono a conoscenza delle seguenti impostazioni da consigliare per JAXB al fine di proteggere da (1) e (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))

Al fine di prevenire (3), cioè, al fine di prevenire la scomparsa di oggetti inattesi, so che il modo migliore è di autorizzare le classi che possono essere istanziate su XML personalizzando il metodo di mappatura JAXB.

Tuttavia, non sono riuscito a trovare un singolo esempio di questo ovunque.

(Non suppongo che "unmarshalling per tipo dichiarato" possa aiutare, dato la descrizione del metodo - citazione:

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

che significa che:

val elem: JAXBElement[MyClassType] = unmarshaller.unmarshal(xmlReader, classOf[MyClassType])

non ha nulla a che fare con la limitazione del non-smistamento solo alla classe specificata.)

Sarei molto grato se qualcuno potesse fornire un codice di esempio concreto che mostra come proteggere contro (3) quando si usa JAXB (so che per altre deserializzazioni Java si dovrebbe usare "LookAhead ObjectInputStream" ma per JAXB quella soluzione non lo fa t apply) - grazie mille!

    
posta iammyr 14.06.2018 - 18:58
fonte

0 risposte

Leggi altre domande sui tag