FR3096803A1 - Procédé mis en œuvre par ordinateur pour obscurcir un code de programme - Google Patents

Procédé mis en œuvre par ordinateur pour obscurcir un code de programme Download PDF

Info

Publication number
FR3096803A1
FR3096803A1 FR2005567A FR2005567A FR3096803A1 FR 3096803 A1 FR3096803 A1 FR 3096803A1 FR 2005567 A FR2005567 A FR 2005567A FR 2005567 A FR2005567 A FR 2005567A FR 3096803 A1 FR3096803 A1 FR 3096803A1
Authority
FR
France
Prior art keywords
computer
variable
program
instruction
program code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
FR2005567A
Other languages
English (en)
Other versions
FR3096803B1 (fr
Inventor
Sébastien Bardin
Mathilde OLLIVIER
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Commissariat a lEnergie Atomique et aux Energies Alternatives CEA
Original Assignee
Commissariat a lEnergie Atomique CEA
Commissariat a lEnergie Atomique et aux Energies Alternatives CEA
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Commissariat a lEnergie Atomique CEA, Commissariat a lEnergie Atomique et aux Energies Alternatives CEA filed Critical Commissariat a lEnergie Atomique CEA
Publication of FR3096803A1 publication Critical patent/FR3096803A1/fr
Application granted granted Critical
Publication of FR3096803B1 publication Critical patent/FR3096803B1/fr
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Executing Machine-Instructions (AREA)

Abstract

La présente invention concerne un procédé mis en œuvre par ordinateur pour obscurcir un code de programme, comprenant les étapes suivantes : - sélectionner (101), dans le code de programme, au moins une instruction d'affectation de variable affectant une valeur de variable d'entrée à une variable de sortie, - remplacer (102) chaque instruction d'affectation de variable sélectionnée par un jeu d'instructions obscurci qui est fonctionnellement équivalent et qui crée autant de nouveaux chemins qu'il y a de valeurs de variables d'entrée. Figure 1

Description

Procédé mis en œuvre par ordinateur pour obscurcir un code de programme
Domaine d'application
La présente invention concerne le domaine de la protection de codes de programme et plus particulièrement concerne un procédé et un programme informatique pour obscurcir un code de programme d'origine.
Problème général à résoudre
Les actifs de propriété tels que des algorithmes, des clés cryptographiques, des identifiants privés ou des données confidentielles sont de plus en plus menacés par des attaques d'ingénierie inverse. L'invention concerne des procédés pour protéger des codes de programme contre de telles attaques. La protection des codes, aussi connue sous le nom d'obscurcissement, a pour but d'empêcher de telles attaques man-at-the-end, dans lesquelles les attaquants ont un contrôle total sur le code exécutable et son environnement. De nombreuses protections et attaques ont été proposées et utilisées au cours des dernières dizaines d'années. L'obscurcissement est un procédé pour protéger un code de programme contre des attaques, qui consiste à transformer un code source ou machine en un code obscurci qui est difficile à comprendre par des humains. Toutefois, une nouvelle classe d'attaques, appelée analyse sémantique, s'est récemment avérée efficace contre des procédés d'obscurcissement courants. La présente invention concerne un nouveau procédé d'obscurcissement de code de programme qui est plus résistant aux attaques par analyse sémantique.
Art antérieur
Un procédé d'obscurcissement a pour but de dissimuler le comportement d'un programme ou de protéger des informations personnelles telles que des algorithmes ou des clés cryptographiques en transformant le programme à protéger P en un programme P' de telle sorte que P et P' soient équivalents du point de vue sémantique. Autrement dit, P et P' doivent calculer la même fonction mais P' est plus difficile à comprendre. Une autre propriété importante est que P' est approximativement aussi efficace que P.
L'art antérieur comprend plusieurs techniques d'obscurcissement pratiques.
Une première technique d'obscurcissement est appelée « technique d'arithmétique booléenne mixte ». Un exemple d'une telle technique est divulgué dans la référence [1]. Ce procédé a pour but de transformer une expression arithmétique et/ou booléenne en une expression équivalente mais plus compliquée formée à partir d'une combinaison d'opérandes booléens et arithmétiques, dans le but d'être plus complexe à comprendre.
D'autres techniques d'obscurcissement appelées techniques de « virtualisation » et « d'aplatissement » transforment le flux de commande en une boucle d'interprétation envoyant chaque instruction. Les procédés de « virtualisation » ajoutent également un interprète machine virtuel pour un programme de bytecode personnalisé codant la sémantique de programme d'origine. Par conséquent, le flux de commande visible du programme protégé est très éloigné du flux de commande d'origine.
D'autres techniques d'obscurcissement désignées par techniques à « code auto-modifiable » et de « packing » insèrent des instructions qui modifient de manière dynamique le flux des instructions exécutées.
D'autres techniques sont basées sur la divergence de chemins, comme par exemple celles décrites dans les références [2] et [3].
Une autre technique divulguée dans la référence [4], introduit un diviseur de gamme et des protections par commutateur qui présentent l'inconvénient de n'être ni maniables ni puissantes.
Finalement, la référence [5] définit des protections basées sur des conjectures mathématiques, introduisant des boucles dont la terminaison et les effets sont difficiles à prédire en général mais sont connus en pratique pour n'importe quelle valeur raisonnable des paramètres.
Les plus courantes classes d'attaques contre des programmes sont appellées analyse statique et analyse dynamique. Une analyse statique, telle qu'un désassemblage, a pour but d'analyser le code binaire lui-même pour comprendre ou extraire des informations pertinentes. Une analyse dynamique exécute ou simule une exécution pour surveiller concrètement le comportement du programme. Ces deux approches sont facilement vaincues par des procédés d'obscurcissement courants.
Limites de l'art antérieur
Bien que les procédés d'obscurcissement courants puissent vaincre les classes d'attaques courantes, ils sont moins efficaces contre des attaques plus élaborées telles que l'analyse sémantique.
La sémantique dans la programmation informatique peut être comprise comme étant la signification d'un programme. Les attaques sémantiques ont pour but d'analyser la sémantique d'un programme pour explorer ou simplifier plus efficacement un programme. Un tel raisonnement sémantique peut, par exemple, considérer des expressions qui sont exécutées sous forme de formules pour évaluer la faisabilité ou la non-faisabilité du chemin d'un programme.
Contrairement à l'analyse standard statique ou dynamique, les outils sémantiques sont robustes. L'analyse sémantique dépend de la signification d'un code qui est invariante dans tous les schémas de compilation et l'obscurcissement, et non de sa syntaxe qui est très volatile et facile à modifier.
Les outils sémantiques sont également capables de découvrir des chemins peu probables dans un code de programme. De nombreuses analyses sémantiques peuvent raisonner sur des jeux infinis de données entrées en une seule étape.
La plupart des analyses sémantiques courantes sont des analyses de teintes qui suivent la progression d'entrées à travers l'exécution d'un programme, des interprétations abstraites, qui rassemblent des informations sémantiques d'un programme par raisonnement statique (sans exécution), et finalement des exécutions symboliques dynamiques, Dynamic Symbolic Execution (DSE), qui considèrent des entrées sous forme de variables symboliques. La DSE est actuellement probablement l'attaque sémantique la plus puissante.
L'exécution symbolique dynamique simule l'exécution d'un programme le long de ses chemins, en générant systématiquement des entrées pour chaque nouvelle condition de branchement découverte. Ce processus d'exploration considère des entrées sous forme de « variables symboliques » dont les valeurs ne sont pas fixes. Le moteur d'exécution symbolique suit un chemin et chaque fois qu'il rencontre une déclaration conditionnelle impliquant l'entrée, une contrainte est ajoutée à la « valeur symbolique » associée à cette entrée. La résolution de ces contraintes de manière automatique (typiquement avec des solveurs de contraintes en vente libre) permet alors de générer de nouvelles valeurs d'entrée conduisant à de nouveaux chemins, en couvrant progressivement tous les chemins du programme jusqu'à une limite définie par un utilisateur. Cette technique a connu un fort renouvellement d'intérêt au cours des dix dernières années, devenant une technique de recherche de bugs prédominante.
Lorsque le moteur symbolique ne peut pas parfaitement traiter certaines constructions du langage de programmation sous-jacent, typiquement des appels de systèmes ou une auto-modification, le raisonnement symbolique est imbriqué avec une analyse dynamique permettant des approximations judicieuses. Typiquement, des valeurs concrètes de temps d'exécution sont utilisées pour compléter la partie manquante des contraintes de chemin, lesquelles sont ensuite envoyées au solveur par concrétisation. Cette solution rend l'approche particulièrement robuste vis-à-vis de constructions compliquées se retrouvant dans les codes binaires obscurcis, typiquement par packing ou auto-modification, ce qui fait de l'exécution symbolique dynamique un bon candidat pour le désobscurcissement automatisé. Elle est en particulier robuste en tant qu'analyse dynamique avec la capacité supplémentaire de trouver des conditions basées sur déclencheur.
Au vu de ce qui précède, il existe le besoin d'un nouveau procédé d'obscurcissement qui soit plus résistant aux attaques par analyse sémantique, en particulier à l'exécution symbolique dynamique. De nouveaux procédés de protection doivent être conçus pour résister à l'analyse automatisée avancée tout en étant efficaces en termes de durée en n'occasionnant pas de délais d'exécution élevés. De plus, les protections ne doivent pas considérablement augmenter la taille du code d'origine non protégé.
Brève description de la solutio n
L'invention fournit une solution qui est capable de résister à une analyse sémantique, en particulier à des attaques par exécution symbolique dynamique. L'invention revendiquée est conçue pour être suffisamment solide pour rendre l'analyse basée sur la sémantique automatisée insurmontable. La solution proposée inclut en outre de faibles dépassements en termes de taille de codes et de performances d'exécution et sa conception est discrète.
Les procédés de protection existants repoussant les attaques par analyse sémantique sont la plupart du temps basés sur des contraintes de difficulté de résolution et ils impliquent souvent un compromis en termes de discrétion ou de délais d'exécution.
L'invention fournit une solution qui est basée sur l'explosion des chemins. Un objectif de l'invention est d'augmenter considérablement le nombre de chemins dans un programme, dans une proportion telle que le temps nécessaire pour explorer le code de programme devienne prohibitif.
L'invention utilise un flux de tâches pour de telles protections basées sur les chemins, constitué d'un générateur de point de branchement et d'une politique d'ancrage pour sélectionner des positions optimales dans le code de programme pour générer un point de branchement.
Un point de branchement est un jeu d'instructions obscurci devant être inséré dans le code de programme afin d'augmenter le nombre de chemins. L'invention propose des points de branchement particuliers qui créent autant de nouveaux chemins qu'il y a de valeurs de variables.
Selon un mode de réalisation de l'invention, de bonnes politiques d'ancrage sont introduites pour identifier des ancrages indépendants et des variables pertinentes afin de sélectionner les positions les plus appropriées dans le code de programme pour l'insertion de points de branchement.
Invention s'applique également à n'importe quel niveau de description de code : code source, bytecode ou code binaire. Elle s'applique également à des langages de description de matériel (par exemple le langage VHDL) ou à des modèles (par exemple le langage de modélisation unifié, Unified Modeling Language, UML) tant qu'ils contiennent des constructions reflétant des affectations de variables.
De manière correspondante, un aspect de l'invention consiste à fournir un procédé mis en œuvre par ordinateur pour obscurcir un code de programme, comprenant les étapes suivantes :
  • sélectionner, dans le code de programme, au moins une instruction d'affectation de variable affectant une valeur de variable d'entrée à une variable de sortie,
  • remplacer chaque instruction d'affectation de variable sélectionnée par un jeu d'instructions obscurci qui est fonctionnellement équivalent et qui crée autant de nouveaux chemins qu'il y a de valeurs de variables d'entrée.
Selon un mode de réalisation de l'invention, l'étape consistant à sélectionner au moins une instruction d'affectation de variable comprend l'identification d'au moins une instruction d'affectation de variable dans le code de programme.
Selon un mode de réalisation de l'invention, l'étape consistant à sélectionner au moins une instruction d'affectation de variable comprend la création, dans le code de programme, d'une instruction d'affectation de variable n'ayant aucune influence sur l'exécution du programme.
Selon un mode de réalisation de l'invention, le jeu d'instructions obscurci comprend au moins une boucle FOR contrôlée par la variable d'entrée via un opérateur incrémentiel.
Selon un mode de réalisation de l'invention, le jeu d'instructions obscurci comprend plusieurs boucles FOR en chaîne via un opérateur incrémentiel, chacune étant contrôlée par un octet de la variable d'entrée.
Selon un mode de réalisation de l'invention, le jeu d'instructions obscurci comprend une première instruction et une deuxième instruction exécutées séquentiellement, la deuxième instruction affectant une valeur constante donnée à la variable de sortie et la première instruction écrivant la valeur de variable d'entrée dans une adresse décalée de la valeur constante.
Selon un mode de réalisation de l'invention, le procédé comprend l'étape consistant à sélectionner, dans le code de programme, plusieurs instructions d'affectation de variables, chacune appartenant à un chemin indépendant associé à une valeur d'entrée distincte du code de programme.
Selon un mode de réalisation de l'invention, le procédé comprend l'étape consistant à sélectionner, dans le code de programme, au moins une instruction d'affectation de variable, la variable ayant une chaîne définition-utilisation avec à la fois une variable d'entrée du code de programme et une variable de sortie du code de programme.
Un autre aspect de l'invention consiste à fournir un produit de programme informatique, le produit de programme informatique comprenant un support de stockage lisible par ordinateur dans lequel sont incorporées des instructions exécutables par ordinateur, les instructions exécutables par ordinateur étant exécutables par un processeur pour amener le processeur à mettre en œuvre les étapes du procédé selon n'importe quel mode de réalisation de l'invention.
Encore un autre aspect de l'invention consiste à fournir un système informatique comprenant :
  • une mémoire ayant des instructions exécutables par ordinateur et un programme dynamique d'une application ; et
  • un processeur pour exécuter les instructions exécutables par ordinateur, l'exécution des instructions exécutables par ordinateur amenant le processeur à exécuter les étapes selon n'importe quel mode de réalisation de l'invention.
Description détaillée
Les éléments, caractéristiques et avantages ci-dessus ainsi que d'autres selon l'invention, seront mieux compris à la lecture de la description suivante plus spécifique de l'invention conjointement à l'examen des figures, dans lesquelles :
la figure 1 illustre un organigramme selon un mode de réalisation de la présente invention,
la figure 2 montre un premier exemple de programme de pseudo-code représentant un premier type de point de branchement selon un mode de réalisation de l'invention,
la figure 3 montre un second exemple de programme de pseudo-code représentant un premier type de point de branchement selon un mode de réalisation de l'invention,
la figure 4 montre un premier exemple de programme de pseudo-code représentant un deuxième type de point de branchement selon un mode de réalisation de l'invention,
la figure 5 montre un second exemple de programme de pseudo-code représentant un deuxième type de point de branchement selon un mode de réalisation de l'invention,
la figure 6 montre d'autres exemples de programmes de pseudo-code représentant d'autres types de points de branchement selon un mode de réalisation de l'invention,
la figure 7 montre un exemple d'un programme de pseudo-code illustrant une composition de points de branchement non optimale,
la figure 8 montre un diagramme-bloc d'un appareil selon un mode de réalisation de la présente invention.
Selon la figure 1, il est à présent décrit un organigramme correspondant à certains exemples de réalisation de la présente invention. L'organigramme de la figure 1 et les diagrammes-blocs dans la figure illustrent l'architecture, la fonctionnalité et le fonctionnement de mises en œuvre possibles de systèmes, procédés et produits de programmes informatiques selon divers modes de réalisation de la présente invention. À cet égard, chaque bloc dans l'organigramme ou les diagrammes-blocs peut représenter un module, une unité, un segment ou une portion d'instructions, comprenant une ou plusieurs instructions exécutables pour mettre en œuvre la ou les fonctions logiques spécifiées.
Le procédé selon la figure 1 vise à transformer un code de programme d'origine P en un code de programme obscurci P'. Autrement dit, le code de programme P' est modifié par l'insertion d'un jeu d'instructions qui ajoute plusieurs nouveaux chemins au programme. Ce procédé fournit une protection pour le code de programme d'origine P désignée par protection basée sur les chemins. Le code de programme modifié P' doit être fonctionnellement équivalent au code de programme d'origine P mais contenir beaucoup plus de chemins que P.
Le procédé selon la figure 1 comprend principalement deux étapes 101, 102. La première étape 101 consiste à sélectionner un emplacement dans le code de programme P qui est approprié sur la base d'une politique d'ancrage. La deuxième étape 101 consiste à introduire, à l'emplacement sélectionné, un jeu d'instructions qui créent de nouveaux chemins possibles dans le programme.
Le jeu d'instructions inséré à l'emplacement sélectionné est appelé point de branchement. Un point de branchement peut également être défini comme une condition de branchement dépendant d'une variable x à une adresse a dans le code et créant tout au plus γ nouveaux chemins possibles. Γ est appelée la capacité d'un point de branchement. Par exemple, une déclaration "Si" dans un code de programme a une capacité γ = 1 parce qu'elle ne crée qu'un seul chemin possible.
Un point de branchement est appliqué à une instruction d'affectation de variable dans le programme. Dans certains modes de réalisation, il est appliqué afin de remplacer une instruction d'affectation de variable avec un nouveau jeu d'instructions qui est fonctionnellement équivalent mais qui crée de nouveaux chemins possibles.
Dans certains autres modes de réalisation, un point de branchement est inséré à un emplacement dans le programme où aucune instruction d'affectation existante n'est présente. Dans ce cas, le nouveau jeu d'instructions qui est inséré est fonctionnellement équivalent à une affectation de variable qui ne modifie pas l'exécution du programme. Par exemple, une instruction d'affectation de variable z=x avec une variable z non utilisée dans le programme ne modifie pas l'exécution du programme.
Le code de programme obscurci P' est obtenu après l'insertion de plusieurs points de branchement dans le code de programme d'origine P, à différents emplacements.
Dans certains modes de réalisation de l'invention, les points de branchement sont introduits à des emplacements sélectionnés arbitrairement dans le programme.
Dans certains autres modes de réalisation de l'invention, les emplacements sont sélectionnés en fonction d'une politique d'ancrage particulière, comme cela sera expliqué ci-dessous.
L'invention propose de nouvelles classes de points de branchement.
Un premier type de point de branchement est exemplifié par des programmes de pseudo-code illustrés sur les figures 2 et 3. Il consiste à remplacer une instruction d'affectation par une ou plusieurs boucles FOR.
La figure 2 illustre, du côté gauche, un code de programme d'origine P comprenant une instruction d'affectationch=input;inputétant une variable dépendant de l'entrée etchétant une variable locale.
Selon un mode de réalisation de l'invention, le code de programme d'origine P est transformé en un code de programme obscurci P' illustré sur le côté droit de la figure 2. L'instruction d'affectation d'originech=inputest remplacée par une boucle FORch= 0, for (i=,i<=input, i++) ch++;
La boucle FOR peut être déroulée n fois, pour n'importe quelle valeur n que l'entrée (input )de variable peut adopter lors de l'exécution. De ce fait, une boucle FOR commandée par une variable définie sur une taille de bit S génère jusqu'à 2Schemins supplémentaires avec une longueur de chemins supplémentaires de 2Sau maximum. Autrement dit, la boucle FOR introduit un nouveau chemin pour chaque valeur possible de l'entréede variable.
Le point de branchement décrit du côté droit de la figure 2 ajoute un nombre significatif de chemins possibles au programme, ce qui le rend plus difficile à analyser pour des attaques par analyse sémantique. Parallèlement, il est fonctionnellement équivalent à l'affectation de variable du code d'origine. Toutefois, il présente l'inconvénient d'être insurmontable lorsque la taille de la variable d'entrée est importante (par exemple S = 32 ou S = 64). Un algorithme ou un programme réalisable doit pouvoir être exécuté suffisamment facilement pour être pertinent du point du pratique, typiquement en un temps polynomial par rapport à la taille de l'entrée. Autrement dit, le point de branchement de la figure 2 présente l'inconvénient d'être trop complexe pour être efficace parce qu'en dépit du fait qu'il fournit une bonne protection, il ajoute aussi une complexité considérable et une latence importante par comparaison avec l'exécution du programme P d'origine.
La figure 3 illustre, du côté droit, une autre mise en œuvre du point de branchement proposé. Selon ce mode de réalisation, la maniabilité (ou la complexité) du programme obscurci P' est améliorée par comparaison avec le procédé de la figure 2.
Pour obtenir cette propriété, plusieurs boucles FOR sont enchaînées sur chaque octet de la variable d'entrée. Par conséquent, les instructions de la boucle FOR sont limitées à des variables de la taille d'un octet et génèrent jusqu'à 28kchemins supplémentaires avec une longueur de chemins supplémentaires d'au moins 28. Le fait d'enchaîner k boucles FOR de ce type conduit jusqu'à 28kchemins supplémentaires avec une longueur supplémentaire de k.28au maximum. Dans l'exemple particulier de la figure 3, quatre boucles FOR sont enchaînées pour traiter une variable d'entrée codée sur 32 bits. Le nombre de nouveaux chemins possibles est toujours égal à 232, comme dans le cas de la figure 2, mais la complexité est limitée à 4x256 itérations de boucle au maximum par comparaison avec 232itérations de boucle au maximum dans le cas de la figure 2.
Un deuxième type de point de branchement est exemplifié par des programmes de pseudo-code illustrés dans les figures 4 et 5. Il consiste à remplacer une instruction d'affectation par des instructions d'auto-modification. Les figures 4 et 5 illustrent des exemples de programmes en langage assembleur.
Le programme d'origine P est illustré sur le côté gauche de la figure 4. Il consiste à nouveau en une instruction d'affectation a =inputqui est codée dans un langage assembleur avec l'instruction L illustrée sur la figure 4.
Sur le côté droit de la figure 4, est illustré le programme obscurci proposé P' selon un mode de réalisation de l'invention. L'instruction unique L est remplacée par deux instructions L1 et L2. La deuxième instruction L2 est une opération ne dépendant pas de l'entrée, a = k (k étant une valeur constante arbitraire qui est réglée pour être égale à 0 dans l'exemple de la figure 4). Au moment de l'exécution, l'exécution de la première instruction L1 déclenche le remplacement de la deuxième instruction L2 par a =input _ val,input _ valétant la valeur d'exécution deinput. Ceci est dû au fait que la valeur de décalageoffest choisie de manière appropriée.
La figure 5 illustre l'exécution du programme obscurci P’ de la figure 4.
À l'étape 1, la valeur d'entrée (égale à 100 dans l'exemple de la figure 5) est introduite dans l'entréede variable. À l'étape 2, l'instruction L1 est exécutée de sorte que la valeur d'entrée est déplacée à l'adresse de L2+off. Cette adresse correspond à l'adresse qui est utilisée par l'instruction L2 pour copier la valeur « 0 » sur la variable a. Par conséquent, à l'étape 2, la valeur « 0 » est remplacée parinput_val. À l'étape 3, l'instruction L2 est modifiée de telle sorte que « 0 » devienne « 100 » dans cette instruction. À l'étape 4, l'instruction L2 est exécutée pour déplacer la valeur « 100 » à la variable a.
Pour résumer, le déplacement de décalage au niveau de l'instruction L1 réécrit la constante 0 en L2 à la valeur contenue à l'adresse de l'entrée. Ce faisant, une version de code différente est exécutée pour chaque valeur de l'entrée, conduisant à autant de nouveaux chemins possibles qu'il y a de valeurs d'entrée possibles.
La figure 6 illustre des pseudo-codes illustrant d'autres mises en œuvre de points de branchement selon des modes de réalisation de l'invention.
Le premier pseudo-code 1) de la figure 6 est identique au point de branchement de la boucle FOR illustré à titre d'exemple sur les figures 2 et 3.
Les autres pseudo-codes 2)-5) illustrés sur la figure 6 illustrent d'autres mises en œuvre possibles de points de branchement. La caractéristique commune de toutes ces mises en œuvre est que pour chaque point de branchement, le jeu d'instructions obscurci qui est utilisé pour remplacer l'instruction d'affectation de variable d'origine, dans le programme d'origine, doit introduire un nouveau chemin possible pour chaque valeur possible de la variable. De plus, chaque mise en œuvre proposée est essentiellement équivalente à une instruction d'affectation.
L'utilisation de différents patterns pour mettre en œuvre le même jeu d'instructions obscurci permet de résister à des attaques de patterns, basées sur la récupération syntaxique de la protection.
Tous les points de branchement exemplifiés ci-dessus selon des modes de réalisation de l'invention sont solides vis-à-vis des attaques par analyse sémantique, parce qu'ils introduisent un nouveau chemin possible pour chaque valeur possible de l'entrée de variable. Tous les points de branchement sont également maniables.
Nous décrivons à présent des politiques d'ancrage qui définissent un emplacement particulier de points de branchement dans un code de programme afin d'obtenir une efficacité et une robustesse maximales.
Selon un premier mode de réalisation de l'invention, des points de branchement sont placés sur des chemins indépendants dans le programme. Autrement dit, des points de branchement sont introduits pour obscurcir des instructions d'affectation qui s'appliquent à des chemins indépendants dans le programme.
Le nombre de chemins ajoutés par un point de branchement dépend en fait de tous les points de branchement insérés préalablement. En effet, il peut arriver qu'un point de branchement préalablement introduit limite la solidité potentielle d'un point de branchement nouvellement introduit en rendant certains de ses chemins potentiellement introduits impraticables.
Un exemple de ce problème est illustré à la figure 7, lequel illustre un code de programme d'origine P et un code de programme obscurci P' dans lequel deux instructions "scission" ou "si" sont ajoutées. Ce faisant, on s'attend à ce que quatre nouveaux chemins soient ajoutés (deux nouveaux chemins pour chaque instruction si).
Toutefois, comme on peut le voir sur le pseudo-code P' sur la droite de la figure 7, seuls trois nouveaux chemins possibles sont introduits par cet obscurcissement. En effet, il y a seulement trois chemins possibles en fonction de la valeur des variables d'entrée. Un premier chemin est exécuté lorsque la valeur d'entrée est inférieure à 10, un deuxième chemin est exécuté lorsque la valeur d'entrée est comprise entre 10 et 100 et un troisième chemin est exécuté lorsque la valeur d'entrée est supérieure à 100. Le quatrième chemin est impraticable parce que la variable d'entrée ne peut pas être en même temps en dessous de 10 et au-dessus de 100.
L'exemple de la figure 7 illustre l'importance de s'assurer que les points de branchement insérés se combinent au lieu de se chevaucher. Pour éviter ce problème, selon un mode de réalisation de l'invention, il est proposé d'ajouter des points de branchement seulement sur des chemins indépendants du code de programme. Deux points de branchement sont indépendants lorsque le nombre de nouveaux chemins qu'ils créent se multiplient. L'ajout de k points de branchement indépendants de ce type fournit ainsi un nombre exponentiel, puissance k, de nouveaux chemins.
Afin de faire en sorte que deux points de branchement soient indépendants, ils sont appliqués à deux variables x et y de telle sorte que x et y dépendent seulement de jeux distincts de valeurs d'entrée.
Dans l'exemple de la figure 7, les deux instructions « si » sont appliquées à la variableresqui ne dépend pas de jeux distincts de la valeur d'entréevar.
Selon un mode de réalisation de l'invention, un premier moyen de déterminer des chemins indépendants dans un code de programme consiste à calculer statistiquement un ensemble d'emplacements dans les programmes à travers lesquels doit passer une trace. Un chemin est un jeu d'instructions exécuté par le programme. Un chemin dépend d'une entrée de variable s'il implique au moins une instruction exécutée sur cette entrée de variable.
Ces emplacements sont appelés emplacements « obligatoires ». Ils correspondent aux différents emplacements dans le programme du jeu d'instructions associé à un chemin dépendant d'une valeur d'entrée. La détermination des emplacements obligatoires dans un programme peut être effectuée avec une analyse graphique de flux de commandes. De tels emplacements incluent par exemple le point d'entrée du programme, ou le point de retour dans le cas de programmes avec un emplacement de sortie unique, ou n'importe quelle instruction à l'intérieur de la séquence d'instructions de niveau supérieur de la fonction principale. Ensuite, les différentes entrées du programme sont réparties parmi les emplacements sélectionnés afin de produire des ancrages indépendants.
En résumé, une première manière de sélectionner des emplacements indépendants pour introduire des points de branchement est obtenue en effectuant les étapes suivantes :
  • calculer l'ensemble de tous les emplacements obligatoires dans le programme P,
  • pour chaque entrée de variable i, choisir un emplacement obligatoire en fonction de i et insérer un point de branchement à cet emplacement.
