Hlavní navigace

Názor ke zprávičce Bezpečnostní díra v Java knihovně ohrožuje stovky aplikací od Andrei Badea - Máte pravdu, že popis exploitu je zmatečný. Exploit funguje...

  • 9. 11. 2015 15:38

    Andrei Badea (neregistrovaný) 193.29.76.---

    Máte pravdu, že popis exploitu je zmatečný.

    Exploit funguje tak, že zaserializuje instanci sun.reflect.an­notation.Anno­tationInvocati­onHandler. Tato třída je z hlediska exploitu zajímavá dvěma aspekty:

    * Má v sobě field java.util.Map memberValues, a
    * Implementuje readObject(), volá v něm defaultReadOb­ject(), a pak iteruje memberValues.en­trySet().

    Exploit místo té mapy zaserializuje instanci LazyMap z commons-collections, obalenou opět v dynamické proxy jejíž handler je opět AnnotationInvo­cationHandler. Zde se AIH používá je na to, že jeho metoda invoke() volá memberValues.get() -- tedy se tím zavolá LazyMap.get().

    LazyMap.get() vytváří prvky on-demand tak, že volá instanci Transformer. Exploit tam dává TransformerChain delegující na řetěz instancí InvocationTran­sformer. InvocationTran­sformer je klíčový pro exploit protože umí volat metody. Konkrétně, tento řetěz InvocationTran­sformerů volá Runtime.getRun­time().exec().

    Takže při deserializaci se přečte top-level AIH a vše co k němu patří, tedy až po řetěz InvocationTran­sformerů, a pak se zavolá AIH.readObject(), to zavolá LazyMap.get() a to zavolá transformery.

    InvocationTran­sformer je tedy klíčový protože kvůli němu neplatí, že deserialzujete jen data. Svým způsobem deserializujete kód.