Zero-Day
9 min czytania
17 marca 2026

Kiedy aplikacja mówi za dużo. Information Exposure w CVAT (Brak CVE)

Kiedy aplikacja mówi za dużo. Information Exposure w CVAT (Brak CVE)

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.

CWE-497
5.3Medium
Vector: CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N
Exploitability Metrics
Attack Vector (AV)
Network (N)Adjacent (A)Local (L)Physical (P)
Attack Complexity (AC)
Low (L)High (H)
Privileges Required (PR)
None (N)Low (L)High (H)
User Interaction (UI)
None (N)Required (R)
Scope (S)
Unchanged (U)Changed (C)
Impact Metrics
Confidentiality Impact (C)
None (N)Low (L)High (H)
Integrity Impact (I)
None (N)Low (L)High (H)
Availability Impact (A)
None (N)Low (L)High (H)

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:

IsADirectoryError: [Errno 21] Is a directory: '/home/django/data/data/878459/raw'

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.

Żądanie użytkownika
Remote Source URL:https://evil.example.com/garbage
Oczekiwana odpowiedź:"Nie można pobrać pliku"

Zwykły URL podany jako źródło danych dla nowego Task

Odpowiedź serwera
IsADirectoryError:[Errno 21] Is a directory: '/home/django/data/data/878459/raw'
Katalog aplikacji: /home/django/
Struktura danych: /data/data/<ID>/raw
Mapowanie ID zadań na foldery dyskowe

Pełny stack trace z Django wyciekł do użytkownika

Analiza kodu, ujawnione ścieżki systemowe w komunikacie błędu
Wyciek ścieżek systemowych przez nieopatrznie przekazane błędy frameworka Django.

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:

GET /api/lambda/functions/<ID>

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 HTTP na porcie 8070.
  • 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

Ujawniona architektura wewnętrzna
HTTP 404 Not Found:

"404 Client Error: Not Found for url: http://nuclio-dashboard.internal.cvat.ai:8070/api/functions/2137"

Framework

Nuclio

Serverless / Functions-as-a-Service

Domena wewnętrzna

nuclio-dashboard.internal.cvat.ai

Pełna adresacja sieci wewnętrznej

Protokół / Port

HTTP :8070

Brak szyfrowania (TLS)

Architektura sieciowa, odkryta wewnętrzna infrastruktura CVAT
Jeden błąd HTTP 404 ujawnił wewnętrzną architekturę mikroserwisów i adresację sieci.

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/catch w 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.
Podatne
Odpowiedź API:IsADirectoryError: [Errno 21] '/home/django/data/...'
Odpowiedź 404:nuclio-dashboard.internal.cvat.ai:8070
Stack Trace:Pełne zrzuty błędów Django w odpowiedzi HTTP

Ścieżki, porty i adresy wewnętrzne widoczne dla użytkownika

Bezpieczne
Odpowiedź API:"Wystąpił błąd podczas przetwarzania pliku"
Odpowiedź 404:"Zasób nie został znaleziony"
Stack Trace:Wyłącznie w logach serwera (SOC/QA)

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

1
CWE-497: Exposure of Sensitive System Information to an Unauthorized Control Sphere

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.

2
CWE-209: Generation of Error Message Containing Sensitive Information

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.

3
CVAT, Computer Vision Annotation Tool (Repozytorium GitHub)

Oficjalne repozytorium open-source platformy CVAT do adnotacji danych w projektach Computer Vision, w której wykryto opisywane podatności.

4
CVAT Documentation. Serverless Tutorial (Nuclio)

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.

5
OWASP, Improper Error Handling

Przewodnik OWASP dotyczący nieprawidłowej obsługi błędów, jednej z najczęstszych przyczyn wycieków informacji systemowych w aplikacjach webowych.

Czy Twoja aplikacja też mówi za dużo?

Audyt bezpieczeństwa PWNONE wykryje wycieki informacji systemowych, zanim zrobi to atakujący. Skontaktuj się z nami.

Zamów audyt bezpieczeństwa