Validace, sanitizace a encoding
- Všechna data, která do aplikace přicházejí je potřeba považovat za nedůvěryhodná a ověřit, že jde o očekávaná data (email, datum narození atd.) - k tomu slouží validace.
- Data mohou obsahovat nebezpečné řetězce nebo kód (
<
,>
,/
,\
atd.), a proto se musí vhodně ošetřit, aby nebyla nebezpečná - k tomu slouží sanitizace. - Výsledná data je potřeba zobrazit v odpovídajícím formátu a převést je z podoby A do podoby B - k tomu slouží encoding.
- Checklist pomáhá s validací uživatelského vstupu, sanitizací, sandboxingem, prevencí injection a dalším.
Validace vstupu
-
Eliminuje až 90 % injection útoků.
-
Ověřte existenci ochrany HTTP parametrů, zejména pokud framework nerozlišuje zdroj parametrů (GET, POST, cookies…).
-
Ověřte existenci mass assignment opatření.
- Mass assignment = úprava datových položek, ke který by neměl mít uživatel přístup, např. povolení admin funkcionality pomocí
isAdmin=1
query parametru.
- Mass assignment = úprava datových položek, ke který by neměl mít uživatel přístup, např. povolení admin funkcionality pomocí
-
Ověřte, zda jsou všechny vstupy ověřeny pomocí seznamu povolených nebo zakázaných hodnot (allow / black list).
-
Ověřte, zda jsou strukturovaná data silně typovaná a validovaná podle definované normy (kreditní karta, email…).
-
Ověřte, zda se přesměrování a forwarding provádí pouze na cíle uvedené v seznamu povolených adres nebo zda se při přesměrování na nedůvěryhodný obsah zobrazí varování.
Sanitizace a sandboxing
- Ověřte správnost sanitizace pomocí knihovny nebo funkce frameworku všech nedůvěryhodných vstupů (výstup z WYSIWYG…).
- Ověřte sanitizaci nestrukturovaných dat a dodržte bezpečnostní opatření (délka, povolené znaky…).
- Ověřte, zda se před odesláním do poštovních systémů upravuje uživatelský vstup a chrání se před SMTP nebo IMAP injection.
- Ověřte, zda se nepoužívá funkce
eval()
nebo jiný dynamický kód. Sanitizujte a sandboxujte veškerý uživatelský vstup před spuštěním, pokud není jiná možnost. - Ověřte existenci ochrany proti template injection a zajistěte sanitizaci a sandboxing všech uživatelských vstupů.
- Ověřte existenci ochrany proti SSRF validací a sanitizací nedůvěryhodných dat (URL, porty, soubory…).
- Ověřte sanitizaci a zakázání nebo sandboxování uživatelem zadaných údajů (SVG, skripty, CSS, markdown…), které by mohly způsobit např. XSS.
Encoding a prevence injection
-
Selhání encodingu výstupu vede k injection útokům.
-
Ověřte relevanci výstupního kódování pro daný interpret a kontext (HTML, JS, SMTP, jméno s apostrofem…).
-
Ověřte, zda encoding bezpečně zachovává uživatelem zvolenou znakovou sadu.
-
Ověřte, zda je výstup chráněný před všemi typy XSS.
-
Ověřte, zda jsou databázové dotazy parametrizované, používá se ORM a entity.
-
Ověřte použití specifického kódování, které chrání před injection útoky (escapování) v případě, že není k dispozici query parametrizace nebo jiné mechanismy.
-
Ověřte existenci ochrany proti JS nebo JSON injection včetně
eval
útoků a XSS. -
Ověřte existenci ochrany proti LDAP injection.
-
Ověřte existenci ochrany proti OS command injection.
-
Ověřte existenci ochrany proti local file inclusion (LFI) nebo remote file inclusion (RFI) útokům.
-
Ověřte existenci ochrany proti XPath nebo XML injection.
Požadavky na paměť, řetězce a neřízený kód
-
Aplikuje se v případě, že jsou používány systémové jazyky nebo neřízený kód.
-
Ověřte použití paměťově bezpečných řetězců, bezpečnější kopírování paměti a aritmetiky ukazatelů pro detekci a prevenci přetečení zásobníku, vyrovnávací paměti nebo haldy.
-
Ověřte, zda formátovací řetězce nepřijímají potenciálně nepřátelský vstup a zda jsou konstantní.
-
Ověřte použití technik ověřování rozsahů a vstupů. aby se zabránilo přetečení celých čísel.
Deserializace
- Ověřte použití kontroly integrity nebo šifrování serializovaných obejktů.
- Ověřte správnost omezení XML parseru (konfigurace), aby nedošlo k XXE.
- Ověřte, zda je zamezeno deserializaci nedůvěryhodných dat ve vlastním kódu i knihovnách třetích stran.
- Ověřte, že při parsování JSON se používá
JSON.parse
, nikolieval
.