Nahrávání souborů
- Nahrávání souborů se stává stále důležitější součástí každé aplikace
- Může jít o nahrávání profilových obrázků, fotografií, životopisů, videí atd.
- Aplikace by měla být schopna odrazit falešné a škodlivé soubory, aby byli její uživatelé v bezpečí
- Povolte pouze bezpečná a kritická extensions daných souborů
- Zajistěte, aby byla použita validace vstupu
- Ověřte typ souboru, nevěřte
content-type
hlavičce, protože ji lze podvrhnout - Změňte název souboru na název vygenerovaný aplikací
- Nastavte limit pro délku názvu, omezte počet povolených znaků
- Omezte velikost souboru
- Povolte nahrávání pouze autorizovaným uživatelům
- Uložte soubory na jiný server, pokud to není možné, uložte je mimo webroot
- Použijte mapování jmen souborů (
someId
→file.ext
) v případě veřejného přístupu k souborům
- Použijte mapování jmen souborů (
- Analyzujte soubor antivirovým programem nebo jej spusťte v sandboxu - tím ověříte, že neobsahuje škodlivá data
- Zajistěte, aby byly všechny používané knihovny bezpečně nakonfigurovány a aktualizovány
- Ochraňte nahrávání souborů před CSRF útoky
Hrozby spojené s nahráváním souborů
Škodlivé soubory
- Zneužití zranitelnosti v analyzátoru souborů nebo modulu pro zpracování souborů (např. ImageTrick exploit, XXE)
- Použití souboru pro phishing (kariérní formulář)
- Posílání obrovských souborů (ZIP, XML souborů - billion laughs attack) tak, aby zaplnily úložiště, což stěžuje dostupnost serveru
- Přepsání existujícího souboru v systému
- Využití aktivního obsahu na klientovi (XSS, CSRF) v případě, že jsou soubory veřejně přístupné
Vyhledávání veřejných souborů
- Zveřejnění jiných souborů
- Zahájení DoS útoku vyžadováním velkého množství souborů - požadavky jsou malé, ale odpovědi mnohem větší
- Získání obsahu souborů, které jsou považovány za nezákonné, urážlivé nebo nebezpečné (osobní a citlivé údaje, data chráněná autorskými právy, atd.)
Zabezpečení nahrávání souborů
- Zaveďte in-depth způsob obrany, aby byl proces nahrávání obtížnější a splňoval potřeby a požadavky služby
- Doporučuje se použítí více technik, protože žádná technika samostatně nestačí k zabezpečení služby
Validujte extension
- Zajistěte, aby validace proběhla po dekódování názvu souboru a aby byl nastaven správný filtr, který zabrání obcházení
- double extension -
.jpg.png
, kde se snadno obejde regex\.jpg
- null bytes -
.php%00.jpg
, kde se.jpg
zkrátí a novou příponou se stane.php
- obecně špatného regexu, který není otestován a zkontrolován
- Nevytvářejte vlastní logiku, pokud nemáte dostatečné znalosti této problematiky
- double extension -
- Více informací naleznete v cheat sheetu o validaci vstupu
Seznam povolených extensions
- Zajistěte používání kritických extensions
- Nepovolujte nepotřebné extensions
- Povolte například jeden typ obrázku, který je dohodnutý tak, aby odpovídal požadavkům organizace
- Nebo nahrávání CV pouze ve formátu
docx
apdf
- Nebo nahrávání CV pouze ve formátu
- Zajistěte použití nejméně škodlivých a rizikových typů souborů na základě potřeb aplikace
Blokujte extensions
- Identifikujte pro vás potenciálně škodlivé typy souborů a zablokujte jejich přípony
- Blokování extensions je samo o sobě slabou ochrannou metodou
- V článku Unrestricted File Upload vulnerability najdete, jak lze taková kontrola obejít
Validujte Content-Type
- Content-type zadává uživatel a jako takovému mu nelze důvěřovat - je možné jej podvrhnout
- Z hlediska bezpečnosti však poskytuje rychlou kontrolu, která zabrání neúmyslně nahrát soubory s nesprávným typem
- Dále je možné kontrolovat MIME type
- To lze provést pomocí seznamu povolených nebo zakázaných položek
Validujte file signature
- Ověřte podpis signature souboru a porovnejte ji s očekávaným souborem
- Tato funkce by se neměla používat samostatně, protože ji lze snadno obejít
Sanitizujte název souboru
- Názvy souborů mohou systém ohrozit několika způsoby
- Použitím nepřijatelných znaků
- Použitím speciálních názvů souborů
- Vytvořte náhodný řetězec jako název souboru (UUID, GUID), případně název řádně zvalidujte
- Zohledněte limity délky názvů souborů, protože systémy, kam se soubory ukládají mají vlastní limity
- Zvažte následující, pokud vyžadujete uživatelsky definované názvy souborů
- Zaveďte maximální délku
- Omezte znaky na povolenou podmnožinu (alfanumerické, pomlčky, mezery, tečky)
- Blokujte nebezpečné znaky, pokud to není možné
Validujte obsah souboru
- Obsah souborů může obsahovat škodlivá, nevhodná nebo nezákonná data
- Použijte speciální validaci obsahu souboru na základě očekávaného typu
- Obrázky
- Použijte techniku přepisování obrázků
- Zničte jakýkoliv druh škodlivého obsahu vloženého do obrázku
- To lze provést pomocí randomizace
- Microsoft dokumenty
- Ověřte nahraný dokument pomocí nástroje Apache POI
- ZIP soubory
- Nedoporučují se, protože mohou obsahovat všechny typy souborů a vektory útoku, které se na ně vztahují
- Obrázky
- Umožněte uživatelům nahlašování nelegálního obsahu a jiná zneužití u služeb poskytujících nahrávání souborů
- Proveďte ruční kontrolu souborů v sandbox prostředí před jejich zveřejněním
- Přidejte do procesu automatizaci
- Některé služby (např. Virus Total) poskytují API pro kontrolu souborů podle známých hashů škodlivých souborů
- Některé frameworky mohou ověřovat typ na základě raw obsahu
- Dávejte pozor na hrozby úniku dat a shromažďování informací veřejnými službami
Úložiště souborů
- Volte umístění na základě bezpečnostních a obchodních požadavků
- Ukládejte soubory na jiném serveru (dojde k úplnému oddělení povinností mezi aplikací a hostitelem)
- Ukládejte soubory mimo webroot
- Soubory můžete uložit do webrootu, ale musíte jim nastavit pouze oprávnění k zápisu
- Nastavte kontroly (IP adresy, oprávněný uživatel atd.) v případě, je-li vyžadován přístup pro čtení
- Jednou z dalších technik je ukládání souborů do databáze
- Někdy se používá pro automatické zálohovací procesy
- To se doporučuje pouze v případě, je-li v týmu DBA a že se postup ukáže jako lepší oproti ukládání na filesystem
- Některé soubory jsou po náhrání odeslány emailem nebo jinak zpracovány - nejsou uloženy na serveru
- Proveďte veškerá bezpečnostní opatření z tohoto dokumentu, než s nimi provedete jakékoli akce
Uživatelská oprávnění
- Ověřte uživatele před tím, než začne nahrávat soubory
- Autentizace
- Uživatel by měl být registrován nebo jinak identifikován, aby bylo možné nastavit omezení a limity pro jeho možnosti nahrávání
- Autorizace
- Uživatel by měl mít příslušná oprávnění k přístupu k souborům nebo jejich úpravě
- Autentizace
Filesystem oprávnění
- Nastavte oprávnění souborů podle principu nejnižšího oprávnění (least privilege)
- Zajistěte, aby čtení souborů bylo přístupné pouze povoleným uživatelům systému
- Nastavte požadované režimy pro soubor
- Zkontrolujte soubor před spuštěním, je-li vyžadováno, aby bylo zajištěno, že nejsou k dispozici žádná makra nebo skryté skripty
Nastavte upload a download limity
- Nastavte vhodné limity pro upload, aby byla chráněna kapacita úložiště
- Nastavte limity velikosti souboru a zohledněte provedení dekomprese pokud bude systém soubory extrahovat nebo zpracovávat
- Nastavte vhodné limity požadavků i pro stahování souborů, aby byl server chráněn proti DoS útokům