Invoquer des fonctions JavaScript sans parenthèses : une technique obfuscation par pollution de prototypes
Sommaire
En bref
- Un développeur a découvert une méthode pour invoquer des fonctions JavaScript arbitraires sans utiliser de parenthèses, en exploitant Error.prepareStackTrace et la pollution des prototypes.
- La technique repose sur trois couches : générer une fonction via le constructeur Function, convertir un tableau en chaîne valide (via Object.prototype.message), et invoquer le résultat avec valueOf.
- Cette approche ne fonctionne que sur V8 (Chrome, Node.js), pas sur Firefox, car prepareStackTrace est une API optionnelle.
- Le fil HN soulève surtout des questions sur l'intérêt de telles techniques : démo de langage, obfuscation, ou simple curiosité académique.
Ce que dit la source
L'auteur présente une technique pour contourner la syntaxe d'invocation de fonction standard en JavaScript. La charge utile exploite Error.prepareStackTrace (une méthode V8 qui formate les traces de pile) comme constructeur de fonction, combine la pollution de prototypes pour contrôler la conversion d'un tableau en chaîne, et utilise valueOf pour exécuter le résultat sans parenthèses syntaxiques explicites. Le payload démontré est un simple alert(1337) minifié.
- La technique combine trois mécanismes : Error.prepareStackTrace comme générateur de fonction, la pollution d'Object.prototype.message pour contrôler Array.prototype.toString, et valueOf pour invoquer le résultat
- L'approche ne produit pas du code syntaxiquement valide (les parenthèses en hex \x28 et \x29 demeurent présentes dans la charge), simplement encodées plutôt qu'écrites littéralement
- Firefox n'est pas affecté : Error.prepareStackTrace est une API optionnelle du moteur V8, non standard et absente de SpiderMonkey
- Un commentateur TC39 note que les Symbols (isConcatSpreadable, iterator) offrent d'autres voies pour appeler des fonctions sans syntaxe parenthésée habituelle
- L'intérêt pratique reste flou : la démonstration fonctionne, mais pas plus efficace ou lisible qu'une invocation standard
Dans les commentaires
Débat limité, surtout des observations : la technique fascine comme curiosité de langage, mais peu s'aventurent à en défendre l'utilité. Un commentateur rapide conteste même que les parenthèses soient vraiment absentes (elles sont encodées, pas supprimées). La majorité perçoit cela comme un exercice académique ou une matière première d'obfuscation, sans conviction sur l'avenir de la technique.
- Plusieurs commentateurs questionnent le caractère "sans parenthèses" quand les parenthèses restent présentes encodées en hex (\x28, \x29), simplement cachées.
- Un membre TC39 mentionne que d'autres Symbols (iterator, isConcatSpreadable) offrent déjà des chemins d'exécution sans parenthèses syntaxiques, réduisant la nouveauté.
- Firefox est immunisé naturellement : Error.prepareStackTrace n'existe que sur V8, ramenant le scope du problème à Chrome et Node.js.
- Le fil reconnaît largement que la technique relève plus de la curiosité langage que d'une amélioration pragmatique : peu de raison d'y recourir en production.
Notre lecture
Une démonstration ingénieuse de la flexibilité interne de JavaScript et des biais d'une spécification partiellement optionnelle (prepareStackTrace). Intéressant pour comprendre comment un moteur peut être contourné via ses APIs d'instrumentation et la mutation de prototypes, mais sans implication directe pour une équipe de développement : la technique ne rend rien plus facile, juste plus obscur. À suivre comme étude de cas en sécurité (obfuscation, injection) plutôt que comme progression du langage.