Porušení access controls
- Access controls = zaručují, že uživatel nepřekročí nastavená oprávnění.
Nejčastější zranitelnosti
- Neoprávněné zobrazení, modifikace a smazání dat.
- Data nebo funkcionality jsou zpřístupněny komukoli.
- Data nebo funkcionality jsou zpřístupněny po změně URL adresy.
- Zobrazení nebo manipulace s cizím účtem.
- Chybějící uživatelská kontrola přístupu k API rozhraní a jednotlivým metodám.
- Eskalace privilegií - vystupování jako jiná role (např. admin).
- Manipulace s JWT token metadaty nebo cookie za účelem zvýšení oprávnění.
- Nesprávná CORS konfigurace.
- Procházení stránek jako neověřený uživatel, i když by měl být jejich obsah přístupný pouze ověřeným uživatelům.
Jak zranitelnosti předcházet
🔴 Zakažte přístup na stránky a zdroje ve výchozím nastavení mimo ty, které mají být veřejně dostupné.
🔴 Implementujte access control mechanismus a používejte ho napříč aplikací.
- Access control má smysl pouze na backendu / serveru - tam, kde jej uživatel nezmění.
🔴 Nastavte CORS dle bezpečnostních doporučení.
🔴 Implementujte access control tak, aby vynucoval vlastnictví záznamu a ne jen ověření pouhého práva na editaci, čtení, vytváření nebo mazání záznamu.
🔴 Implementujte aplikační limity na základě doménových požadavků.
- Např. limit stránkování - je v pořádku získání např. 1 mil záznamů najednou?
🔴 Zakažte zobrazování a procházení souborů a adresářů na webovém serveru a ujistěte se, že metadata (např. .git
) nebo backup soubory se ve web roots serveru nenacházejí.
🔴 Logujte selhání access controls a implementujte mechanismus, který v takovém případě informuje správce systému.
🔴 Nastavte rate limiting API a minimalizujte potenciální automatizované útoky.
🔴 Zněplatněte session po odhlášení uživatele.
🔴 Nastavte JWT token na krátkou životnost.
- Následujte OAuth standardy pro odebrání přístupu v případě, že používáte JWT token s dlouhou životností.
🔴 Napište automatické unit a integration testy pro celý access control mechanismus.
Příklad zneužití zranitelnosti
- Běžný uživatel upraví URL adresu tak, aby měl přístup k admin rozhraní.
https://example.com/app/dashboard
https://example.com/app/admin/dashboard
- Do admin rozhraní by neměl mít přístup nepřihlášený uživatel ani uživatel s jinými právy než admin.
- Aplikace neověřuje přijatá data a používá je napřímo v SQL query k získání informací o uživateli.
stmt.setString(1, request.getParameter("account"));
ResultSet results = stmt.executeQuery();
- Útočník změní query parametr v URL a vyžádá si data, která nejsou spojena s jeho účtem.
https://example.com/app/accountInfo?account=notmyaccount