Závažná bezpečnostní chyba ve Springu odhalena!

Otázka: Je pravda, že v Košicích upálily rusa?
Odpověd rádia Jerevan: Ano, je to pravda, ale nebylo to v Košicích, ale v Kostnici a nebyl to rus, ale Hus.

Myslel jsem si, že jsem expert na senzační titulky. Ale tento je nepřekonatelný. Mohli jste na něj narazit dnes, například na theserverside.com. Na první pohled to vypadá, že našli závažnou bezpečnostní chybu ve Springu. Na druhý pohled člověk přijde na to, že Rádio Jerevan obnovilo vysílání.
Takže, je pravda, že je ve Springu bezpečnostní chyba? Ano je to pravda, jenom to není ve Springu, ale ve Spring MVC a není to chyba, ale vlastnost.
Jde o to, že Spring MVC napojuje (binduje) hodnoty v HTML formulářích na beany. Pokud mám ve formuláři políčko se jménem name a v beaně pole se stejným jménem, Spring MVC mi automaticky nastaví hodnotu v beaně podle hodnoty ve formuláři. A to je ta chyba. Může se totiž stát, že mám v beaně jinou sadu polí než v HTML formuláři. Útočník teoreticky může v dotazu poslat hodnotu pole, které nebylo ve formuláři, a které tudíž ani nečekám. Prostě a jednoduše mi pošle jeden parametr dotazu (request parameter) navíc. Pokud správně trefí jméno, Spring nastaví hodnotu pole beany, u kterého to neočekávám. Takže teoreticky může změnit něco, co nechci aby se měnilo. To je závažná věc, a je dobré ji mít na paměti. Rozhodně bych to nechtěl zlehčovat. Musím se přiznat, že mi to až dodnes nedošlo.
Nicméně pokud to trochu přeformuluji, tak z toho plyne, že nemáme věřit ničemu, co nám přichází od uživatele. To rozhodně není žádná novinka. Jenom na to často zapomínáme. Uvedený problém má ve Spring MVC jednoduché řešení. Prostě mu řekneme, jaká pole má napojovat.
Samozřejmě to není jenom problém Spring MVC, stejný problém budou mít všechny podobně fungující frameworky (možná kromě JSF). Když mi přijde HTTP dotaz, tak nevím, která políčka byla v HTML formuláři. On tam konec konců ani žádný HTML formulář být nemusel. Dotaz mohl být klidně vygenerovaný nějakou aplikací. Jediné co mohu udělat, je explicitně určit, která pole se mají nastavovat. To Spring MVC umožňuje, jenom to skoro nikdo nepoužívá.
Takže abych to shrnul. Ve Springu bezpečnostní chyba není (alespoň co je mi známo). Chyba ale může vzniknout při jeho neopatrném používání. Doufám že se zítra nedočtu, že je závažná chyba v Oraclu. Doslechl jsem se, že umožňuje zavolat DROP SCHEMA a to může mít závažné následky na integritu dat.

5 Responses to “Závažná bezpečnostní chyba ve Springu odhalena!”

  1. mnagas Says:

    clanek jsem dneska na serverside cetl a podle diskuse dole nejsme asi jediny dva, kterym se oznaceni "critical securiry issue" nepozdava. 🙂

  2. Honza Novotný Says:

    Taky bych řekl, že jediný problém je v neznalosti metody setDisallowedFields(...).

    U ostatních frameworků je to tak trochu diskutabilní. Nebezpečné to bylo až donedávna u Stripesů, nicméně po zavedení anotací @AllowBinding a @DenyBinding už je to opět jen na erudovanosti programátora.

    Strutsy vás nutily vytvořit si speciální třídu (extends ActionForm) pro webovou vrstvu, a měli jste dvě volby

    - buď duplikovat property ve dvou objektech (jedenkrát v ActionForm a podruhé v interním POJO)
    - nebo POJO prsknout jako nested beanu do ActionForm a ouha, už máte "security issue"

    No prostě bych řekl, že se současnou úrovní frameworků je obvykle chyba spíš na straně programátora a jeho neznalosti než ve frameworku samém.

  3. benzin Says:

    Ale vzdyt binding si dela kazdy sam. In metoda initBinding tam je, takze nevim co kdo sili. Comandy, ktere jsou publikovane na webovou vrstvu, slouzi stejne jenom jako prenoska dat (ano muze tam byt i logika, nicmene je to hlavne prenoska na data), nechci-li po nekom aby mi nejake data daval, tak mu na to nebudu davat prenosku.

    To jako by nekdo rekl, ze z requestu getProperty je bezpecnostni chyb, protoze mi v tom muze kdokoli cokoli poslat.

  4. Robert Novotny Says:

    Pokial viem, tak v Kosiciach sa _az_ take dramaticke veci nedeju 😉 Ale nie o tom som chcel.

    Urcite okolo toho netreba robit az taky ,,povyk" - pride mi to ako zo servera java.bleskovky.cz. Mam ale pocit, ze nie kazdy cital povodne oznamenie, ktore rozhodne nebolo take dramaticke.

    "We first discovered the vulnerabilities about four or five months ago," Berg said. "We found a posting from 2004 on a form that said if you're doing this, this could be a security issue. But there wasn't any follow up or good dialogue on how to fix this. There wasn't a lot of awareness."

    It's important to note, Berg said, that the vulnerabilities are not flaws in the framework. "The issue is developers not understanding the complexity of the framework they're using," he said.

    Cize dolezite je to, ze to treba zvyraznit v dokumentacii, lebo nie kazdy o tom moze vediet, resp. nie kazdy si to moze uvedomit.

  5. Oto 'tapik' Buchta Says:

    Tak Vám nevím, ale kdo používá beanu na získávání dat z formuláře přímým kopírováním A na držení nějakých jiných důležitých dat či parametrů, tak to u mne není programátor, ale bastlíř. Může se vám to nelíbit, můžete s tím nesouhlasit... ale to je tak asi všechno, co s tím můžete dělat.

    A opět jsme u oné přeframeworkovanosti. Spring MVC umožní něco udělat, dělá onu činnost dobře, ale člověkovi, který to používá, ani nedojde, že dělá prasárnu.