Selon un mode de réalisation de l'invention, une deuxième manière de déterminer des chemins indépendants dans un code de programme consiste à appliquer une analyse d'indépendance comme suit.
Nous définissons une primitive d'analyse de rétro-dépendance statiquebackward-input (( l ,v),P)qui fournit en retour l'ensemble de tous les noms de variables d'entrée qui risquent d'affecter la valeur de la variablevau niveau de la ligne de codeldans le programmeP. Nous définissons aussi une fonctionindep((l ,v),I,P) indiquant si nous sommes sûrs qu'aucune variable d'entrée dans I ne peut affecter la valeur de (l,v) dans le programme P (retour “oui”) ou si nous ne le savons pas (retour “non”).
L’ensemble d'emplacements S auxquels des points de branchement peuvent être insérés est calculé comme suit.
Tout d'abord, l’ensemble de variables I et d'emplacements S sont initialisés pour vider les ensembles.
Ensuite, une boucle est effectuée via les étapes suivantes. Une paire (l,v) est choisie dans le code de programme, de telle sorte que l'on aitindep((l ,v),I,P)=”oui”. Si une telle paire est trouvée, elle est alors ajoutée à l'ensemble d'emplacements S et l'ensemble de variables d'entrée I est augmenté avec le résultat de la primitivebackward-input (( l ,v),P). Ensuite la boucle est itérée jusqu'à ce qu'aucune paire de ce type ne puisse plus être trouvée.
Le procédé ci-dessus permet de trouver des relations indépendantes entre chaque paire (l,v) et des variables d'entrée du programme.
Selon un premier mode de réalisation de l'invention, des points de branchement sont placés à des emplacements particuliers d'un programme afin d'éviter qu'ils ne soient découverts ou enlevés facilement.
Les attaques par découpage en tranches (slicing) ont pour but d'enlever des variables n'affectant pas la sortie d'un code de programme. Les attaques par analyse de teintes identifient les variables qui ne sont pas affectées par une entrée quelconque d'un code de programme.
Afin de résister à ces types d'attaque, les points de branchement devraient être placés à des emplacements du programme qui ne peuvent pas être enlevés sans modifier considérablement l'exécution du code de programme. Au contraire, un point de branchement placé sur une instruction qui n'affecte pas une sortie d'un code de programme peut être facilement enlevé et par conséquent, son efficacité contre les attaques est faible.
Selon un mode de réalisation de l'invention, un point de branchement est placé sur une variable ayant une chaîne définition-utilisation ayant à la fois une variable d'entrée et une variable de sortie du programme.
Une chaîne définition-utilisation, ou chaîne def-use, est un outil couramment utilisé par les compilateurs. Des données sont définies lorsque des variables sont des valeurs déclarées, initialisées, affectées, ou sont reçues sous forme de paramètres. Les données sont utilisées dans des expressions, des déclarations conditionnelles, un transfert de paramètres ou dans une déclaration de retour. Une chaîne def-use pour une variable est un chemin ou une séquence d'instructions reliant une définition de la variable à l'une de ses utilisations. Une chaîne def-use entre deux variables est une séquence de deux chemins def-use reliant les deux variables.
Nous donnons un exemple d'un chemin def-use et d'une chaîne def-use pour le pseudo-code suivant :
Entrée (a);
ligne 1 x:a+1;
ligne 2 d:=a+10;
ligne 3 y:=x+2;
ligne 4 z:=y+5;
L'instruction à la ligne 1 est une définition (def) de la variable x. L’instruction à la ligne 3 est une utilisation de la variable x. Par conséquent, la séquence d'instructions aux lignes 1, 2 et 3 est un chemin def-use pour la variable x. La séquence d’instructions aux lignes 1, 2, 3 et 4 est une chaîne def-use pour les variables x et y.
Nous définissons les variables pertinentes, dans un programme, comme étant des variables qui sont définies comme ayant à la fois une chaîne def-use avec une variable d'entrée et une chaîne def-use avec une variable de sortie d'un programme.
La mise en œuvre de points de branchement sur une variable pertinente rend la protection plus résistante à la fois aux attaques par slicing et par analyse de teintes.
Selon un mode de réalisation de l'invention, une première façon de déterminer les variables pertinentes dans un programme consiste à appliquer une analyse dynamique. L'analyse de teintes dynamique et le slicing sont des procédés bien connus dans le contexte de débogage de logiciels. Bien qu'elles ne soient pas complètes, ces techniques sont sous-approchées dans la mesure où elles calculent des chaînes def-use réelles observées lors de l'exécution. Une analyse dynamique selon un mode de réalisation de l'invention comprend les étapes suivantes : une première étape consiste à lancer un certain nombre d'exécutions concrètes d'un programme pour obtenir des traces d'exécution. Ensuite, une analyse dynamique standard est calculée pour obtenir des relations def-use le long des traces obtenues. Ceci peut être effectué en utilisant des procédés d'analyse de teintes dynamiques existants et/ou des procédés de découpage en tranches dynamiques. Un exemple d'une analyse de teintes dynamique est donné dans la référence [6]. Ensuite, un premier ensemble de toutes les variables affectées par une variable d'entrée dans l'information def-use dynamique est calculé. Ensuite, un deuxième ensemble de toutes les variables affectant une sortie du programme dans l'information def-use dynamique est calculé. Ensuite, les variables pertinentes sont choisies comme étant celles appartenant à la fois au premier et au deuxième ensemble de variables.
Selon un autre mode de réalisation de l'invention, les variables pertinentes sont définies en utilisant une analyse statique « basée sur l'obligation ». L'analyse statique standard pour calculer les chaînes def-use est basée sur la structure standard d'une « analyse basée sur les possibilités ». Autrement dit, elles capturent tous les faits vrais recherchés mais elles peuvent également produire des fausses réponses positives. Une analyse statique standard est basée sur un domaine abstrait basé sur un réseau. À la fin de la propagation du domaine, chaque variable est affectée d'une valeur abstraite qui peut prendre les quatre valeurs {T,oui,non,┴}. Oui signifie que la variable dépend définitivement d'une variable d'entrée, non signifie qu'elle ne dépend absolument pas d'une variable d'entrée, T signifie que l'on ne sait pas et ┴ signifie que le code est inaccessible. L'analyse statique standard est par exemple décrite dans la référence [7].
L'analyse standard « basée sur les possibilités » considère qu'il existe une dépendance lorsque la valeur abstraite est soit oui soit T. Une analyse statique « basée sur l'obligation » selon un mode de réalisation de l'invention est basée sur une analyse standard « basée sur les possibilités » qui est modifiée en considérant qu'une dépendance existe seulement lorsque la valeur abstraite est oui.
La figure 8 illustre un appareil 800 selon des exemples de modes de réalisation de l'invention divulguée. Dans certains exemples de modes de réalisation, l'appareil 800 peut être configuré pour effectuer un obscurcissement d'un programme 804 selon la présente invention. L'appareil 800 peut comprendre un ou plusieurs processeurs 801. Le processeur 801 peut être une unité de traitement centrale (CPU), un microprocesseur, un circuit électronique, un circuit intégré (IC) ou similaire. Le processeur 801 peut être utilisé pour effectuer des calculs requis par l'appareil 800 ou l'un quelconque de ses sous-composants. Dans certains exemples de modes de réalisation, l'appareil 800 peut comprendre un module d'entrée/sortie (I/O) 802. Le module I/O 802 peut être utilisé pour fournir une sortie et pour recevoir une entrée d'un utilisateur, d'un appareil informatisé ou d'un autre appareil similaire à l'appareil 800. Dans certains exemples de modes de réalisation, l'appareil 800 peut comprendre une mémoire 803. La mémoire 103 peut être un disque dur, un disque Flash, une mémoire vive (RAM), une puce de mémoire, ou un support de stockage similaire lisible par ordinateur. La mémoire 803 peut conserver des instructions exécutables par machine aptes à amener le processeur 801 à effectuer des actions associées à l'un quelconque des sous-composants de l'appareil 800.
Un protecteur de code 805 peut être configuré pour protéger un code de programme 804 en appliquant un obscurcissement selon un mode de réalisation quelconque de l'invention. Le protecteur de code 805 peut comprendre un sélecteur d'ancrage 806 et un additionneur de point de branchement 807.
Le sélecteur d'ancrage 806 peut effectuer la sélection d'un emplacement dans le code de programme 804 qui est le plus approprié pour appliquer l'obscurcissement selon une politique d'ancrage.
L'additionneur de point de branchement 807 peut être utilisé pour appliquer un obscurcissement d'un jeu d'instructions à un emplacement sélectionné du code de programme 804 qui est déterminé par le sélecteur d'ancrage 806.
Dans certains exemples de modes de réalisation, l'appareil 800 peut être configuré pour effectuer les étapes du procédé de la figure 1. La présente invention peut être un système, un procédé et/ou un produit de programme informatique. Le produit de programme informatique peut inclure un support (ou plusieurs supports) de mémoire lisible(s) par ordinateur ayant des instructions de programme lisibles par ordinateur pour amener un processeur à effectuer des aspects de la présente invention. Le support de stockage lisible par ordinateur peut être un dispositif physique qui peut retenir et mémoriser des instructions pour l'utilisation par un dispositif d'exécution d'instructions. Le support de stockage lisible par ordinateur peut par exemple, mais sans limitation, être un dispositif de stockage électronique, un dispositif de stockage magnétique, un dispositif de stockage optique, un dispositif de stockage électromagnétique, un dispositif de stockage à semi-conducteurs ou n'importe quelle combinaison appropriée des dispositifs précédents. Une liste non exhaustive d'exemples spécifiques supplémentaires du support de stockage lisible par ordinateur inclut les dispositifs suivants : une disquette d'ordinateur portatif, un disque dur, une mémoire vive (RAM), une mémoire morte (ROM), une mémoire morte reprogrammable (EPROM ou mémoire Flash), une mémoire vive statique (SRAM), un disque compact-mémoire à lecture seule (CDROM), un disque versatile numérique (DVD), une clé de mémoire, une disquette, un dispositif à codage mécanique tel que des cartes perforées ou des structures en relief dans une gorge sur laquelle sont enregistrées des instructions, et toute combinaison appropriée de ce qui précède. Un support de stockage lisible par ordinateur tel qu'utilisé ici ne doit pas être compris comme étant des signaux transitoires per se, comme des ondes radio ou d'autres ondes électromagnétiques se propageant librement, des ondes électromagnétiques se propageant à travers un guide d'onde ou d'autres supports de transmission (des impulsions de lumière passant à travers un câble à fibre optique), ou des signaux électriques transmis par un fil. Les instructions de programme lisibles par ordinateur décrites ici peuvent être téléchargées sur des dispositifs respectifs de calcul/traitement à partir d'un support de stockage lisible par ordinateur ou sur un ordinateur externe ou sur un dispositif de stockage externe par le biais d'un réseau, par exemple l'Internet, d'un réseau local, d'un réseau étendu et/ou d'un réseau sans fil. Le réseau peut comprendre des câbles de transmission en cuivre, des fibres de transmission optiques, une transmission sans fil, des routeurs, des pare-feu, des commutateurs, des ordinateurs passerelles et/ou des serveurs frontières. Une carte d'adaptateur de réseau ou une interface de réseau dans chaque dispositif de calcul/ traitement reçoit des instructions de programme lisibles par ordinateur depuis le réseau et transfère les instructions de programme lisibles par ordinateur en vue de leur stockage dans un support de stockage lisible par ordinateur à l'intérieur du dispositif respectif de calcul/traitement. Les instructions de programme lisibles par ordinateur pour effectuer les opérations de la présente invention peuvent être des instructions par assembleur, des instructions par architecture de jeu d'instructions (ISA), des instructions machine, des instructions dépendant d'une machine, un microcode, des instructions de firmware, des données de configuration d'état, ou n'importe quel code source ou code objet écrit dans une combinaison quelconque d'un ou plusieurs langages de programmation y compris un langage de programmation orienté objet tel que Smalltalk, C++ ou similaire, et des langages de programmation procédurale conventionnels, comme par exemple le langage de programmation "C" ou des langages de programmation similaires. Les instructions de programme lisibles par ordinateur peuvent s'exécuter entièrement sur l'ordinateur de l'utilisateur, en partie sur l'ordinateur de l'utilisateur, en tant que progiciels autonomes, en partie sur l'ordinateur de l'utilisateur et en partie sur un ordinateur éloigné ou entièrement sur l'ordinateur éloigné ou le serveur. Dans ce dernier cas, l'ordinateur éloigné peut être connecté à l'ordinateur de l'utilisateur par un type de réseau quelconque y compris un réseau local (LAN) ou un réseau étendu (WAN), ou la connexion peut être effectuée avec un ordinateur externe (par exemple par l'Internet en utilisant un fournisseur de services Internet). Dans certains modes de réalisation, un circuit électronique incluant par exemple un circuit logique programmable, des circuits intégrés prédiffusés programmables (FPGA), ou des réseaux logiques programmables (PLA) peuvent exécuter les instructions de programme lisibles par ordinateur en utilisant des informations d'état des instructions de programme lisibles par ordinateur pour personnaliser le circuit électronique afin d'effectuer certains aspects de la présente invention. Des aspects de la présente invention sont décrits ici en référence à des illustrations d'organigrammes et/ou de diagrammes blocs de procédés, d’appareils (systèmes), et de produits de programmes informatiques selon des modes de réalisation de l'invention. On comprendra que chaque bloc des illustrations sous forme d'organigrammes et/ou de diagrammes blocs, et des combinaisons de blocs dans les illustrations sous forme d'organigrammes et/ou de diagrammes blocs, peuvent être mis en œuvre par des instructions de programme lisibles par ordinateur. Ces instructions de programme lisibles par ordinateur peuvent être fournies à un processeur d'un ordinateur de type général, d'un ordinateur spécifique ou de tout autre appareil de traitement de données programmable pour produire une machine, de telle sorte que les instructions qui s'exécutent par le biais du processeur de l'ordinateur ou de l'autre appareil de traitement de données programmable crée des moyens pour mettre en œuvre les fonctions/les actions spécifiées dans l'organigramme et/ou le ou les blocs du diagramme blocs. Ces instructions de programme lisibles par ordinateur peuvent également être stockées dans un support de stockage lisible par ordinateur qui peut diriger un ordinateur, un appareil de traitement de données programmable, et/ou d'autres dispositifs de manière à ce qu'ils fonctionnent de façon particulière, de telle sorte que le support de stockage lisible par ordinateur ayant des instructions mémorisées sur celui-ci comprenne un élément de fabrication incluant des instructions qui mettent en œuvre des aspects de la fonction/de l’action spécifiée dans l'organigramme et/ou le ou les blocs du diagramme blocs. Les instructions de programme lisibles par ordinateur peuvent également être chargées sur un ordinateur, un autre appareil de traitement de données programmable, ou un autre dispositif pour provoquer une série d'étapes fonctionnelles devant être effectuées sur l'ordinateur, l'autre appareil programmable ou l'autre dispositif afin de produire un processus mis en œuvre par ordinateur, de telle sorte que les instructions qui s'exécutent sur l'ordinateur, l'autre appareil programmable ou l'autre dispositif mettent en œuvre les fonctions/les actions spécifiées dans l'organigramme et/ou le ou les blocs du diagramme blocs.
Références
[1] Yongxin Zhou, Alec Main, Yuan Xiang Gu, Harold Johnson. “Information hiding in software with mixed-boolean-arithmetic transforms”. Information security applications, 8thinternational workshop, WISA 2007.
[2] Jon Stephens et al. “ Probabilistic obfuscation through covert channels”. 2018 IEEE European symposium on security and privacy, EuroS&P 2018 IEEE.
[3] B. Yadegari et al. “Symbolic execution of obfuscated code. Proceedings of the 22ndACM SIGSAC conference on computer and communications security CCS 2015.
[4] S. Banescu et al. “Code obfuscation agains symbolic execution attacks”. Proceedings of the 32ndannual conference on computer security applications, CSAC 2016.
[5] Zhi Wang et al. “ Linear obfuscation to combat symbolic execution”, ESORICS 2011.
[6] E. Schwartz et al:” All you ever wanted to know about dynamic taint analysis and forward symbolic execution”, IEEE symposium on security and privacy 2010.
[7] Aho, Lam, Sethi and Ullman: “Compilers, Principles, techniques and tools”, Pearson, Addision Wesley 2ndedition, chap 9, p 610.

