Nowa podatność masakrująca API RESTowe. Jeśli jesteś programistą lepiej to zobacz…

07 października 2019, 22:27 | W biegu | komentarze 4
: oglądaj sekurakowe live-streamy o bezpieczeństwie IT.

Chodzi o niby znaną od dłuższego czasu klasę Mass Assignment, która najwyraźniej przeżywa drugą młodość. Przesyłasz np. JSON-em dane nowego użytkownika do API, co jest mapowane na stosowny obiekt i zapisywane do bazy. Proste ale i niebezpieczne. Bo co się stanie, jeśli ktoś do JSON-a doda klucz „admin”: true ?. Będziemy adminem? Nie wierzycie, to zobaczcie tę podatność (CVE-2019-16097):

Oryginalne żądanie do API dodające użytkownika wyglądało tak:

Dane użytkownika widać z kolei tutaj:

Dane użytkownika

Widzicie ten fragment: HasAdminRole: bool ? To teraz atak:

Game Over. Mamy admina. Bez jakiegoś wielkiego hackowania. Inny świeży przypadek? Proszę bardzo. Tym razem dodawanie nowego użytkownika wyglądało tak:

Dodawanie usera

Jak dodać admina? Uzupełniając JSON-a o "role":"admin".

Oczywiście nie każde API będzie podatne na ten problem, ale warto czasem pomyśleć również o bezpieczeństwie – nie tylko wygodzie.

Po więcej tego typu smaczków odsyłam do projektu OWASP API Top Ten (Mass Assignment ma tu swoje osobne miejsce), naszego szkolenia z bezpieczeństwa API REST lub książki o bezpieczeństwie aplikacji webowych – mamy tutaj cały rozdział o bezpieczeństwie API REST.

–ms

Spodobał Ci się wpis? Podziel się nim ze znajomymi:



Komentarze

  1. Rafał

    Ale to HasAdminRole dla jakiegoś frontendu to jest pewnie tylko informacja. Dokonując jakiejś operacji tylko dla admina nadal po stronie backendu należy sprawdzić, czy ten user jest adminem i czy może taką operację wykonać.

    Odpowiedz
  2. Bartosz

    Brawo dla projektanta, ale to jest podatność konkretnego systemu a nie REST API.
    Kto mądry dodaje do API Flage „isAdmin” xD

    Odpowiedz
  3. Grzesiek

    Masakra. W skrócie – tak się nie programuje.

    Odpowiedz
  4. Tomasz Bielaszewski

    Właśnie z takiego powodu nie używa się obiektów z warstwy logiki na endpointach REST. Chyba wszystkie współczesne architektury o tym wspominają żeby odseparowywac swiat zewnętrzny od tego co się dzieje w logice appki. To jest klasyczny błąd designu aplikacji a nie podatność API REST

    Odpowiedz

Odpowiedz na Tomasz Bielaszewski