Qu’est-ce que l’obfuscation ?
On octobre 25, 2021 by adminQu’est-ce que l’obfuscation de code ?
L’obfuscation de code est le processus de modification d’un exécutable afin qu’il ne soit plus utile à un pirate mais reste pleinement fonctionnel. Si le processus peut modifier les instructions réelles de la méthode ou les métadonnées, il ne modifie pas la sortie du programme. Pour être clair, avec suffisamment de temps et d’efforts, presque tous les codes peuvent faire l’objet d’une ingénierie inverse. Cependant, sur certaines plates-formes telles que Java, Android, iOS ou .NET (par exemple Xamarin, C#, VB.NET, F#), des décompilateurs gratuits peuvent facilement effectuer une rétro-ingénierie du code source d’un exécutable ou d’une bibliothèque en un temps record et sans effort. L’obfuscation automatisée du code rend la rétro-ingénierie d’un programme difficile et économiquement irréalisable.
Pourquoi utiliser un obfuscateur de code ?
En rendant une application beaucoup plus difficile à rétro-ingénier, vous pouvez vous protéger contre le vol de secrets commerciaux (propriété intellectuelle), les accès non autorisés, le contournement des licences ou d’autres contrôles, et la découverte de vulnérabilités.
Comment fonctionne l’obfuscation ?
L’obfuscation de code consiste en de nombreuses techniques différentes qui peuvent se compléter pour créer une défense en couches. Elle est plus efficace pour les langages qui créent une certaine forme d’instructions de niveau intermédiaire comme Java ou les langages .NET comme C#, VB.NET, Managed C++, F#, etc. Voici quelques exemples typiques d’obfuscation et de techniques de sécurité des applications :
Renommer l’obfuscation
Le renommage modifie le nom des méthodes et des variables. Il rend la source décompilée plus difficile à comprendre pour un humain mais ne modifie pas l’exécution du programme. Les nouveaux noms peuvent utiliser différents schémas comme « a », « b », « c », ou des chiffres, des caractères non imprimables ou des caractères invisibles. Et les noms peuvent être surchargés tant qu’ils ont une portée différente. L’obfuscation des noms est une transformation de base utilisée par la plupart des obfuscateurs .NET (C#, etc.), iOS, Java et Android.
String Encryption
Dans un exécutable géré, toutes les chaînes de caractères sont clairement découvrables et lisibles. Même lorsque les méthodes et les variables sont renommées, les chaînes peuvent être utilisées pour localiser les sections de code critiques en recherchant les références de chaînes à l’intérieur du binaire. Cela inclut les messages (notamment les messages d’erreur) qui sont affichés à l’utilisateur. Pour fournir une barrière efficace contre ce type d’attaque, le cryptage des chaînes de caractères cache les chaînes dans l’exécutable et ne rétablit leur valeur originale qu’en cas de besoin. Le décryptage des chaînes de caractères au moment de l’exécution entraîne généralement une légère pénalité de performance au moment de l’exécution.
Control Flow Obfuscation
L’obfuscation du flux de contrôle synthétise des constructions conditionnelles, de branchement et itératives qui produisent une logique exécutable valide, mais donnent des résultats sémantiques non déterministes lorsqu’elles sont décompilées. Plus simplement, le code décompilé ressemble à de la logique spaghetti, ce qui est très difficile à comprendre pour un pirate. Ces techniques peuvent affecter les performances d’exécution d’une méthode.
Instruction Pattern Transformation
Convertit les instructions communes créées par le compilateur en d’autres constructions moins évidentes. Il s’agit d’instructions parfaitement légales en langage machine qui peuvent ne pas correspondre proprement à des langages de haut niveau tels que Java ou C#. Un exemple est la mise en cache transitoire des variables qui exploite la nature basée sur la pile des runtimes Java et .NET.
Insertion de code fictif
Insertion de code dans l’exécutable qui n’affecte pas la logique du programme, mais qui casse les décompilateurs ou rend le code de rétro-ingénierie beaucoup plus difficile à analyser.
Suppression du code inutilisé et des métadonnées
Suppression des informations de débogage, des métadonnées non essentielles et du code utilisé des applications pour les rendre plus petites et réduire les informations disponibles pour un attaquant. Cette procédure peut améliorer légèrement les performances d’exécution.
Liaison/fusion binaire
Cette transformation combine plusieurs exécutables/bibliothèques d’entrée en un ou plusieurs binaires de sortie. La liaison peut être utilisée pour rendre votre application plus petite, en particulier lorsqu’elle est utilisée avec le renommage et l’élagage, Elle peut simplifier les scénarios de déploiement et elle peut réduire les informations disponibles pour les pirates.
Insertion de prédicats opaques
Obfusque en ajoutant des branches conditionnelles qui s’évaluent toujours à des résultats connus-résultats qui ne peuvent pas facilement être déterminés via une analyse statique. C’est une façon d’introduire du code potentiellement incorrect qui ne sera jamais réellement exécuté, mais qui est déroutant pour les attaquants qui essaient de comprendre la sortie décompilée.
Anti-Tamper
Un obfuscateur peut injecter une autoprotection de l’application dans votre code pour vérifier que votre application n’a pas été altérée de quelque façon que ce soit. Si une altération est détectée, il peut arrêter l’application, limiter les fonctionnalités, invoquer des plantages aléatoires (pour déguiser la raison du plantage), ou effectuer toute autre action personnalisée. Il peut également envoyer un message à un service pour fournir des détails sur la falsification détectée.
Anti-Debug
Lorsqu’un pirate tente de pirater ou de contrefaire votre application, de voler vos données ou de modifier le comportement d’une pièce critique du logiciel d’infrastructure, il commencera presque certainement par faire de la rétro-ingénierie et parcourir votre application avec un débogueur. Un obfuscateur peut ajouter une couche d’autoprotection de l’application en injectant du code pour détecter si votre application de production s’exécute dans un débogueur. Si un débogueur est utilisé, il peut corrompre des données sensibles (pour les protéger contre le vol), provoquer des plantages aléatoires (pour dissimuler que le plantage est le résultat d’une vérification de débogage) ou effectuer toute autre action personnalisée. Il pourrait également envoyer un message à un service pour fournir un signal d’avertissement.
Dois-je obfusquer mon application ?
Envisagez fortement d’utiliser l’obfuscation et l’autoprotection de l’application d’exécution si vous publiez un logiciel qui s’exécute dans un environnement non fiable et qui possède une propriété intellectuelle, donne accès à des informations sensibles ou possède une fonctionnalité gated. L’obfuscation rend beaucoup plus difficile l’examen du code et l’analyse de l’application par les attaquants. Elle complique également le débogage et l’altération de votre application par les pirates. L’objectif final est d’ajouter une couche de protection pour rendre difficile l’extraction ou la découverte d’informations utiles, telles que des secrets commerciaux (IP), des informations d’identification ou des vulnérabilités de sécurité d’une application. Il devrait également rendre plus difficile la modification de la logique de l’application ou le reconditionnement d’une application avec du code malveillant.
Laisser un commentaire