Le plus dur n'est pas la vulnérabilité. C'est la cible. Les deux obstacles qui arrêtent d'ordinaire ce type de bug sont déjà levés : la randomisation des adresses (ASLR) tombe grâce à la fuite mémoire, qui livre à l'attaquant de vraies adresses dans un cookie de réponse PHPSESSID ; et une fois la faille atteinte, la primitive est fiable.
Ce qui reste, c'est la précision propre à chaque cible. Un exploit fonctionnel est calé sur un build précis : les offsets exacts des symboles (par exemple zif_system etzvalptrdtor) et les « valeurs magiques » de heap grooming qui placent les données de l'attaquant là où le pointeur libéré ira les lire. Changez la version de PHP, la distribution, le compilateur, les extensions ou l'architecture CPU, et ces valeurs se décalent : la preuve de concept doit être réajustée. Certaines configurations ajoutent de la friction, surtout pour déclencher de façon fiable le dépassement mémoire, mais rien de tout cela n'est un mur.
La menace réaliste, ce sont donc des attaques ciblées, pas un exploit universel unique. Or les informations propres à chaque cible sont souvent servies à l'attaquant : une version de PHP dans une page d'erreur verbeuse, un en-tête X-Powered-By: PHP/8.x.y ou Server, un build reconnaissable. Une fois la version connue, faire correspondre les offsets devient mécanique : exactement le genre de tâche répétitive que l'automatisation rend bon marché.