La destination n'est pas toujours essentielle, ce qui est important c'est aussi le chemin pour y parvenir, après plusieurs jours de va-et-vient dans le canal de développement spécialement taillé pour Y2JB, Gezine annonce des avancées nettes : le garbage collector (GC) ne provoque plus de crashs majeurs — la primitive principale survit désormais à plusieurs cycles de GC.
Cependant des problèmes persistent : la chaîne de ROP reste instable et, en parallèle, l’équipe a observé que le GC « casse » la primitive dans certaines conditions — un point qu’ils explorent toujours. Il a deux jours Gezine confirmait en effet que GC ne permet pas en l'état actuel de garder les primitives.
Des tentatives variées ont été testées pour contourner le mouvement du GC :
- créer un fake object dans le heap libc pour empêcher le GC de le déplacer (création possible et se demande si la V8 ne restaure pas tous les registres requis).
- déplacer des pointeurs pour empêcher le GC d’intervenir, une piste jugée prometteuse, mais pas encore mise en oeuvre
Les réactions à ses avancées sont nombreuses (EchoStretch, zecoxao, D-Link Turtle), mais le problème est que le ROP reste instable, en retirant tout le code ROP, les crashs disparaissent – la cause est donc claire. Gezine soupçonne un problème de restauration de registres.
Malgré la fatigue, Gezine reste confiant : le GC est sous contrôle, ne reste plus qu’à stabiliser le ROP pour finaliser l’exploit, mais comme on le voit, c'est extrêmement technique, et ils sont peu nombreux ceux qui peuvent l'aider, Gezine n'utilise pas des méthodes de hashs, mais plutôt des accès à des fonctions.