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
-
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.
-
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).
-
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.