Portál AbcLinuxu, 1. května 2025 14:09
Dominik Joe Pantůček mě upozornil na závažnou díru v Abíčku. Sice jsem se o ni doslechl už dříve, ale teprve teď jsem si dokázal konkrétně představit, jak by se dala zneužít. S Joem jsme pak našli algoritmus, který by měl být dostatečně odolný.
Konkrétně šlo o to, že do parametru SRC bylo možno vložit speciální URL na provedení nějaké akce. Například byste do blogu přidali obrázek, jehož adresa by byla rovna odeslání komentáře s textem Leoš tam má díru. Každý, kdo by si blog otevřel, by okamžitě k němu přidal tento komentář. Nebo by šlo dělat skrytější akce, například hlasování v anketě, hodnocení blogu či smazání nového článku (pokud by si blog otevřel admin).
Teď jsem měl několik možností, jak situaci vyřešit. Například úplně zakázat obrázky, nebo povolit jen obrázky umístěné na abclinuxu v bezpečných adresářích. Vzhledem k možnosti redirektu totiž nemělo smysl považovat jakákoliv URL mimo abíčko za bezpečná. Ale nechtěl jsem omezovat uživatele a proto jsem se vydal jinou cestou - kontrolovat všechny akce, zda jsou volány tak, jak by měly být volány.
S Joem jsme došli k názoru, že útok na abíčko by musel jít jen přes GETové linky, tudíž první fronta obrany je ověření, zda akce přišla jako POST. Nicméně existuje poměrně dost akcí, které nejsou ve formuláři, ale jako odkazy. Například zmražení diskuse nebo hodnocení článku. Pro ně jsem musel vytvořit koncept ticketu, který je přiřazen ke každému uživateli. Pokud tedy akce může přijít jako GET, kontroluji, zda je vyplněn správný ticket. Ten je tajný a útočník se k němu nemůže dostat, leda chybou uživatele. A i pak by šel udělat útok na konkrétního uživatele, ale už ne obecný na všechny uživatele. Další obranou je kontrola referera. Ověřuji, zda předchozí stránka byla formulář či nikoliv.
Abíčko je velmi, ale opravdu velmi rozsáhlé a proto obsahuje spousty různých akcí a situací. Co platí pro jednu akci, pro druhou neprojde. Takže metoda ActionProtector.ensureContract()
má čtyři přepínače, které určují, co se má kontrolovat. Využitých kombinací je většina.
Závěrem chci poděkovat Joeovi za pomoc. Pokud narazíte na další problém, prosím dejte mi vědět, pokusím se jej opravit.
PS. dostanete-li chybu Chybné volání akce, přečtěte si FAQ. Možná je chyba na vaší straně.
Tiskni
Sdílej:
popr nejaký perfekcionista, ktorému vadí, že tam vôbec nejaká chyba bola ...
Třeba nemá rád 100% čistotu, hodnotu atd.? Pak snad ale může ještě nehlasovat.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.