Přeskočit na hlavní obsah

Neomezená spotřeba zdrojů

  • API pro svůj běh vyžaduje zdroje (CPU, úložiště, paměť, atd.)
  • Ty jsou občas veřejně vystaveny a platí se za jejich využití (odeslání SMS / emailu, ověření biometrických údajů, atd.)
  • API je zranitelné, pokud chybí nebo jsou špatně nakonfigurovány následující limity
    • execution timeout,
    • maximální přidělená paměť,
    • maximální počet procesů nebo deskriptorů souborů,
    • maximální velikost nahrávaného souboru,
    • počet operací, které se mají provést v rámci jednoho požadavku (GraphQL batching),
    • maximální počet záznamů na stránku,
    • limit poskytovatelů služeb třetích stran.
  • Zranitelnost může vést k DoS (vyčerpání zdrojů).

Jak zranitelnosti předcházet

🔴 Použijte řešení, kde je snadné omezit zdroje - kontejnery nebo serverless.

🔴 Vynuťte maximální velikost dat pro všechny příchozí požadavky, parametry a funkce.

🔴 Implementujte API rate limiting (jak často může uživatel přistupovat k API).

  • Nastavte rate limiting v závislosti na byznys požadavcích - někde mírnější, jinde striktnější.

🔴 Omezte, kolikrát může uživatel provést jednu operaci (obnovení hesla atd.)

🔴 Implementujte server-side validaci, která ověřuje, kolik záznamů se vrací v odpovědi.

🔴 Nastavte limity využití všech služeb třetích stran, pokud to není možné, nastavte billing upozornění.

Příklady zneužití zranitelnosti

  1. Sociální síť umožňuje změnu hesla pomocí SMS verifikace:

    POST /initiate_forgot_password

    {
    "step": 1,
    "user_number": "6501113434"
    }
    • Na pozadí dělá funkce následující dotaz:
    POST /sms/send_reset_pass_code
    Host: twilio.com

    {
    "phone_number": "6501113434"
    }
    • Cena tohoto dotazu je $0,05.
    • Útočník napíše skript, který initiate_forgot_password dotaz provede 1000x.
    • Tím se začnou čerpat prostředky v řádu minut.
  2. GraphQL endpoint uživatelům umožňuje nahrání profilovky:

    POST /graphql

    {
    "query": "mutation {
    uploadPic(name: \"pic1\", base64_pic: \"R0FOIEFOR0xJVA...\") {
    url
    }
    }"
    }
    • Po nahrání se vygeneruje několik thumbnailů (tato operace je náročná na výkon).
    • Aplikace kontroluje, zda uživatel tuto funkci nevolá víckrát po sobě.
    • Validace však nepočítá s GraphQL batchingem, který validaci obejde:
    POST /graphql

    [
    {"query": "mutation {uploadPic(name: \"pic1\", base64_pic: \"R0FOIEFOR0xJVA…\") {url}}"},
    {"query": "mutation {uploadPic(name: \"pic2\", base64_pic: \"R0FOIEFOR0xJVA…\") {url}}"},
    ...
    {"query": "mutation {uploadPic(name: \"pic999\", base64_pic: \"R0FOIEFOR0xJVA…\") {url}}"},
    }
    • Toto volání způsobí vyčerpání zdrojů a nefunkčnost aplikace (DoS).
  3. Aplikace umožňuje stažení velkých souborů přes API.

    • Soubory jsou uloženy v cloudu a nemění se nijak často.
    • Služba používá cache z vícero důvodů (ukládají se do ní soubory do velikosti 15 GB).
    • Po aktualizaci jednoho souboru se jeho velikost zvětší na 18 GB a klienti si začnou novou verzi ihned stahovat.
    • Vzhledem k tomu, že neexistují žádná billing upozornění / omezení, vyšplhá se cena z $13 na $8000.

Kam dál