Hlavní navigace

Názor ke zprávičce Bezpečnostní díra v Java knihovně ohrožuje stovky aplikací od Filip Jirsák - Díky za rozbor. Na tu třídu InvokerTransformer jsem se...

  • 9. 11. 2015 16:37

    Filip Jirsák

    Díky za rozbor.

    Na tu třídu InvokerTransformer jsem se díval, ale právě jsem zjistil, že je zneužitelná pouze při zavolání metody transform, pokud útočník může do té metody předat vhodný parametr. A jak se to stane, že se při deserializaci volá ta metoda, to jsem v tom popisu nikde nenašel.

    Podle mne je chyba v implementaci AIH.readObject(), protože to je to místo, kde se při deserializaci najednou místo načítání dat volá kód (i když je pravda, že metoda Map.get() volající kód místo toho, aby jen vrátila data z mapy, je ne příliš časté řešení – ale není to ani porušení kontraktu Map). LazyMap a InvokeTransformer je pak už jenom způsob, jak z volání kódu při deserializaci udělat volání toho správného kódu, který potřebuje útočník – a využívá to toho, že tyhle dvě třídy jsou v jedné docela používané knihovně, takže tam, kde má útočník k dispozici jednu z nich, bude mít i tu druhou.

    Pokud bych měl v aplikaci třeba implementaci mapy, která by jako klíč měla příkaz a vracela třeba návratový kód spuštění příkazu:

    (key) -> Runtime.getInstance().exec(key).waitFor()

    byla by přes AIH.readObject() zneužitelná ještě snáz.

    Akorát že případů jako AIH.readObject() mohou být stovky a podle mne není reálné všechny ošetřit (navíc jediné možné ošetření je, že AIH nebude serializovatelná). Jediné skutečné řešení je tam, kde může do serializovaných dat někdo zasáhnout, nepoužívat způsob serializace, ve kterém může útočník vnutit deserializaci instance libovolné třídy dostupné na classpath.