Zero-Day
10 min czytania
17 marca 2026

Zmiana jednej metody HTTP i... wchodzisz jak do siebie. Klasyczny IDOR w CVAT (CVE-2024-47172)

Zmiana jednej metody HTTP i... wchodzisz jak do siebie. Klasyczny IDOR w CVAT (CVE-2024-47172)

Czasami najlepsze błędy to te najprostsze. Nie potrzebujesz skomplikowanych łańcuchów RCE ani magii z przepełnieniem bufora, żeby dobrać się do wrażliwych danych. Czasem wystarczy po prostu… ładnie zapytać serwer, używając nieco innej metody HTTP. Tak właśnie było podczas moich ostatnich testów penetracyjnych platformy Computer Vision Annotation Tool (CVAT).

Znaleziony przeze mnie błąd dorobił się oficjalnego numerka CVE-2024-47172 oraz biuletynu bezpieczeństwa na GitHubie (GHSA-gxhm-hg65-5gh2). Luka została załatana, więc możemy bez ogródek zajrzeć pod jej maskę.

Podatność otrzymała scoring 5.4 (wektor: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N). Zobaczmy, jak deweloperzy zapomnieli o podstawowej zasadzie: nigdy nie ufaj danym od użytkownika, ani metodom, którymi je przesyła.

TL;DR - Najważniejsze wnioski

  • Co poszło nie tak?
  • Proof of Concept (Weryfikacja Koncepcji)
  • Co wyciekało?
  • Jak to naprawić? (Remediacja)

Co poszło nie tak?

Aplikacja CVAT (podatne wersje m.in. Server: 2.16.3, UI: 1.64.5) to potężne narzędzie do adnotacji danych w projektach Computer Vision. Znajdziemy tam podział na Projekty, Zadania (Tasks) i Prace (Jobs). Każdy z tych elementów ma swój własny, sekwencyjny identyfikator numeryczny (np. /api/jobs/2137).

Gdy standardowy, zalogowany użytkownik próbuje odpytać API o zadanie należące do kogoś innego za pomocą metody GET, aplikacja działa bezbłędnie. Zwraca soczyste:

HTTP/1.1 403 Forbidden "You do not have permission to perform this action"

Listy kontroli dostępu (ACL) robią to, za co im płacą. Ale co, jeśli przepuścimy ruch przez narzędzie takie jak Burp Suite i w module Repeater zmienimy metodę z GET na PATCH?

CVE-2024-47172
5.4Medium
Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/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)

Proof of Concept (Weryfikacja Koncepcji)

Wysyłając zmodyfikowane żądanie:

PATCH /api/jobs/2137 HTTP/1.1 Host: app.cvat.ai Authorization: Token <twój_token>

HTTP/1.1 200 OK Content-Type: application/json { "id": 2137, "project_id": 42, "assignee": { "username": "inny_uzytkownik", "first_name": "Jan", "last_name": "Kowalski" }, "organization_id": 7, "target_storage": { ... }, ... }

Nagle zaporowy mur znika. Serwer odpowiada kodem HTTP/1.1 200 OK i wypluwa pełnego JSON-a z danymi cudzego zadania! Ominęliśmy sprawdzanie uprawnień na poziomie obiektu (Insecure Direct Object Reference - IDOR).

Skala problemu

Błąd ten występował na wielu krytycznych endpointach: /api/jobs/<ID>, /api/projects/<ID> oraz /api/tasks/<ID>. Wystarczyło użyć modułu Intruder, iterować parametr <ID> (skoro to zwykły int, to brute-force jest banalny) i zgarniać dane innych użytkowników.

Burp Suite - Request
GET/api/jobs/2137
403 Forbidden
ACL sprawdza uprawnienia → Odmowa
Burp Suite - Request
PATCH/api/jobs/2137
200 OK
ACL nie sprawdza PATCH → Dostep przyznany!

Co wyciekało?

Informacje takie jak project_id, organization_id, issues_url, adresy repozytoriów docelowych (target_storage) czy dane przypisanych osób (assignee, username, first_name, last_name). Dla atakującego to prawdziwa kopalnia wiedzy do dalszego rekonesansu lub ataków phishingowych.

  • project_id i organization_id, identyfikatory pozwalające na mapowanie struktury organizacyjnej ofiary.
  • assignee (username, first_name, last_name), dane osobowe przypisanych użytkowników.
  • target_storage, adresy repozytoriów docelowych, potencjalnie ujawniające infrastrukturę chmurową.
  • issues_url, linki do trackerów błędów, mogące zawierać poufne informacje o projektach.

