Přeskočit na hlavní obsah

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.

🔴 Napište automatické unit a integration testy pro celý access control mechanismus.

Příklad zneužití zranitelnosti

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

Kam dál

Cheat sheety

Checklisty

Další