Přeskočit na hlavní obsah

Zapomenuté heslo

  • Pro správné zavedení systému správy uživatelů je zapotřebí integrace služby “Zapomenuté heslo”
  • Přestože funkce vypadá jednoduše, je častým zdrojem zranitelností (např. enumerace uživatelů)
  1. Vraťte konzistentní zprávu pro existující i neexistující účty
  2. Zajistěte, aby byl response time jednotný
  3. Sdělte způsob obnovení hesla pomocí jiného kanálu
  4. Použijte URL tokeny pro nejjednodušší a nejrychlejší implementaci
  5. Zajistěte, aby vygenerované tokeny byly
    1. náhodně generované pomocí bezpečného kryptografického algoritmu
    2. dostatečně dlouhé (ochrana proti brute force)
    3. bezpečně uložené
    4. na jedno použití a expirovaly po uplynutí určité doby
  6. Neprovádějte změny na účtu, dokud není předložen platný token (např. zablokování účtu)
  • Informace ohledně resetování hesla pro vícefaktorové ověření (MFA) najdete v cheat sheetu

Služba zapomenuté heslo

Požadavek na změnu hesla

  1. Vraťte konzistentní zprávu pro existující i neexistující účty
  2. Zajistěte, aby se odpovědi vracely v konzistentním čase a útočník nemohl spočítat, které účty existují
  3. Implementujte ochranu proti nadměrnému počtu automatických odesílání (CAPTCHA)
    • Jinak by útočník mohl poslat tisíce žádostí o změnu hesla pro různé účty
  4. Řiďte se také cheat sheety prevence SQL injection a validace vstupu

Reset hesla

  1. Umožněte uživateli resetovat heslo po prokázání totožnosti (token z emailu, SMS kód)
  2. Donuťte uživatele potvrdit heslo dvojím zapsáním
  3. Zaveďte politiku bezpečného zadávání hesel, která je v souladu se zbytkem aplikace
  4. Aktualizujte a ukládejte heslo podle bezpečných postupů
  5. Pošlete uživateli email s informací, že jeho heslo bylo resetováno
  6. Nezasílejte heslo v emailu
  7. Nepřihlašujte uživatele automaticky, protože to do kódu vnáší složitost a zvyšuje pravděpodobnost pro vznik zranitelností
  8. Zeptejte se uživatele, zda chce zneplatnit všechny stávající sessions

Metody

  • Abyste mohli uživateli umožnit změnu hesla, musíte mít způsob, jak se s ním spojit prostřednictvím jiného kanálu
  • Metody zvyšují míru jistoty, že je uživatel ten, za koho se vydává
  1. Zajistěte, aby měl uživatel vždy možnost svůj účet obnovit i v případě, že to vyžaduje kontaktování podpory a prokázání totožnosti pracovníkům

Obecné bezpečnostní postupy

  • Všechny tokeny a kódy by měly být
    • generovány kryptograficky bezpečným generátorem náhodných čísel
      • Místo náhodných tokenů je možné použít JWT tokeny
    • dostatečně dlouhé (ochrana proti brute force)
    • svázány s daným uživatelem v databázi
    • zneplatněny po použití
    • uloženy bezpečným způsobem

URL tokeny

  1. Vygenerujte token a přidejte jej do URL query stringu
  2. Odešlete uživateli token emailem
  3. Nespoléhejte se na hlavičku Host při vytváření resetovacích URL adres
    • Vyhnete se Host Header injection
  4. Používejte HTTPS protokol
  5. Přidejte referrer policy s hodnotou noreferrer po resetování hesla (aby nedošlo k úniku odkazů)
  6. Implementujte ochranu proti brute force tokenů (rate limiting)
  7. Proveďte další kroky ověření uživatele v případě potřeby (bezpečnostní otázky)
  8. Nechte uživatele vytvořit a potvrdit nové heslo
  9. Používejte stejnou zásadu pro hesla, jako se používá ve zbytku aplikace

PIN

  • Číslo mezi 6 a 12 znaky
  • Zaslán uživateli postranním kanálem (SMS)
  1. Vygenerujte PIN
  2. Pošlete ho uživateli SMS nebo jiným mechanismem
  3. Oddělte PIN mezerami, aby byl čitelnější
  4. Uživatel vyplní PIN spolu se svým username
  5. Vytvořte omezenou session, která uživateli dovolí změnit si heslo
  6. Nechte uživatele vytvořit a potvrdit nové heslo
  7. Používejte stejnou zásadu pro hesla, jako se používá ve zbytku aplikace

Offline metody

  • Umožňují reset hesla bez vyžadování speciálního identifikátoru (PIN, token)
  • Ověřování stále provádí backend
  • Metody jsou poskytovány po registraci nebo speciální konfiguraci
  • Tyto identifikátory by měly být uloženy bezpečným způsobem offline (správci hesel)
  • Některé implementace jsou postaveny na hardwarových OTP tokenech nebo certifikátech

Backup kódy

  1. Poskytněte ho uživateli při registraci
  2. Vyzvěte uživatele k uložení kódu na bezpečném místě
  • Metoda uplatňuje například Google nebo GitHub
  • Délka by měla být minimálně 8 znaků (pro lepší zabezpečení 12)
  • Uživatel by měl mít k dispozici více kódů, aby bylo zajištěné, že jeden z nich bude fungovat
    • Většina služeb poskytuje 10 kódů
  1. Zaveďte proces, který umožňuje uživateli zneplatnění všech existujících kódů pro obnovení v případě, že leaknou
  2. Omezte rychlost a zaveďte další ochrany, aby se zabránilo brute force kódů a dalším automatizovaným útokům

Bezpečnostní otázky

  1. Nepoužívejte je jako jediný mechanismus pro resetování hesel
    • Odpovědi jsou často uhodnutelné nebo se dají snadno získat
  • V kombinaci s ostatními metodami poskytují další vrstvu zabezpečení
  1. Vybírejte bezpečné otázky, jako je popsáno v OWASP cheat sheetu o bezpečnostních otázkách

Zablokování účtu

  1. Neblokujte účty jako reakci na útok na zapomenuté heslo - může to být zneužito k odepření přístupu uživatelům ke službě

Kam dál

Checklisty