Claims (10)

  1. Procédé mis en œuvre par ordinateur pour obscurcir un code de programme pour le protéger contre une attaque, comprenant les étapes suivantes :
    • sélectionner (101), dans le code de programme, au moins une instruction d'affectation de variable affectant une valeur de variable d'entrée à une variable de sortie,
    • remplacer (102) chaque instruction d'affectation de variable sélectionnée par un jeu d'instructions obscurci qui est fonctionnellement équivalent et qui crée autant de nouveaux chemins qu'il y a de valeurs de variables d'entrée.
  2. Procédé mis en œuvre par ordinateur selon la revendication 1, dans lequel l'étape consistant à sélectionner (101) au moins une instruction d'affectation de variable comprend l'identification d'au moins une instruction d'affectation de variable dans le code de programme.
  3. Procédé mis en œuvre par ordinateur selon la revendication 1, dans lequel l'étape consistant à sélectionner (101) au moins une instruction d'affectation de variable comprend la création, dans le code de programme, d'une instruction d'affectation de variable n'ayant aucune influence sur l'exécution du programme.
  4. Procédé mis en œuvre par ordinateur selon l'une quelconque des revendications précédentes, dans lequel le jeu d'instructions obscurci comprend au moins une boucle FOR contrôlée par la variable d'entrée via un opérateur incrémentiel.
  5. Procédé mis en œuvre par ordinateur selon la revendication 4, dans lequel le jeu d'instructions obscurci comprend plusieurs boucles FOR en chaîne via un opérateur incrémentiel, chacune étant contrôlée par un octet de la variable d'entrée.
  6. Procédé mis en œuvre par ordinateur selon l'une quelconque des revendications 1 à 3, dans lequel le jeu d'instructions obscurci comprend une première instruction et une deuxième instruction exécutées séquentiellement, la deuxième instruction affectant une valeur constante donnée à la variable de sortie et la première instruction écrivant la valeur de variable d'entrée dans une adresse décalée de la valeur constante.
  7. Procédé mis en œuvre par ordinateur selon l'une quelconque des revendications précédentes, comprenant l'étape consistant à sélectionner, dans le code de programme, plusieurs instructions d'affectation de variables, chacune appartenant à un chemin indépendant associé à une valeur d'entrée distincte du code de programme.
  8. Procédé mis en œuvre par ordinateur selon l'une quelconque des revendications précédentes, comprenant l'étape consistant à sélectionner, dans le code de programme, au moins une instruction d'affectation de variable, la variable ayant une chaîne définition-utilisation avec à la fois une variable d'entrée du code de programme et une variable de sortie du code de programme.
  9. Produit de programme informatique, le produit de programme informatique comprenant un support de stockage lisible par ordinateur dans lequel sont incorporées des instructions exécutables par ordinateur, les instructions exécutables par ordinateur étant exécutables par un processeur pour amener le processeur à mettre en œuvre les étapes du procédé selon l'une quelconque des revendications 1 à 7.
  10. Système informatique (800), comprenant :
    • une mémoire (803) ayant des instructions exécutables par ordinateur et un programme dynamique d'une application ;
    • un processeur (801) pour exécuter les instructions exécutables par ordinateur, l'exécution des instructions exécutables par ordinateur amenant le processeur à exécuter les étapes du procédé selon l'une quelconque des revendications 1 à 7.
