Każdy pentester czy bug hunter prędzej czy później zderzy się z tym murem: znajdujesz błąd, dokładnie go opisujesz, robisz idealne Proof of Concept, wysyłasz raport i… cisza. Brak oficjalnego biuletynu GHSA, brak numeru CVE, brak podziękowania ze strony deweloperów.
Tak właśnie zakończyła się historia kolejnego błędu, który znalazłem podczas testów platformy Computer Vision Annotation Tool (CVAT). Choć podatność ta nie doczekała się przypięcia oficjalnej „blachy” z numerkiem, stanowi świetne studium przypadku błędu typu Sensitive System Information Exposure (CWE-497). Oceniona przeze mnie na 5.3 (Medium), doskonale pokazuje, jak gadatliwe potrafią być aplikacje, gdy odpowiednio je „zdenerwujemy”.
TL;DR - Najważniejsze wnioski
- Dlaczego błędy wycieku informacji są groźne?
- Wektor 1: Nieprawidłowy „Remote Source” i wyciek ścieżek z serwera
- Wektor 2: Wewnętrzna architektura odkryta przez Lambda Functions
- Jak zamknąć usta zbyt gadatliwej aplikacji? (Remediacja)
Dlaczego błędy wycieku informacji są groźne?
Zanim przejdziemy do konkretów, warto zaznaczyć jedno: rzadko kiedy wyciek informacji (Information Disclosure) prowadzi bezpośrednio do przejęcia serwera (RCE). Jest to jednak fundament rekonesansu.
Z perspektywy atakującego każda informacja o ścieżkach systemowych, używanych technologiach czy wewnętrznej adresacji sieci to jak znalezienie planów architektonicznych banku przed napadem. Pozwala precyzyjniej dobrać kolejne exploity.
W CVAT znalazłem dwa wektory wycieku wrażliwych danych diagnostycznych.
CWE-497: Exposure of Sensitive System Information
Ta klasa podatności dotyczy sytuacji, w których aplikacja nieumyślnie ujawnia wrażliwe dane systemowe, ścieżki plików, konfiguracje, adresy wewnętrzne, poprzez komunikaty błędów, logi diagnostyczne lub odpowiedzi API.
Wektor 1: Nieprawidłowy „Remote Source” i wyciek ścieżek z serwera
Podczas tworzenia nowego zadania (Task) w CVAT, możemy jako źródło plików wskazać „Remote Source” (np. link do zasobu w sieci). Co się jednak stanie, gdy podamy tam złośliwy lub śmieciowy URL do domeny, która nie zwraca żadnych poprawnych plików do sparsowania?
Zamiast standardowego błędu „Nie można pobrać pliku”, backend (oparty na frameworku Django) „wykrzacza się” i rzuca w interfejs użytkownika oraz bezpośrednio do odpowiedzi API pełnym błędem systemowym:
Tym prostym sposobem dowiedziałem się dokładnie, w jakim katalogu na serwerze uruchomiona jest aplikacja, pod jakimi uprawnieniami (lub na jakiej strukturze) działa, oraz jak wewnętrznie mapuje identyfikatory zadań na foldery na dysku twardym.
Dla atakującego szukającego np. podatności typu Local File Inclusion (LFI) czy Path Traversal, to cenna wskazówka.
Zwykły URL podany jako źródło danych dla nowego Task
/home/django//data/data/<ID>/rawPełny stack trace z Django wyciekł do użytkownika

