Máte pravdu, že popis exploitu je zmatečný.
Exploit funguje tak, že zaserializuje instanci sun.reflect.annotation.AnnotationInvocationHandler. 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 defaultReadObject(), a pak iteruje memberValues.entrySet().
Exploit místo té mapy zaserializuje instanci LazyMap z commons-collections, obalenou opět v dynamické proxy jejíž handler je opět AnnotationInvocationHandler. 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í InvocationTransformer. InvocationTransformer je klíčový pro exploit protože umí volat metody. Konkrétně, tento řetěz InvocationTransformerů volá Runtime.getRuntime().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 InvocationTransformerů, a pak se zavolá AIH.readObject(), to zavolá LazyMap.get() a to zavolá transformery.
InvocationTransformer je tedy klíčový protože kvůli němu neplatí, že deserialzujete jen data. Svým způsobem deserializujete kód.