FR2005567A 2019-05-29 2020-05-27 Procédé mis en œuvre par ordinateur pour obscurcir un code de programme Active FR3096803B1 (fr)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
WOPCT/2019/00084 2019-05-29
PCT/IB2019/001084 WO2020240246A1 (fr) 2019-05-29 2019-05-29 Procédé mis en œuvre par ordinateur pour obscurcir un code de programme

Publications (2)

Publication Number Publication Date
FR3096803A1 true FR3096803A1 (fr) 2020-12-04
FR3096803B1 FR3096803B1 (fr) 2022-08-19

Family

ID=68654815

Family Applications (1)

Application Number Title Priority Date Filing Date
FR2005567A Active FR3096803B1 (fr) 2019-05-29 2020-05-27 Procédé mis en œuvre par ordinateur pour obscurcir un code de programme

Country Status (2)

Country Link
FR (1) FR3096803B1 (fr)
WO (1) WO2020240246A1 (fr)

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20070234070A1 (en) * 1999-07-29 2007-10-04 Intertrust Technologies Corp. Software self-defense systems and methods
US20100180346A1 (en) * 2007-01-18 2010-07-15 Nicolson Kenneth Alexander Obfuscation assisting aparatus
US20190044915A1 (en) * 2015-07-21 2019-02-07 Baffle, Inc. Systems And Processes For Executing Private Programs On Untrusted Computers

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20070234070A1 (en) * 1999-07-29 2007-10-04 Intertrust Technologies Corp. Software self-defense systems and methods
US20100180346A1 (en) * 2007-01-18 2010-07-15 Nicolson Kenneth Alexander Obfuscation assisting aparatus
US20190044915A1 (en) * 2015-07-21 2019-02-07 Baffle, Inc. Systems And Processes For Executing Private Programs On Untrusted Computers

