Wstrzykiwanie jednostek zewnętrznych XML (XXE)

Kategoria OWASP: MASVS-CODE: jakość kodu

Przegląd

Wstrzyknięcie zewnętrznej jednostki XML (XXE) to atak na aplikacje, które analizują dane wejściowe XML. Atak XXE występuje, gdy słabo skonfigurowany parser XML przetwarza niezaufane dane wejściowe XML z odwołaniem do jednostki zewnętrznej. Ten atak może być wykorzystywany do przeprowadzania różnych incydentów, w tym ataków typu DoS, uzyskiwania dostępu do systemu plików lub wydobycia danych.

Wpływ

Gdy aplikacja analizuje dokument XML, może przetwarzać wszystkie definicje DTD (Document Type Definitions, znane też jako jednostki zewnętrzne) zawarte w dokumencie. Haker może wykorzystać to zachowanie, wstrzykując złośliwy kod jako DTD. Ten kod może następnie uzyskać dostęp do części systemu plików urządzenia, które są dostępne tylko dla aplikacji i mogą zawierać dane wrażliwe. Ponadto ten złośliwy kod może wysyłać żądania z urządzenia, potencjalnie omijając zabezpieczenia obwodowe.

Na koniec, jeśli aplikacja rozszerza DTD, może to spowodować sytuację z wieloma iteracjami odwoływanych jednostek, co wyczerpuje zasoby urządzenia i prowadzi do ataku typu DoS.

Środki zaradcze

Wyłącz DTD

Najbezpieczniejszym sposobem zapobiegania atakom XXE jest całkowite wyłączenie DTD (jednostek zewnętrznych). W zależności od używanego parsera metoda może być podobna do przykładu poniżej w przypadku biblioteki XML Pull Parser:

Java

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);

Kotlin

val factory = XmlPullParserFactory.newInstance()
factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)

Wyłączenie DTD zabezpiecza też parser przed atakami typu DoS. Jeśli nie można całkowicie wyłączyć DTD, należy wyłączyć jednostki zewnętrzne i deklaracje typu dokumentu zewnętrznego w sposób specyficzny dla każdego parsera.

Ze względu na dużą liczbę silników analizy XML na rynku sposoby zapobiegania atakom XXE różnią się w zależności od silnika. Więcej informacji znajdziesz w dokumentacji silnika.

Przeprowadź sanitację danych wejściowych

Aplikację należy skonfigurować tak, aby nie zezwalała użytkownikom na wstrzykiwanie dowolnego kodu w preambule dokumentu XML. Trzeba to zweryfikować po stronie serwera, ponieważ można obejść zabezpieczenia po stronie klienta.

Użyj innej biblioteki

Jeśli nie można bezpiecznie skonfigurować używanej biblioteki lub metody, należy rozważyć użycie innej. XML Pull Parser i SAX Parser można bezpiecznie skonfigurować, wyłączając DTD i jednostki.

Zasoby