Podręcznik

4. Błędy kontroli dostępu

4.2. External XML entities

Format XML szeroko stosowany w żądaniach wysyłanych do interfejsów API współczesnych aplikacji (alternatywnie do formatu JSON) jest narzędziem posiadającym wiele możliwości, o których często się zapomina. Jedną z nich jest możliwość rozwiązywania encji (entity) zewnętrznych (np. CVE-2022-25312). Polega na wykorzystaniu nieprawidłowo skonfigurowanego parsera XML po stronie serwera i najczęstszym celem są aplikacje napisane w języku Java. Bardzo uproszczony przykład może wyglądać następująco:

Załóżmy, że API umożliwia pobranie informacji o książce za pośrednictwem następującego zapytania w formacie XML:

<?xml version ="1.0" encoding ="UTF-8"? >
<book>< id >100 </ id > </book>

Atakujący podmienia to zapytanie na następujące:

<?xml version ="1.0" encoding ="UTF-8"? >
<!DOCTYPE foo [ <!ENTITY external SYSTEM "file:///etc/passwd"> ]>
<book><id>&external; </id> </book>

spowoduje to zapewne nieprawidłową reakcję serwera, co w połączeniu z próbą wyświetlenia komunikatu o błędzie zwracającym podany identyfikator (to jest druga podatność niezbędna do uzyskania efektu), może dać w efekcie listing pliku /etc/passwd:

Invalid ID: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin

Obrona przed tym atakiem jest prosta i wymaga poprawnej konfiguracji parsera, dbania o jego aktualność a ponadto dodanie prostych testów podatności do listy testów bezpieczeństwa.

Oprócz encji zewnętrznych w parserach XML podatne mogą zapytanie XPath i XQuery oraz dołączenia XInclude.

Przy tej okazji należy podkreślić ważny element projektowania informacji o błędach aplikacji – użytkownik nigdy nie powinien otrzymywać szczegółowych informacji o błędzie w aplikacji poza identyfikatorem (tzw. Identyfikatorem korelacji), który przekazany administratorowi pozwoli mu w dzienniku aplikacji lub serwera skorelować zdarzenie ze zgłoszeniem od użytkownika. Typowym przykładem jest tzw. Yellow screen of death czyli domyślny ekran błędu w ASP.NET [21].