Non-Patent Citations (7)

* Cited by examiner, † Cited by third party
Title
AHOLAMSETHIULLMAN: "Compilers, Principles, techniques and tools", pages: 610
B. YADEGARI ET AL., SYMBOLIC EXECUTION OF OBFUSCATED CODE. PROCEEDINGS OF THE 22 ACM SIGSAC CONFÉRENCE ON COMPUTER AND COMMUNICATIONS SECURITY CCS, 2015
E. SCHWARTZ ET AL.: "All you ever wanted to know about dynamic taint analysis and forward symbolic execution", IEEE SYMPOSIUM ON SECURITY AND PRIVACY, 2010
JON STEPHENS ET AL.: "Probabilistic obfuscation through covert channels", IEEE EUROPEAN SYMPOSIUM ON SECURITY AND PRIVACY, EUROS&P 2018 IEEE, 2018
S. BANESCU ET AL.: "Code obfuscation agains symbolic execution attacks", PROCEEDINGS OF THE 32ND ANNUAL CONFÉRENCE ON COMPUTER SECURITY APPLICATIONS, 2016
YONGXIN ZHOUALEC MAINYUAN XIANG GUHAROLD JOHNSON: "Information hiding in software with mixed-boolean-arithmetic transforms", INFORMATION SECURITY APPLICATIONS, 8TH INTERNATIONAL WORKSHOP, WISA, 2007
ZHI WANG ET AL.: "Linear obfuscation to combat symbolic execution", ESORICS, 2011

