Bezpečnost aplikací: Jak otestovat zranitelnost API
Jednou z nejpodstatnějších věcí, na kterou by měl každý vývojář při vývoji aplikací myslet, je bezpečnost. Pokud nevíte, čím se při řešení otázky bezpečnosti aplikací řídit, doporučuji se inspirovat seznamem OWASP Top 10 zranitelností, který je každoročně aktualizován. OWASP je ve zkratce projekt nebo komunita, která se zabývá bezpečností webových aplikací. Seznam Top 10 zranitelností je projekt, který už podle názvu obsahuje 10 nejčastějších zranitelností vyskytujících se jak ve webových aplikacích, tak v API, kterému se budeme věnovat.
Step by step testování API
Seznamte se s projektem
Při práci na backendu aplikace pro testování nejčastěji využíváme nějakého API klienta, jako je například Postman. Dost často se tedy stává, že backend vývojář aplikaci jako celek vidí pouze na statusech, při prezentaci práce klientovi a v některých případech až po jejím nasazení. Je tedy vhodné se s aplikací seznámit tak, jak ji bude používat příslušná systémová role – běžný nepřihlášený uživatel, administrátor, účetní, vedoucí týmu, a další. Seznámení se doporučuje provádět na produkčním, případně staging prostředí a jedná se o průzkum komunikace mezi aplikací a API. Na základě tohoto pozorování je možné udělat již zmíněnou analýzu a poznámky ohledně potenciálně zranitelných míst, jako jsou například formuláře, ID a filtry vyskytující se v URL adrese.
Vytvořte si testovací účet
Samotné testování se doporučuje provádět na staging prostředí, a to z následujících důvodů:
- V případě odhalení kritické chyby nechceme rozbít produkci.
- Development prostředí může obsahovat nekonzistentní data a může tak testování znepříjemnit.
Vytvoření testovacího účtu obnáší vytvoření takového množství účtů, kolik je systémových rolí. Spolu s tímto bodem je vhodné si od odpovědné osoby, např. projektového manažera, zjistit, jaká jsou práva jednotlivých rolí a jejich povolené akce.
Stanovení postupu
Před samotným testováním je potřeba se znovu zamyslet nad tím, jak je aplikace napsána a stanovit si postup testování. Cílem je odbavit co nejvíce potenciálních zranitelností najednou a neztrácet čas opakovaným testováním. V praxi to může vypadat například tak, že role účetní dědí vlastnosti role uživatel a role administrátor dědí vlastnosti role účetní, pokud se bude testovat od nejnižší role uživatel, není nutné již testované vlastnosti ověřovat u dalších rolí.
Testování
Pro testování využíváme Postmana nebo jiného API klienta, testujeme pouze samotné API a průběžně vytváříme kolekci requestů, která později může sloužit i samotným vývojářům. Během testování si zapisujte veškeré zranitelnosti a případné systémové chyby. Výstupem vašeho testu by měl být dokument / report obsahující nalezené zranitelnosti, a to v tomto formátu: název zranitelnosti, popis, bezpečnostní riziko, přesný postup exploitace a doporučení, jak zranitelnost opravit.
Náprava a další doporučení
Pravdou je, že většinu zranitelností je možné vyřešit použitím nějaké existující knihovny. Osobně mezi nejkritičtější zranitelnosti řadím autentizaci a autorizaci, kterou si zpravidla každý vývojář musí určit a naimplementovat sám, ať už za použití nějakých knihoven, jako je například axesor nebo na zelené louce. Dbejte tedy zvýšené opatrnosti při implementaci těchto funkcionalit, které se liší projekt od projektu.
Doporučení na závěr
- Nepouštějte Docker pod uživatelem root.
- Nepoužívejte docker-compose v produkci, zkuste například Kubernetes.
- Odfiltrujte citlivé údaje z logu, použijte například cosmas logger.
- Použijte sentry k hlášení aplikačních chyb.
- Přidejte npm audit do vaší pipeline a průběžně aktualizujte používané knihovny.
- Chraňte tokeny, klíče, service accounty a další data, která aplikace potřebuje pro svůj běh, použijte například vault.
- Využijte snyk vulnerability database a github action, která prověří zranitelnosti používaných knihoven.
- Vyzkoušejte statickou analýzu kódu a security scanning CodeQL.
- Pro Node.js vývojáře – neblokujte event loop, zpracovávejte velké requesty asynchronně nebo použijte Node.js streamy.