Wektor 2: Wewnętrzna architektura odkryta przez Lambda Functions
Drugi wektor był nieco sprytniejszy i dotyczył funkcjonalności funkcji Lambda. Wykorzystałem zwykłą iterację (brute-force) identyfikatorów zapytań do API:
Kiedy aplikacja nie potrafiła znaleźć funkcji o danym numerze (ponieważ np. nie istniała lub nie miałem do niej dostępu), serwer odpowiadał kodem HTTP 404 Not Found. Nie był to jednak standardowy, krótki komunikat. Odpowiedź serwera zawierała szczegółowy log:
- Wiemy, że do obsługi serverless/lambd pod spodem używany jest framework Nuclio.
- Wiemy, że komunikacja odbywa się bez szyfrowania po
HTTPna porcie8070. - Poznaliśmy adresację sieci wewnętrznej (Internal Domain):
nuclio-dashboard.internal.cvat.ai.
Pivoting i eskalacja
Gdyby napastnik zyskał punkt zaczepienia na serwerze (np. przez podatność SSRF w innej części aplikacji), wiedziałby dokładnie, gdzie celować w sieci wewnętrznej (Pivoting), aby dobrać się do mikroserwisów Nuclio.
404 Client Error: Not Found for url:http://nuclio-dashboard.internal.cvat.ai:8070/api/functions/2137
"404 Client Error: Not Found for url: http://nuclio-dashboard.internal.cvat.ai:8070/api/functions/2137"
Nuclio
Serverless / Functions-as-a-Service
nuclio-dashboard.internal.cvat.ai
Pełna adresacja sieci wewnętrznej
HTTP :8070
Brak szyfrowania (TLS)

Jak zamknąć usta zbyt gadatliwej aplikacji? (Remediacja)
Nawet jeśli deweloperzy zignorowali raport, zasady bezpiecznego programowania (i obsługi błędów) pozostają niezmienne.
- Przechwytywanie wyjątków (Exception Handling) - Błędy i wyjątki systemowe nigdy nie powinny wypływać na wierzch (do widoku użytkownika końcowego). Należy stosować bloki
try/catchw sposób zaplanowany. - Generyczne komunikaty błędów - Gdy aplikacja nie potrafi sprocesować ścieżki lub połączyć się z mikroserwisem, użytkownik powinien zobaczyć wyłącznie bezpieczny, ogólny komunikat: „Wystąpił błąd podczas przetwarzania pliku” lub „Zasób nie został znaleziony”.
- Logowanie po stronie serwera - Zrzuty pamięci (Stack Traces), błędy
[Errno 21]oraz informacje o portach (8070) powinny trafiać wyłącznie do logów systemowych, do których dostęp mają tylko administratorzy lub zespoły SOC/QA. - Automatyczna analiza kodu (SAST) - Narzędzia klasy Static Application Security Testing potrafią łatwo wyłapać, gdzie w kodzie brakuje sanitacji wyrzucanych na zewnątrz błędów aplikacyjnych.
Ścieżki, porty i adresy wewnętrzne widoczne dla użytkownika
try/catch + generyczne komunikaty + SAST = bezpieczeństwo
Podsumowanie
Brak CVE wcale nie oznacza braku ryzyka. Każda informacja systemowa ujawniona przez aplikację, ścieżka katalogu, wewnętrzna domena, port mikroserwisu, to kolejny element puzzla, który atakujący może wykorzystać do precyzyjniejszego rekonesansu i eskalacji ataku. Pamiętajcie o tym podczas własnych audytów!
Bibliografia
Oficjalny wpis MITRE opisujący klasę podatności polegającą na nieumyślnym ujawnianiu wrażliwych danych systemowych (ścieżki, konfiguracje, adresy wewnętrzne) nieautoryzowanym podmiotom.
Powiązana klasa podatności dotycząca generowania komunikatów błędów zawierających wrażliwe informacje, takie jak stack trace, ścieżki systemowe czy dane konfiguracyjne.
Oficjalne repozytorium open-source platformy CVAT do adnotacji danych w projektach Computer Vision, w której wykryto opisywane podatności.
Dokumentacja CVAT opisująca integrację z frameworkiem Nuclio do automatycznej adnotacji, komponentem, którego wewnętrzna domena została ujawniona przez błąd HTTP 404.
Przewodnik OWASP dotyczący nieprawidłowej obsługi błędów, jednej z najczęstszych przyczyn wycieków informacji systemowych w aplikacjach webowych.

