Qu'est-ce que l'obfuscation de code et à quoi ça sert ?
Article publié le 14/02/2022, dernière mise à jour le 21/10/2024
Rendre des données secrètes, le chiffrement et le déchiffrement, font partie intégrante de l'histoire de l'informatique. Que ce soit pour des raisons de sécurité des données personnelles, des stratégies géopolitiques, industrielles et j'en passe...
Mais lorsque vous distribuez un logiciel, ou une application disponible sur le web, le code, qu'il soit compilé (logiciel) ou non (web), doit être exécutable par la machine cliente et ne doit donc pas être chiffré car il devient alors inutilisable.
L'alternative parfois choisie est donc de modifier suffisamment le code d'origine (de manière automatique ou manuel) afin que la lecture et la compréhension de ce dernier soit rendue beaucoup plus difficile pour un utilisateur malveillant, c'est ce que l'on appelle l'obfuscation (brouillage en français).
Cette technique est-elle réellement efficace, et quelles sont ces différentes utilisations, c'est ce que nous allons voir dans la suite de cet article !
3 types d'obfuscation de code
Optimisation
L'obfuscation n'est pas toujours une volonté directe, mais parfois une conséquence, notamment dans le monde du front-end web. Afin d'optimiser le temps de chargement des sites et applications web, il est recommandé d'utiliser des outils dit de "minification".
Lors de la minification, tous les caractères inutiles sont supprimés, les noms de variables et de fonctions sont raccourcis au maximum, donnant un code beaucoup moins lisible, mais plus optimisé pour le chargement.
Si vous voulez en savoir plus sur la minification, je vous conseille de lire notre article qui y est consacré : https://code-garage.fr/blog/pourquoi-et-comment-minifier-son-code-avec-parcel/
Artistique
Le code, est un art. J'espère que cette affirmation a fait son chemin et n'est plus à démontrer, mais il existe des compétition d'obfuscation de code, afin de faire ressortir d'avantage le côté artistique de la programmation.
C'est notamment le cas de l'IOCCC pour "International Obfuscation C Code Contest", une compétition composée de plusieurs thématiques, mais tournant toujours autour de l'obfuscation.
L'objectif est de produire un code C fonctionnel, mais avec des contraintes de tailles, formes, artistiques, etc...
Voici un exemple très parlant, d'un code sous la forme d'un donut (à droite), qui à l'exécution produit une animation ascii d'un donut en rotation (à gauche).
Si l'explication vous intéresse, c'est ici : https://www.a1k0n.net/2011/07/20/donut-math.html
Sécurité
La raison la plus évidente, est la tentative de brouiller un code source (et ou le code compilé) afin d'empêcher d'autres développeurs et développeuses d'en comprendre les secrets, de le réutiliser ou de le modifier.
Ce type d'obfuscation peut par exemple consister en :
- Changement de noms de variables/fonctions
- Ajouts de modules/fonctions/variables inutiles
- Chiffrement/Déchiffrement de modules et chargement à la volée
- Ajout de milliers de commentaires, de saut de lignes, tabulations, etc...
On peut par exemple citer l'initiative JSFuck, qui donne une belle représentation d'obfuscation :
alert(1);
Devient en JSFuck (et est interprétable par un interpréteur Javascript classique) :
[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((!![]+[])[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+([][[]]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+[![]]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+(+(!+[]+!+[]+!+[]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([]+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]][([][[]]+[])[+!+[]]+(![]+[])[+!+[]]+((+[])[([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]+[])[+!+[]+[+!+[]]]+(!![]+[])[!+[]+!+[]+!+[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]])+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]])()((![]+[])[+!+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[+!+[]]+(!![]+[])[+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[+!+[]]]+[+!+[]])
Si vous voulez comprendre comment celà fonctionne : https://github.com/aemkei/jsfuck
Est-ce vraiment utile ?
Pour la minification et le côté artistique, la question ne se pose pas trop, mais côté sécurité, y'a-t'il des bénéfices à "obscurcir" son code ?
Et bien pas vraiment, en tout cas ce n'est pas une sécurité sur laquelle il faut baser sa stratégie. Cela peut ralentir les "attaques" ou décourager les moins persévérants ou talentueux, mais tant que votre code se retrouve sur la machine de quelqu'un, il pourra toujours être utilisé, ou détourné.
Aucun commentaire pour l'instant