Przejdź do treści

Nieprawidłowa kontrola dostępu

Nieprawidłowa kontrola dostępu (ang. Broken Access Control) to podatność polegająca na niewłaściwej weryfikacji uprawnień użytkownika podczas wykonywania operacji lub uzyskiwania dostępu do zasobów. W efekcie użytkownik może wykonywać działania lub uzyskiwać dostęp do funkcji i danych, które powinny być dla niego niedostępne.

Podatność wynika najczęściej z braku autoryzacji po stronie serwera, błędnej implementacji mechanizmów kontroli dostępu lub opierania decyzji o uprawnieniach wyłącznie na danych przesyłanych przez klienta.

Skutki udanego ataku

Broken Access Control może prowadzić do:

  • uzyskania dostępu do danych innych użytkowników,
  • wykonywania operacji administracyjnych bez odpowiednich uprawnień,
  • modyfikacji lub usuwania danych,
  • eskalacji uprawnień,
  • przejęcia kont uprzywilejowanych,
  • pełnej kompromitacji aplikacji.

Typowe scenariusze

Brak weryfikacji uprawnień

Aplikacja nie sprawdza, czy zalogowany użytkownik posiada odpowiednie uprawnienia do wykonania żądania.

Przykład:

GET /admin/users

Każdy zalogowany użytkownik może uzyskać dostęp do panelu administracyjnego.


Pionowa eskalacja uprawnień

Użytkownik posiadający podstawowe uprawnienia może wykonywać operacje przeznaczone wyłącznie dla administratorów.

Przykład:

POST /admin/create-user

lub

POST /admin/delete-user

Pozioma eskalacja uprawnień

Użytkownik może uzyskać dostęp do danych lub funkcji należących do innego użytkownika posiadającego ten sam poziom uprawnień.

Przykład:

GET /profile?id=15

zmiana identyfikatora:

GET /profile?id=16

powoduje wyświetlenie danych innego użytkownika.


Dostęp do ukrytych endpointów bez weryfikacji po stronie serwera

Aplikacja ukrywa funkcje administracyjne w interfejsie użytkownika, jednak serwer nie weryfikuje uprawnień podczas obsługi żądania. Funkcje te pozostają dostępne bezpośrednio pod znanym adresem URL.

Przykłady:

/admin
/debug
/manage
/api/admin

Jeżeli serwer nie sprawdza uprawnień, użytkownik może uzyskać dostęp do tych funkcji.


Manipulacja parametrami

Aplikacja podejmuje decyzje dotyczące uprawnień na podstawie danych przesyłanych przez użytkownika.

Przykład:

{
    "role":"admin"
}

lub

POST /user/update
role=administrator

Jeżeli serwer ufa takim danym, może dojść do eskalacji uprawnień.

Rekomendacje

Aby ograniczyć ryzyko występowania podatności, należy:

  • weryfikować po stronie serwera, czy uwierzytelniony podmiot może wykonać daną operację na konkretnym zasobie,
  • obejmować kontrolą wszystkie chronione ścieżki dostępu,
  • stosować zasadę najmniejszych uprawnień (ang. Least Privilege),
  • domyślnie odmawiać dostępu (deny by default),
  • nie podejmować decyzji o autoryzacji tylko na podstawie danych przesyłanych przez klienta,
  • egzekwować centralną politykę dla każdego żądania i zasobu,
  • rejestrować próby nieautoryzowanego dostępu oraz monitorować logi bezpieczeństwa.