Wstrzykiwanie jednostek zewnętrznych XML (XXE)

Kategoria OWASP: MASVS-CODE: Code Quality

Omówienie

Wstrzyknięcie zewnętrznej encji XML (XXE) to atak na aplikacje, które analizują dane wejściowe XML. Atak XXE występuje, gdy niezaufajne dane wejściowe XML z odniesieniem do elementu zewnętrznego są przetwarzane przez słabo skonfigurowany parsujący XML. Ten atak może zostać użyty do etapu wielu incydentów, takich jak odmowa usługi, dostęp do systemu plików czy wydobycie danych.

Wpływ

Gdy aplikacja analizuje dokument XML, może przetworzyć wszystkie definicje typu dokumentu (DTD) zawarte w tym dokumencie. Atakujący może wykorzystać to zachowanie, wstrzykując złośliwy kod w DTD. Ten kod może uzyskać dostęp do części systemu plików urządzenia, które są dostępne tylko dla aplikacji i potencjalnie zawierają dane wrażliwe. Co więcej, ten złośliwy kod może wysyłać żądania z urządzenia, potencjalnie omijając środki ochrony obwodowej.

Jeśli aplikacja rozszerza DTD, może to spowodować wielokrotne odwołania do tych samych elementów, co wyczerpuje zasoby urządzenia i może doprowadzić do odmowy usługi.

Środki zaradcze

Wyłącz serwery DTD

Najbezpieczniejszym sposobem zapobiegania atakom XXE jest całkowite wyłączenie definicji typów dokumentów (enty zewnętrznych). W zależności od używanego parsera metoda może wyglądać podobnie do poniższego przykładu 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 chroni też parsownik przed atakami typu DoS. Jeśli nie można całkowicie wyłączyć DTD, użyj deklaracji zewnętrznych encji i zewnętrznych definicji typów dokumentów w sposób odpowiedni dla każdego parsarza.

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

Oczyszczanie danych wejściowych

Aplikację należy ponownie skonfigurować tak, aby nie pozwalała użytkownikom na wstrzykiwanie dowolnego kodu we wstępie dokumentu XML. Musi ona zostać zweryfikowana po stronie serwera, ponieważ kontrolę po stronie klienta można obejść.

Użyj innej biblioteki

Jeśli nie można skonfigurować biblioteki lub metody w bezpieczny sposób, należy rozważyć użycie innej. Parsowanie wyodrębniające XML i parsowanie SAX można skonfigurować w bezpieczny sposób, wykluczając DTD i elementy.

Materiały