Dlaczego to groźne?

Wyciek tych danych to nie tylko naruszenie prywatności. Atakujący uzyskuje pełny obraz organizacji: kto pracuje nad jakimi projektami, jak wygląda infrastruktura i gdzie szukać kolejnych podatności. To idealny punkt wyjścia do ataków socjotechnicznych.

Atakujacy
PATCH /api/jobs/1..9999
200 OK + Dane
Response Body - Wyciek danych
{
"project_id": 42,
"organization_id": 7,
"username": "jan.kowalski",
"first_name": "Jan",
"last_name": "Kowalski",
"target_storage": "s3://bucket..."
}
Intruder Brute-Force:123...2137...9999
Wizualizacja wycieku danych - cyberbezpieczeństwo
Wyciek danych osobowych i strukturalnych to idealny punkt wyjścia do dalszych ataków.

Jak to naprawić? (Remediacja)

Ten przypadek to klasyczne przypomnienie o dwóch kluczowych rzeczach w bezpieczeństwie aplikacji:

  • Kompletna kontrola dostępu: Sprawdzanie uprawnień (Access Control) musi być zaimplementowane dla każdego punktu końcowego i każdej obsługiwanej metody HTTP (GET, POST, PUT, PATCH, DELETE), a nie tylko dla domyślnego GET.
  • Koniec z sekwencyjnymi ID: Przestańmy w końcu używać sekwencyjnych identyfikatorów numerycznych! Zastąpienie zwykłych ID-ków losowymi wartościami UUID (podejście Defense-in-depth) sprawiłoby, że nawet przy błędnie napisanym ACL, atakujący miałby drastycznie utrudnione zadanie ze ślepym odgadywaniem (brute-force) identyfikatorów zasobów.

Złota zasada pentestera

Testując API, zawsze żonglujcie metodami (PUT, PATCH, DELETE, OPTIONS). Czasami serwer po prostu zapomina, że z innej strony też trzeba zamknąć drzwi.

Podatne
/api/jobs/1
/api/jobs/2
/api/jobs/3

Sekwencyjne ID = trywialne do odgadniecia (brute-force)

Bezpieczne
/api/jobs/a3f7c8d1-...
/api/jobs/9e2b4f6a-...
/api/jobs/d5c1e839-...

UUID v4 = 2122 mozliwych wartosci (Defense-in-depth)

Zabezpieczenia i ochrona API - cyberbezpieczeństwo
Defense-in-depth: każda warstwa zabezpieczeń to dodatkowa bariera dla atakującego.

Podsumowanie

CVE-2024-47172 to podręcznikowy przykład podatności IDOR, w której zmiana jednej metody HTTP (z GET na PATCH) wystarczyła do ominięcia kontroli dostępu w popularnym narzędziu do adnotacji danych CVAT. Luka pozwalała na enumerację i odczyt danych innych użytkowników, ich projektów, zadań i danych osobowych. Została odpowiedzialnie zgłoszona i załatana, ale pozostaje doskonałą lekcją: kontrola dostępu musi obejmować każdy endpoint i każdą metodę HTTP, a sekwencyjne identyfikatory to zaproszenie dla atakujących.

Bibliografia

1
CVE-2024-47172 - NIST National Vulnerability Database

Oficjalny wpis w bazie NIST NVD opisujący podatność IDOR w CVAT z oceną CVSS 5.8.

2
GHSA-gxhm-hg65-5gh2 - GitHub Security Advisory

Biuletyn bezpieczeństwa opublikowany na GitHubie przez zespół CVAT, zawierający szczegóły podatności i informacje o poprawce.

3
OWASP API Security Top 10 - API1:2023 Broken Object Level Authorization

Kategoria OWASP opisująca podatności związane z nieprawidłową kontrolą dostępu na poziomie obiektów, dokładnie ten typ błędu, który został wykorzystany w CVE-2024-47172.

4
CVAT - Computer Vision Annotation Tool (GitHub)

Repozytorium open-source narzędzia CVAT do adnotacji danych w projektach uczenia maszynowego i Computer Vision.

Testujesz API? My testujemy je głębiej.

Podatności IDOR to jeden z najczęstszych błędów w aplikacjach webowych. Nasi pentesterzy sprawdzają każdy endpoint, każdą metodę HTTP i każdą ścieżkę eskalacji uprawnień. Nie czekaj, aż ktoś inny znajdzie błąd w Twoim API.

Zamów test penetracyjny API