it-swarm.dev

Jak zabránit XXE útoku

Měli jsme bezpečnostní audit našeho kódu a zmínili jsme, že náš kód je citlivý na útoky XML EXternal Entity (XXE).

Vysvětlení

Útoky XML Externí entity využívají funkci XML k dynamickému vytváření dokumentů v době zpracování. Entita XML Umožňuje dynamické zahrnutí dat z daného zdroje. Externí subjekty umožňují, aby dokument XML obsahoval data Z externího identifikátoru URI. Pokud není nakonfigurováno jinak, externí entity nutí analyzátor XML přistupovat ke zdroji specifikovanému Pomocí URI, např. Souboru na lokálním počítači nebo na vzdáleném systému. Toto chování zpřístupňuje aplikaci XML Externí útoky Entity (XXE), které lze použít k provedení odmítnutí služby místního systému, získání neoprávněného přístupu k souborům v místním počítači , Vzdálené skenování a odepření služby vzdálených systémů.

Následující dokument XML ukazuje příklad útoku XXE.

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [
<!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "file:///dev/random" >]><foo>&xxe;</foo>

Tento příklad by mohl havarovat server (v systému UNIX), pokud se analyzátor XML pokusí nahradit entitu obsahem Souboru/dev/random.

Doporučení

XML unmarshaller by měl být bezpečně nakonfigurován tak, aby nepovolil externí entity jako součást příchozího dokumentu XML .

Aby se zabránilo XXE injekci nepoužívejte unmarshal metody, které zpracovávají zdroj XML přímo jako Java.io.File, Java.io.Reader nebo Java.io.InputStream. Analyzujte dokument bezpečně nakonfigurovaným analyzátorem a použijte metodu unmarshal, která bere bezpečný analyzátor jako zdroj XML, jak ukazuje následující příklad:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setExpandEntityReferences(false);
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(<XML Source>);
Model model = (Model) u.unmarshal(document);

Níže uvedený kód je, kde audit zjistil útok XXE:

Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
System.out.println("outputing to : " + outputLocation);
File outputFile = new File(outputLocation);
StreamResult result = new StreamResult(outputFile);
DOMSource source = new DOMSource(doc);
transformer.transform(source, result);

Jak mohu implementovat výše uvedené doporučení do svého kódu? Kde mi chybí věci?

5
SANNO

Můžete použít stejný přístup s DocumentBuilderFactory:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
...

Chcete-li, aby to všichni používali automaticky, musíte vytvořit vlastní implementaci (rozšířením toho, které používáte, pomocí debuggeru zjistíte). Nastavte funkci v konstruktoru.

Poté můžete předat novou továrnu, která se má použít v javax.xml.parsers.DocumentBuilderFactory vlastnosti systému, do Java VM a každý ji použije.

3
Aaron Digulla

Chcete-li zapnout funkci bezpečného zpracování v souboru TransformerFactory. Omezí se tím některé možné škodlivé věci (DOS útoky atd.)

TransformerFactory tf = TransformerFactory.newInstance();
tf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
Transformer transformer = tf.newTransformer();
1
Kayaman

Nezapomeňte, že použití funkce FEATURE_SECURE_PROCESSING není dostatečně bezpečné (z blackhat-pdf ):

... navzdory doporučení Oracle XML analyzátory ve skutečnosti neomezují externí spojení, když je FUNKCE _SECURE_PROCESSING povolena.

OWASP doporučuje ACCESS_EXTERNAL_DTD a ACCESS_EXTERNAL_STYLESHEET.

Společně by to:

TransformerFactory trfactory = TransformerFactory.newInstance();
trfactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
trfactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
trfactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");

Ve skutečnosti je tato otázka duplikátem: Jak zabránit XML externí entitě Injection na TransformerFactory

0
beat

Vzhledem k velkému počtu xml parsovacích motorů na trhu se způsob, jak zabránit útokům XXE, liší od motoru k motoru. viz dokumentace motoru. Základem je zabránit vnějšímu prohlášení DOCTYPE. Pokud je potřeba externí deklarace DOCTYPE, pak zakázání externích obecných entit a externích entit parametrů zabrání útokům XXE na váš kód. Níže je ukázkový kód zabránit XXE při použití analyzátoru SAX.

public class MyDocumentBuilderFactory{

 public static DocumentBuilderFactory newDocumentBuilderFactory(){

    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();

    try{
        documentBuilderFactory.setFeature("http://Apache.org/xml/features/disallow-doctype-decl",true);

        documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities",false);

        documentBuilderFactory.setfeature("http://xml.org/sax/features/external-parameter-entities",false)


    }catch(ParserConfigurationException exp){
        exp.printStackTrace();
    }

    return documentBuilderFactory;
 }
}
0