Also Published As

Publication number Publication date
FR3096803B1 (fr) 2022-08-19
WO2020240246A1 (fr) 2020-12-03

Similar Documents

Publication Publication Date Title
US11601442B2 (en) System and method associated with expedient detection and reconstruction of cyber events in a compact scenario representation using provenance tags and customizable policy
US10387647B2 (en) Detecting script-based malware using emulation and heuristics
Sion et al. Solution-aware data flow diagrams for security threat modeling
Snyder et al. Most websites don't need to vibrate: A cost-benefit approach to improving browser security
Bastani et al. Specification inference using context-free language reachability
FR3000249A3 (fr) Systeme et procede de detection d&#39;un code malveillant execute par une machine virtuelle
US20170116410A1 (en) Software protection
US10834289B2 (en) Detection of steganography on the perimeter
Apvrille et al. SysML-Sec attack graphs: compact representations for complex attacks
FR2914081A1 (fr) Procede de protection de documents numeriques contre des utilisations non autorisees.
Smith et al. Sugarcoat: Programmatically generating privacy-preserving, web-compatible resource replacements for content blocking
Rasthofer et al. Harvesting runtime data in android applications for identifying malware and enhancing code analysis
Bartoletti et al. Combining behavioural types with security analysis
FR3096803A1 (fr) Procédé mis en œuvre par ordinateur pour obscurcir un code de programme
US11650801B2 (en) Determining when to perform and performing runtime binary slimming
US10372526B2 (en) Cleanup of unpredictable test results
David Formal approaches for automatic deobfuscation and reverse-engineering of protected codes
US20220374516A1 (en) Real time threat knowledge graph
Chen Privacy Implications of Emerging Web Technologies
Catalano et al. Enhancing Code Obfuscation Techniques: Exploring the Impact of Artificial Intelligence on Malware Detection
Häyrynen Performance analysis of obfuscated JavaScript
Juhola Security testing process for React Native applications
Sanders et al. Developing a Zen Click Fraud Detection Framework Using Smart Contracts
Bartoletti et al. Journal of Logical and Algebraic Methods in Programming
FR2911022A1 (fr) Procede permettant d&#39;imposer une politique de securite a une application telechargeable accedant a des ressources du reseau

Legal Events

Date Code Title Description
PLSC Publication of the preliminary search report

Effective date: 20210409

PLFP Fee payment

Year of fee payment: 2

PLFP Fee payment

Year of fee payment: 3

PLFP Fee payment

Year of fee payment: 4