FR 3156552 A1 20250613 FR 2313990 A 20231212 Il est proposé un procédé mis en œuvre par des moyens informatiques pour déterminer un ensemble d’injections exploitables dans une séquence exécutable, la séquence exécutable utilisant un langage (L), le procédé comprenant : a) déterminer au moins un point d’entrée de la séquence exécutable, b) déterminer, à partir dudit point d’entrée, un motif (M) comprenant au moins un point d’injection de la séquence exécutable, le motif respectant le langage (L) de la séquence exécutable, c) pour chaque point d’injection, extraire un ensemble de contraintes (C) associé au point d’injection, d) déterminer, pour chaque point d’injection, l’ensemble d’injections exploitables à partir du motif (M) auquel appartient le point d’injection, de l’ensemble de contraintes (C) associé et du langage (L). Figure de l’abrégé : Figure 2 Procédé de détection de vulnérabilités logicielles par injection de code La présente divulgation relève du domaine de la sécurité informatique et plus particulièrement de l’identification des vulnérabilités logicielles par injection de code. L’analyse de sécurité est un aspect primordial à considérer lors du développement comme tout au long de l’exploitation d’un logiciel. Par exemple, les phases de spécification, de développement ou encore de test d’un logiciel peuvent inclure une analyse de sécurité permettant d’identifier et de corriger des potentielles vulnérabilités du logiciel avant son exploitation. Dans un autre exemple, un logiciel exploité peut faire l’objet d’audits de sécurité permettant de détecter et corriger des vulnérabilités résiduelles du logiciel. L’identification de vulnérabilités logicielles est notamment essentielle pour des systèmes informatiques dans des milieux sensibles, comme le secteur bancaire ou de l’énergie, ou encore pour des systèmes de détection et d’alerte par exemple. De telles vulnérabilités peuvent toucher tous types de logiciels, tels que des applications, des systèmes d’exploitation ou encore des réseaux. Parmi les classes de vulnérabilités logicielles, les vulnérabilités par injections présentent un risque considérable pour les logiciels. Une vulnérabilité par injection correspond à une faille, par exemple dans le code source, d’un programme du logiciel, exploitable en y injectant, durant l’exécution, des portions de codes, ou scripts, de sorte à modifier le comportement du logiciel. Ainsi, l’exploitation d’une vulnérabilité par injection dans un logiciel peut conduire à dénaturer l’exécution du programme sous-jacent. Typiquement, on peut considérer une application Web incluant un formulaire d’authentification permettant à des utilisateurs de s’authentifier à l’aide d’un nom d’utilisateur et d’un mot de passe, par exemple pour accéder à une page Web. Lors de l’exécution d’une telle application, un serveur récupère les informations (ici, le nom d’utilisateur et le mot de passe) entrées sur le formulaire d’authentification afin de construire une requête pour interroger une base de données stockant les données des utilisateurs (légitimes) de la page Web et de permettre de valider ou non l’authentification. Un individu malveillant pourrait alors par exemple fournir un mot de passe volontairement mal-formaté, de sorte à modifier la sémantique de la requête permettant d’interroger la base de données, et ainsi être authentifié sans connaître de mot de passe valide, voire de demander des actions à la base de données qui sont censées lui être interdites, comme la suppression de données. Une vulnérabilité logicielle par injection peut ainsi être présente lorsque le logiciel s’appuie sur des données externes au code source, par exemple entrées par l’utilisateur, qui sont utilisées pour construire des requêtes à destination d’un autre système informatique (e.g., un autre programme, logiciel ou encore une base de données distante). Ce type de vulnérabilité par injection fait partie des classes de vulnérabilités les plus fréquemment rencontrées, en particulier pour les applications Web. De plus, les vulnérabilités par injection peuvent potentiellement toucher tous les langages de programmation et/ou protocoles réseaux utilisés, par exemple le XSS, SQL, NoSQL, LDAP etc. Des solutions visant à détecter ou identifier de telles vulnérabilités logicielles par injections existent. On peut par exemple citer des scanners de vulnérabilités testant les logiciels à partir d’exploits définis ou encore des bases recensant des listes de vulnérabilités connues selon la nature et la version de chaque logiciel. En particulier, deux types de solutions sont généralement connues : les détecteurs de failles fonctionnant par répertoire, qui vérifient l’applicabilité de vulnérabilités connues dans un système exécutable (typiquement, un extrait de code source). Puisque de tels détecteurs ne se basent que sur des vulnérabilités connues (qui dépendent du contenu du répertoire), elles ne sont ni exhaustives, ni proactives. De plus, les détecteurs de failles fonctionnant par répertoire doivent être régulièrement mis à jour afin de prendre en compte de nouvelles failles découvertes. les tests à données aléatoires (ou en anglais « fuzzing »), qui testent un système exécutable en injectant des données aléatoires au niveau des entrées utilisateurs du système. Cependant, l’espace de test étant considérable (voire virtuellement infini), les tests sont en pratique mis en œuvre sur des échantillons représentatifs des cas les plus critiques. Une telle solution n’est alors pas exhaustive, des injections potentiellement critiques ayant pu échapper au test. De plus, la détection de vulnérabilités requiert des temps d’exécution considérables. Plus généralement, la plupart des solutions connues permettant d’identifier des vulnérabilités par injections d’un logiciel restent soit trop coûteuses en temps de calcul et en ressources pour être mises en œuvre sur la plupart des logiciels, soit expérimentales et non-exhaustives. En effet, la plupart des solutions existantes ont une approche commune revenant à tester si une injection particulière (souvent déjà connue ou répertoriée) permet d’exploiter la vulnérabilité d’un logiciel. Une telle approche n’est alors jamais exhaustive en pratique en ce que l’ensemble des injections potentielles dans un programme est infini. Par ailleurs, une identification exhaustive des injections potentielles dans un programme est rendue difficile dans les approches existantes par la diversité de natures, de spécificités et de langages des logiciels. Ainsi, les approches existantes d’identification de vulnérabilités logicielles par injections ne permettent pas d’aboutir à une preuve formelle d’exhaustivité et donc à une garantie de sécurité satisfaisante des logiciels. Résumé La présente divulgation vient améliorer la situation. Il est proposé un procédé mis en œuvre par des moyens informatiques pour déterminer un ensemble d’injections exploitables dans une séquence exécutable, la séquence exécutable utilisant un langage, le procédé comprenant : a) déterminer au moins un point d’entrée de la séquence exécutable, b) déterminer, à partir dudit point d’entrée, un motif comprenant au moins un point d’injection de la séquence exécutable, le motif respectant le langage de la séquence exécutable, c) pour chaque point d’injection, extraire un ensemble de contraintes associé au point d’injection, d) déterminer, pour chaque point d’injection, l’ensemble d’injections exploitables à partir du motif auquel appartient le point d’injection, de l’ensemble de contraintes associé et du langage. Par conséquent, le procédé proposé permet avantageusement une identification rigoureuse, exhaustive et systématique des injections pouvant exploiter une vulnérabilité d’une séquence exécutable, comme un programme, un script ou plus généralement un bloc de code informatique exécutable. Le procédé permet ainsi d’améliorer les garanties de sécurité d’un logiciel vis-à-vis des vulnérabilités par injections. Une telle identification est notamment possible quel que soit la séquence exécutable considérée et/ou le langage utilisé par la séquence exécutable, en ce que le procédé propose de formaliser la séquence exécutable et son langage, en considérant le motif, les points d’injection et les contraintes de façon formelle. Pour cela, le procédé propose de déterminer des injections pouvant permettre de compléter la séquence exécutable au niveau des points d’injections de celle-ci, en tenant compte à la fois du motif, de sa syntaxe respectant le langage et des contraintes imposées aux données pouvant être entrées au niveau des points d’injection. Le procédé proposé réalise alors une intersection de plusieurs éléments permettant d’identifier de façon systématique et exhaustive les injections exploitables au niveau de chaque point d’injection de la séquence exécutable. Le procédé proposé peut donc être avantageusement lancé (ou testé) sur une séquence exécutable par des développeurs ou auditeurs de codes, dans le cadre d’un développement, d’un test, ou encore d’un audit de logiciel. En particulier, la solution proposée permet à des utilisateurs non experts en cybersécurité d’identifier et de recenser les potentielles vulnérabilités par injections du logiciel qu’ils utilisent ou développent. De plus, une telle identification et un tel recensement peuvent être exhaustifs sans avoir à tester ou comparer isolément des injections données dans le motif. Par une séquence exécutable, il peut être fait référence à un bloc ou un extrait de code source, ou du contenu d’un script. La séquence exécutable peut être composée d’une suite successive et logique de lignes de code. La séquence exécutable peut être intégrée à un système exécutable, qui peut faire référence au système (hardware et/ou software) mettant en œuvre l’exécution de la séquence exécutable. Par un langage, il peut être fait référence à un langage de programmation respecté par la séquence exécutable, ou encore au langage de programmation dans lequel est codé la séquence exécutable. Par exemple, la séquence exécutable peut correspondre à une portion de code écrite en Python et respectant le langage MySQL. En particulier, le langage peut également inclure une grammaire sous-jacente, permettant de définir une syntaxe du langage. Par un point d’entrée, il peut être fait référence à une portion de la séquence exécutable dans laquelle interviennent des données d’entrée de la séquence exécutable. En particulier, ces données d’entrée peuvent intervenir dans le point d’entrée directement (autrement dit, le point d’entrée intègre directement des points d’injection) ou indirectement (par exemple, en remontant dans l’arborescence du système exécutable, le point d’entrée appelle des variables et/ou des fonctions qui elles-mêmes intègrent des points d’injection). Lorsque les données d’entrée satisfont au langage et à d’éventuels autres critères, comme des contraintes de filtrage (par exemple, en termes de taille, de valeurs, de nature…), de telles données d’entrée sont dites filtrées et permettent de compléter le motif de la séquence exécutable. Par un point d’injection, il peut être fait référence à une portion de la séquence exécutable intégrant des données d’entrées. De telles données d’entrées peuvent par exemple être des données entrées par un utilisateur de la séquence exécutable. Ainsi, lorsque la séquence exécutable est exécutée, les données d’entrées – éventuellement après filtrage - sont intégrées au niveau des points d’injection de sorte à interpréter le programme correspondant à la séquence exécutable. Par un motif respectant le langage, il est entendu que le motif respecte une syntaxe du langage, définie notamment par la grammaire sous-jacente au langage. Autrement dit, les éléments (ou symboles) formant le motif sont construits et se succèdent de sorte à être syntaxiquement interprétables par rapport au langage. Par un ensemble de contraintes associé au point d’injection, il peut être fait référence à des contraintes ou conditions imposées aux données d’entrée pouvant être valablement injectées au niveau du point d’injection. De telles contraintes peuvent être interprétées comme des conditions de filtrage (supplémentaires, par rapport aux conditions de syntaxes imposées par le langage) permettant de filtrer les données entrées au niveau de chaque point d’injection. Par exemple, l’ensemble de contraintes peut inclure des contraintes liées au format, à la nature, à la taille ou encore à la valeur des données d’entrée. Par exemple, les données doivent être de type « string » ou « float », la chaîne de caractères entrée au niveau du point d’injection ne doit pas excéder un nombre maximal de caractères, la valeur numérique entrée au niveau du point d’injection doit appartenir à une plage de valeurs donnée etc. De telles conditions peuvent être imposées par le développeur via le contenu de la séquence exécutable. Par un ensemble d’injections exploitables, il est fait référence à l’ensemble des données pouvant être injectées au niveau de chaque point d’injection, de sorte à compléter le motif et à permettre l’exécution de la séquence exécutable. Un tel ensemble d’injections exploitables comprend ainsi des injections (i.e., sous forme de données) à la fois syntaxiquement correctes vis-à-vis du langage et respectant les conditions de filtrage propre de la séquence exécutable imposées par l’ensemble de contraintes. En particulier, l’ensemble d’injections exploitables peut correspondre à un ensemble exhaustif d’injections permettant de compléter le point d’injection du motif en satisfaisant à la fois le langage et les contraintes associées au point d’injection. Les caractéristiques exposées dans les paragraphes suivants peuvent, optionnellement, être mises en œuvre, indépendamment les unes des autres ou en combinaison les unes avec les autres : Dans un mode de réalisation, le langage est formé de symboles et construit selon un ensemble de règles, le motif est construit par une succession de symboles respectant ledit ensemble de règles, et l’ensemble des injections exploitables est déterminé à l’étape d) par la génération de symboles générés injectables au motif, lesdits symboles générés étant injectables au niveau de l’au moins un point d’injection du motif, à partir des symboles du motif et respectant l’ensemble de règles et l’ensemble de contraintes. Par conséquent, le procédé proposé permet avantageusement de construire formellement, et donc de façon exhaustive, des injections exploitables dans le motif sous la forme d’une succession de symboles générés à partir des symboles du motif en respectant le langage et les contraintes. Le procédé proposé permet ainsi de déterminer la nature des injections exploitables en faisant abstraction du langage employé ou de la séquence exécutable considérée : le procédé peut être appliqué quels que soient le langage et la séquence exécutable. En effet, le langage est considéré à un niveau formel, à l’échelle des symboles le composant et des règles le décrivant. Par un symbole, il est fait référence à un élément unitaire du langage. Par exemple, dans l’alphabet latin moderne, un symbole peut correspondre à chacune des vingt-six lettres de l’alphabet. Dans un autre exemple, pour une séquence exécutable respectant le langage XML, les éléments et permettant de définir un objet peuvent être interprétés comme des symboles du langage XML. En variante, les éléments , peuvent être définis comme des symboles du langage XML. Tout élément du langage peut alors être obtenu par une succession de symboles. Par un ensemble de règles, il est fait référence à un ensemble de constructions syntaxiques permettant d’engendrer le langage (c’est-à-dire l’ensemble des éléments ou mots du langage). En particulier, l’ensemble de règles permet de définir une grammaire (ou grammaire initiale) du langage. Autrement dit, l’ensemble de règles permet de construire des successions de symboles engendrant l’ensemble du langage. Par des symboles générés injectables au motif, il est fait référence à des éléments du langage construits pour respecter l’ensemble de règles et l’ensemble de contraintes, de sorte à former une injection exploitable au niveau du point d’injection considéré. Autrement dit, l’ensemble d’injections exploitables déterminé par le procédé proposé correspond à un ensemble de symboles générés injectables formés à partir des règles et des contraintes du point d’injection. Dans un mode de réalisation, le procédé comprend en outre, après l’étape b) : b1) déterminer, pour le motif de la séquence exécutable, une pluralité de radicaux correspondant à des portions invariables du motif, deux radicaux voisins du motif étant séparés par un point d’injection, et dans lequel l’étape d) comprend : d10) une comparaison itérative de chaque radical de la pluralité de radicaux du motif avec l’ensemble de règles. Par conséquent, le procédé proposé permet avantageusement de formaliser (et donc systématiser) la détermination des injections exploitables en s’appuyant sur la structure formelle du motif de la séquence exécutable. En effet, indépendamment du langage et du contenu de la séquence exécutable, des radicaux et des points d’injection du motif peuvent être identifiés. Le procédé peut donc être mis en œuvre de façon systématique sur toute séquence exécutable et pour tout langage utilisé, tant qu’un ensemble de règles et des symboles sont associés à un tel langage. Afin de déterminer l’ensemble des injections exploitables, le procédé propose de comparer chaque radical du motif avec l’ensemble de règles. Une telle comparaison itérative permet alors de spécifier et contraindre la forme des injections exploitables par rapport à chaque radical du motif. En effet, un point d’injection étant compris entre deux radicaux, une injection exploitable doit au moins respecter la syntaxe du langage contrainte par les radicaux de part et d’autre du point d’injection, de sorte que l’ensemble du motif formé par la succession de radicaux et de points d’injection soit syntaxiquement correcte (c’est-à-dire respecte au moins l’ensemble de règles). Par une comparaison itérative entre un radical et l’ensemble de règles, il peut être compris une opération d’intersection entre chaque radical du motif et l’ensemble de règles considéré. Les radicaux sont notamment considérés dans leur ordre d’apparition au sein du motif. Une telle comparaison peut être comprise comme une spécification ou spécialisation de l’ensemble de règles considéré par rapport à chaque radical comparé. En particulier, une telle comparaison peut être mise en œuvre avec l’ensemble de règles initialement considéré mais également avec d’autres potentielles règles additionnelles résultant de comparaisons avec les précédents radicaux. Autrement dit, chaque comparaison tient compte des résultats des comparaisons aux itérations précédentes (i.e., avec les radicaux positionnés en amont du radical considéré dans le motif). Dans un mode de réalisation, chaque itération de l’étape d10) pour chaque radical considéré est associée à la génération d’un ensemble de symboles générés comprenant le radical considéré. Dans un mode de réalisation, le procédé comprend en outre : d11) une spécification itérative de l’ensemble de règles à chaque radical de la pluralité de radicaux du motif résultant en des ensembles de règles spécifiées, chaque ensemble de règles spécifiées engendrant l’ensemble de symboles générés comprenant le radical considéré. Par conséquent, à chaque comparaison d’un radical avec l’ensemble de règles, le procédé propose avantageusement de spécifier le langage utilisé par rapport à chaque radical (via une opération d’intersection), de sorte à générer (ou engendrer) les éléments du langage comprenant ce radical. Autrement dit, à chaque itération, l’espace du langage considéré (c’est-à-dire l’ensemble des combinaisons de symboles pouvant être générés) décroît puisque l’on précise (donc contraint) les successions de symboles acceptables. Une telle spécification du langage est permise par l’ajout (ou la spécification) de règles spécifiques définissant la syntaxe du langage permettant d’engendrer le radical donné. Autrement dit, l’ensemble de règle spécifiées pour chaque radical croît par rapport à l’ensemble de règles précédent et intègre ce dernier. Autrement dit, si Gj désigne un ensemble de règles à la j-ème itération (j étant un entier naturel supérieur à 1), on a dim(G j ) > dim (G j-1 ), où dim correspond à la dimension de l’ensemble de règles et G j inclut G j-1 . Par un ensemble de règles spécifiées, il est fait référence à l’ensemble de règles initial auquel sont ajoutées des nouvelles règles permettant de spécialiser l’ensemble de règles initial au radical considéré. Ainsi, pour chaque nouvelle itération sur un radical, l’ensemble de règles considéré peut correspondre à l’ensemble de règles résultant de la précédente itération, de sorte que la grammaire du langage se spécialise progressivement pour l’ensemble des radicaux du motif. Dans un mode de réalisation, les radicaux du motif sont formés par une succession de symboles, et l’étape d) comprend en outre : d101) associer les symboles des radicaux du motif à des premiers labels, les symboles d’un même radical étant associé au même premier label, les symboles respectifs des radicaux voisins étant associés à des premiers labels successifs selon un premier critère, d102) associer les symboles formant l’ensemble de règles à un même label initial, et dans lequel chaque ensemble de symboles générés et chaque ensemble de règles spécifiées sont associés à des labels générés dépendant des premiers labels des radicaux du motif et du label initial de l’ensemble de règles, l’étape d) comprenant : d12) une mise à jour itérée des labels générés en fonction d’un résultat de chaque itération des étapes d10) et d11), d13) une identification des éléments des ensembles de symboles générés ayant des labels générés différents des premiers labels. Avantageusement, le procédé permet de se repérer dans les itérations successives en labellisant les symboles des éléments manipulés (ici, radicaux et règles). La considération des labels générés associés aux symboles générés permet alors d’identifier de façon systématique et formelle (indépendamment des symboles en question) des injections exploitables potentielles. L’identification des éléments ayant des labels générés différents des premiers labels permet avantageusement d’identifier les éléments ne correspondant pas aux radicaux. De tels éléments peuvent alors inclure des injections exploitables. Par labels, il peut être fait référence à des valeurs ou des annotations permettant de repérer, d’ordonner, d’ordonnancer ou d’indicer les différents symboles d’un élément (e.g., un motif, un radical, une règle, une contrainte…). Les valeurs des labels peuvent appartenir à un ensemble ordonné d’objets. Par exemple, les labels peuvent correspondre à des indices numériques, exprimés par exemple par des entiers naturels. Dans un autre exemple, les labels peuvent correspondre à des lettres d’un alphabet. Des labels successifs selon un premier critère peuvent alors faire référence à des valeurs ordonnées selon un ordonnancement naturel. Par exemple, si les labels correspondent à des indices numériques, deux labels successifs peuvent correspondre à deux entiers naturels successifs. Dans un autre exemple, si les labels correspondent à des lettres de l’alphabet latin moderne, deux labels successifs peuvent correspondre à deux lettres se succédant cet alphabet. Le premier critère correspond dans ces cas à un pas de un entre deux indices successifs. Le premier critère peut également être un critère de parité. Par exemple, des premiers labels successifs selon un premier critère peuvent correspondre à des premiers indices numériques successifs de même première parité. Par première parité, il est fait référence à un élément parmi le caractère pair ou le caractère impair. Par exemple, si la première parité correspond au caractère pair, des indices successifs de même première parité désignent les indices 0, 2, 4, 6…, 2n, , où n est un entier naturel. Dans un mode de réalisation, l’étape d) comprend : d1) à partir du motif et du langage, déterminer un ensemble d’injections exécutables, d2) filtrer l’ensemble des injections exécutables en fonction de l’ensemble de contraintes associé de sorte à obtenir l’ensemble d’injections exploitables, l’ensemble des injections exploitables étant de dimension inférieure à l’ensemble des injections exécutables. Par conséquent, le procédé propose de déterminer les injections exploitables en spécifiant et restreignant le langage par rapport à la fois aux règles de syntaxe définissant le langage (étape d1)) et aux contraintes imposées au niveau de chaque point d’injection (étape d2)). Ainsi, l’étape d1) permet d’obtenir un premier ensemble d’injections candidates, dites injections exécutables, satisfaisant aux ensembles de règles spécifiées à partir du motif et du langage. L’étape d2) permet ensuite de filtrer ces injections exécutables selon l’ensemble de contraintes de sorte à obtenir l’ensemble des injections effectivement exploitables. Par un ensemble d’injections exécutables, il est fait référence à un ensemble d’injections grammaticalement (ou syntaxiquement) correctes au regard du motif et du langage. Autrement dit, une injection est une injection exécutable lorsque son exécution ne génère pas d’erreur de syntaxe dans la séquence exécutable. Cependant, une telle injection exécutable ne permet pas toujours l’exécution de la séquence exécutable, en ce qu’elle peut ne pas satisfaire aux contraintes du développeur. Par exemple, une donnée d’entrée correspondant à une injection exécutable peut être syntaxiquement correcte compte tenu des radicaux du motif, mais sa taille ou son type peuvent dépasser les contraintes imposées au niveau du point d’injection correspondant, de sorte que l’injection n’est pas effectivement exploitable. Cependant, une injection exploitable respectant nécessairement les règles du langage, l’ensemble des injections exploitables est nécessairement compris dans l’ensemble des injections exécutables. Ainsi, le procédé permet avantageusement d’identifier de façon exhaustive les injections potentiellement candidates à être des injections exploitables dans la séquence exécutable. Dans un mode de réalisation, la détermination de l’ensemble d’injections exécutables résultent des étapes d10), d11), d101), d102), d12) et d13). Par conséquent, l’ensemble des injections exécutables est le résultat de l’intersection de tous les radicaux du motif avec l’ensemble de règles itérativement spécialisé pour chaque radical. Autrement dit, lorsque tous les radicaux du motif ont été comparés (ou intersectés) avec l’ensemble de règles, l’ensemble de règles spécifiées obtenu permet d’engendrer l’ensemble des injections exécutables. En particulier, à l’issue des étapes d10), d11), d101), d102), d12) et d13), la prise en compte de l’ensemble des contraintes n’est pas encore mise en œuvre, de sorte que des injections exécutables peuvent ne pas satisfaire à de telles contraintes. Dans un mode de réalisation, le filtrage de l’étape d2) est mis en œuvre à partir d’un ensemble élargi de contraintes incluant ledit ensemble de contraintes. Avantageusement, l’utilisation d’un ensemble élargi de contraintes permet d’accélérer l’exécution du procédé. En effet, la prise en compte des contraintes imposées par le développeur peut parfois conduire à un grand nombre d’opérations (élémentaires ou non) afin de comparer l’ensemble des injections exécutables avec de telles contraintes. Ainsi, une relaxation (ou surestimation) des contraintes intègre la possibilité d’avoir des faux-positifs au profit d’un meilleur temps d’exécution. Néanmoins, une telle relaxation des contraintes exclut toujours la présence de faux-négatifs : le procédé proposé reste donc avantageusement systématique et exhaustif et la garantie de sécurité du logiciel vis-à-vis des injections de code reste assurée. Un tel ensemble élargi de contraintes peut être associé à un deuxième ensemble d’expressions régulières sur-approximé par rapport à un premier ensemble d’expressions régulières associé à l’ensemble de contraintes. Dans un mode de réalisation, le procédé comprend, après l’étape c), : c1) convertir, pour chaque point d’injection, l’ensemble de contraintes associé en un premier ensemble d’expressions régulières, et dans lequel l’ensemble d’injections exploitables correspond aux injections exécutables filtrées selon un ensemble d’expressions régulières parmi le premier ensemble d’expressions régulières et un deuxième ensemble d’expressions régulières sur-approximé par rapport au premier ensemble d’expressions régulières. Dans un mode de réalisation, chaque expression régulière de l’ensemble d’expressions régulières est formée par une succession de symboles, et l’étape d2) comprend en outre : d21) associer les symboles de chacune des expressions régulières de l’ensemble d’expressions régulières à des deuxièmes labels, les symboles d’une même expression régulière étant associés au même deuxième label, les symboles respectifs de deux expressions régulières voisines dans l’ensemble d’expressions régulières étant associés à des deuxièmes labels successifs selon un deuxième critère, d22) comparer les deuxièmes labels de chacune des expressions régulières de l’ensemble d’expressions régulières avec les labels générés à l’issue de l’étape d12), d23) déterminer l’ensemble d’injections exploitables à partir des éléments des ensembles de symboles générés associés aux labels générés correspondant aux deuxièmes labels. Par conséquent, l’ensemble des injections exploitables peut être avantageusement obtenu par une simple intersection entre les expressions régulières associées à l’ensemble de contraintes et l’ensemble des symboles générés correspondant à l’ensemble des injections exécutables. Une telle intersection est avantageusement simple en ce qu’elle repose sur une comparaison des labels associés d’une part aux points d’injection (via les expressions régulières) et d’autre part aux éléments des ensembles de symboles générés. Ainsi, si l’étape d13) permet de déterminer l’ensemble des injections exécutables (i.e., les ensembles de symboles générés dont les labels générés ne correspondent pas aux premiers labels), l’étape d23) permet de déterminer l’ensemble des injections exploitables (i.e., l’ensemble des symboles générés dont les labels générés correspondent aux deuxièmes labels), à l’issue de l’étape de filtrage par les contraintes. Comme défini précédemment, les labels peuvent par exemple désigner des indices numériques. En particulier, des deuxièmes labels successifs selon un deuxième critère peuvent correspondre à des deuxièmes indices numériques successifs de même deuxième parité. Par deuxième parité, il est fait référence à l’élément restant parmi le caractère pair ou le caractère impair (ne correspondant pas à la première parité). Par exemple, si la deuxième parité correspond aux indices impairs, des indices successifs de même deuxième parité désignent les indices 1, 3, 5, 7,…, (2n+1), où n est un entier naturel. Dans un mode de réalisation, le procédé comprend en outre : e) à partir de l’ensemble d’injections exploitables, mettre en œuvre une analyse de vulnérabilité de la séquence exécutable. Par conséquent, le procédé proposé permet avantageusement d’exploiter l’ensemble des injections exploitables déterminé afin d’analyser ou d’évaluer la séquence exécutable. Une telle analyse ou évaluation peut par exemple être mise en œuvre dans le contexte d’une analyse des risques de compromission de la séquence exécutable ou du logiciel intégrant une telle séquence exécutable. Une telle analyse de vulnérabilité peut avantageusement être mise en œuvre par les développeurs au moment du développement du logiciel intégrant la séquence exécutable. La détermination de l’ensemble des injections exploitables permet avantageusement à un développeur ou un individu non expert en cybersécurité d’identifier des vulnérabilités potentielles de la séquence exécutable. L’analyse de vulnérabilité peut par exemple être comprise comme une étude ou une classification de l’ensemble des injections exploitables déterminées dans la séquence exécutable selon des critères de risques donnés. L’analyse de vulnérabilité peut également être comprise comme une évaluation du degré de vulnérabilité du logiciel ou système intégrant la séquence exécutable, par exemple en fonction du nombre ou de la nature des injections exploitables déterminées. Dans un mode de réalisation, le procédé comprend en outre : e’) attribuer des indices de vulnérabilité respectivement associés à chaque injection exploitable de l’ensemble d’injections exploitables, ledit indice de vulnérabilité étant déterminé à partir du motif (M) complété par l’injection exploitable au niveau du point d’injection correspondant. Par un indice de vulnérabilité, il est fait référence à une valeur ou une mesure quantifiant le degré de compromission du système intégrant la séquence exécutable si l’injection exploitable correspondante venait à être effectivement exploitée. Un tel indice de vulnérabilité peut par exemple être défini par l’utilisateur du procédé (le développeur, un analyste de risque ou un autre individu) selon une échelle de risque prédéfinie. Un tel indice de vulnérabilité peut par exemple dépendre de la nature de l’action exécutable résultant de l’injection exploitable ou du niveau de privilège associé à une telle action. Par exemple, une injection exploitable conduisant à la suppression ou l’altération d’information ou encore à la dénaturation d’une fonction peut être considérée comme ayant un indice de vulnérabilité élevée, en ce qu’elle dénature et détourne le résultat de la séquence exécutable. Selon un autre aspect, il est proposé un programme informatique comportant des instructions pour la mise en œuvre de tout ou partie d’un procédé tel que défini précédemment lorsque ce programme est exécuté par un processeur. Selon un autre aspect, il est proposé un support d’enregistrement non transitoire, lisible par un ordinateur, sur lequel est enregistré un tel programme. D’autres caractéristiques, détails et avantages apparaîtront à la lecture de la description détaillée ci-après, et à l’analyse des dessins annexés, sur lesquels : Fig. 1 FIG. 1 montre un ensemble de systèmes impliqués dans le procédé de détection proposé selon un mode de réalisation. Fig. 2 FIG. 2 montre des étapes d’un procédé de détection proposé selon un mode de réalisation. Fig. 3 FIG. 3 montre un exemple d’injection dans une requête d’accès à une base de données. Fig. 4 FIG. 4 montre un exemple de grammaire définissant un format de données selon un mode de réalisation. Fig. 5 FIG. 5 montre un exemple de séquence exécutable selon le mode de réalisation de la FIG. 4 . Il est fait référence à la FIG. 1 . La FIG. 1 illustre un ensemble de systèmes 1, 2, 3, 4 dans le contexte d’une détection d’injections de code dans une séquence exécutable. Un tel ensemble peut inclure un système de détection 1, un système informatique 2, un système utilisateur 3 et optionnellement un système de base de données 4. Le système informatique 2 peut correspondre à un système (ou environnement) exécutable, ou runtime , configuré pour exécuter un ou plusieurs programmes. Le système informatique 2 peut par exemple inclure un logiciel (par exemple, de système ou d’application), qui comprend un ou plusieurs programmes. Le système informatique 2 peut par exemple correspondre ou être intégré à un serveur ou un module dans le cadre d’un service ou d’une application. Les fonctionnalités et services du système informatique 2 sont mises en œuvre par l’exécution d’un ou plusieurs programmes prédéfinis, sous forme de scripts. De tels programmes incluent notamment une ou plusieurs séquences d’instructions, ou séquences exécutables (e.g., des blocs de codes). L’exécution et l’interprétation de ces séquences exécutables permet au système informatique 2 de mettre en œuvre une ou plusieurs fonctionnalités. Des exemples d’exécution et d’interprétation de séquences exécutables par le système informatique 2 seront détaillés plus loin dans la description. Une telle exécution d’une ou plusieurs séquences exécutables peut être planifiée, préprogrammée ou préconfigurée, par exemple dans le cadre de fonctionnalités automatiques et/ou à exécution périodique. Une telle exécution peut également être ponctuellement déclenchée, par exemple lorsque des données sont entrées au système informatique 2. Afin de mettre en œuvre des services et fonctionnalités, le système informatique 2 peut comprendre au moins une unité de traitement 21 et une unité mémoire 22. L’unité de traitement 21 peut en particulier correspondre à l’unité logicielle exécutant des séquences exécutables d’un ou plusieurs programmes. Le système informatique 2 peut également inclure une interface de communication 20 configurée pour émettre et/ou recevoir des données avec d’autres systèmes et entités informatiques. Par exemple, le système informatique 2 peut recevoir des données d’entrée via l’interface de communication 20 et/ou transmettre des données reçues et/ou traitées par l’unité 21 à un système de base de données 4. Sur la FIG. 1 , un tel système de base de données 4 est distinct du système informatique 2 mais en variante, un tel système de base de données 4 peut être intégré au système informatique 2 (typiquement, dans le cas où le système informatique 2 est un serveur). Les données entrées au système informatique 2 peuvent provenir d’un système utilisateur 3. Un tel système utilisateur 3 peut par exemple correspondre à une machine, un ordinateur, un calculateur, un appareil mobile, un terminal, un véhicule ou tout autre dispositif informatisé supportant des logiciels, et systèmes d’exploitation, manipulable ou accessible à un utilisateur. Un tel système utilisateur 3 est connecté au système informatique 2, par exemple par une liaison filaire, non filaire et/ou un réseau de communication, de sorte à transmettre des données depuis le système utilisateur 3 vers le système informatique 2. Par exemple, le système utilisateur 3 peut transmettre des données qui lui sont manuellement entrées par l’utilisateur (e.g., dans le cas d’un utilisateur remplissant un formulaire en ligne sur son ordinateur privé), qui sont captées par le système utilisateur 3 (par exemple, dans le cas d’un véhicule ou un engin captant une température ambiante) et/ou qui sont générées par le système utilisateur 3 (e.g., dans le cas d’un véhicule automobile générant des données système de type température du véhicule ou niveau de carburant restant). Le système utilisateur 3 peut inclure au moins une interface de communication 30 configurée pour transmettre les données utilisateur au système informatique 2. Le système de détection 1 est un système proposé pour mettre en œuvre un procédé de détection d’injections de code dans un système informatique 2. En particulier, le système de détection 1 proposé est configuré pour déterminer un ensemble d’injections de code exécutables pour une séquence exécutable donnée du système informatique 2. Pour cela, le système de détection 1 peut inclure une interface d’entrée 10, une unité de traitement 11, une unité mémoire 12 et une interface de sortie 13. L’interface d’entrée 10 peut être configurée pour recevoir des données, informations, scripts provenant d’autres systèmes tels que le système informatique 2 mais également le système utilisateur 3 ou le système de base de données 4. En particulier, l’interface d’entrée 10 est configurée pour recevoir des données relatives à au moins une séquence exécutable à analyser par le système de détection 1. De telles données seront détaillées plus loin dans la description. L’unité de traitement 11 est configurée pour traiter de telles données relatives à la séquence exécutable, selon un procédé de détection qui sera détaillé en FIG. 2 , de sorte à identifier un ensemble d’injections exécutables dans une telle séquence exécutable. L’unité mémoire 12 est configurée pour stocker des données et informations issues de l’interface d’entrée 10 et/ou de l’unité de traitement 11. L’unité de traitement 11 peut comprendre plusieurs modules de traitement 111, 112, 113, 114, 115, 116 (ou 111-116), dont les fonctionnements respectifs seront détaillés dans la FIG. 2 . Enfin l’interface de sortie 13 est configurée pour transmettre les données à l’issue du traitement par le système de détection 1. Une telle transmission, non représentée sur la FIG. 1 , peut être destinée au système informatique 2, au système utilisateur 3, au système de base de données 4, à un ou plusieurs autres systèmes tiers et/ou à un utilisateur via une interface homme-machine. Il est maintenant décrit des exemples d’exécution et d’interprétation de séquences exécutables par le système informatique 2. Une séquence exécutable peut être définie comme une succession ordonnée d’instructions exécutables permettant ou contribuant à la mise en œuvre d’un programme. Une telle séquence exécutable correspond typiquement à un bloc de code inclus dans un code source d’un programme. Une telle séquence exécutable est notamment rédigée dans un langage de programmation donné, plus simplement désigné par langage L. Un tel langage L peut par exemple correspondre à du PHP, Python, Java, C, HTML ou bien d’autres langages connus par exemple. Un tel langage L peut également correspondre à un langage spécifiquement développé pour un système informatique 2 ou une application spécifique. En particulier, le langage L de programmation utilisé dans la séquence exécutable est défini par une grammaire. Une telle grammaire correspond à des symboles combinés selon des règles, dites règles de réécriture de la grammaire, et qui permet d’engendrer l’ensemble des éléments (ou mots) du langage L de programmation. Par exemple, en référence à la FIG. 3 , il est illustré une séquence exécutable d’un système informatique 2 rédigée en langage PHP qui permet d’exécuter des requêtes utilisateur (« Request »sur la FIG. 2 ) en langage SQL. Une telle séquence exécutable est un programme configuré notamment pour authentifier un utilisateur qui renseigne un nom d’utilisateur (login?) et un mot de passe (pass?) via un système utilisateur 3. L’exécution de la séquence exécutable consiste à accéder à une base de données 4 stockant les noms d’utilisateur (login) et mots de passe (pass) des utilisateurs authentifiés et à renvoyer un résultat d’erreur (error) ou de connexion (connected) à l’utilisateur. Dans un autre exemple, en référence à la FIG. 5 , il est illustré une séquence exécutable rédigée en langage Python. Une telle séquence exécutable est un programme configuré notamment pour vérifier des données (représentant des paramètres id, temperature, carburant, panne) en entrée du programme et de stocker ces données sous un format de données (en l’occurrence, le format de données XML), sous la forme d’un fichier log. Dans le contexte de la présente description, les séquences exécutables considérées font intervenir des variables pouvant intégrer des données d’entrée. Autrement dit, la séquence exécutable inclut des points d’entrée, qui sont des portions de la séquence exécutable faisant intervenir, directement ou non, des variables correspondant à des données d’entrée de l’utilisateur. Par exemple, en référence à l’exemple de la FIG. 3 , la ligne d’instruction reproduite ci-dessous de la séquence exécutable est un point d’entrée : $r = db _query( “ select * from user where “login = ‘$login’ and pass = ‘$pass’”) En effet, la fonction db _ query comprend des variables login et pass qui prennent directement en entrée des données d’entrée d’utilisateurs (qui sont remplacées au niveau des éléments $login et $pass lors de l’exécution de la séquence exécutable). En référence à l’exemple de la FIG. 5 , les lignes 16, 17, 18, 19, 20 et 21 correspondent à des points d’entrée de la séquence exécutable. En effet, par exemple, les variables data1 , data2 et data3 prennent directement en entrée une donnée utilisateur (une valeur de température, de carburant et de panne respectivement) ; l’objet requete prend indirectement en entrée les données utilisateur des variables data1 , data2 et data3 . Par conséquent, la séquence exécutable peut être potentiellement vulnérable à des injections de code au niveau de tels points d’entrée. De telles injections de code peuvent être définies comme des éléments, exploitant le langage L de programmation utilisé, permettant de dénaturer l’exécution de la séquence exécutable ou son résultat lorsqu’ils sont exploités au niveau des points d’entrée de la séquence exécutable. En référence à la FIG. 3 , des exemples de données d’entrée ( client inputs ) formés par des couples ( login , pass ) sont illustrés. Dans le premier exemple de la FIG. 3 , le premier couple ( random , 123 ) renvoie un résultat error : de telles données d’entrée ne correspondent pas à un utilisateur authentifié (conformément au système de base de données 4) et le test d’authentification est correctement exécuté. Dans le deuxième exemple de la FIG. 3 , le deuxième couple ( john , 12gh3 ) renvoie un résultat connected : de telles données d’entrée correspondent à un utilisateur authentifié (conformément au système de base de données 4) et le test d’authentification est correctement exécuté. Cependant, dans le troisième exemple de la FIG. 3 , le troisième couple ( yes , x’ or ‘1’=’1 ) renvoie un résultat connected : de telles données d’entrée ne correspondent pourtant pas à un utilisateur authentifié (conformément au système de base de données 4). Dans ce dernier cas, la donnée d’entrée intégrée dans la séquence exécutable forme l’expression pass = ‘x’ or ‘1’=1’, qui est une assertion toujours vraie (elle résulte en booléen de type TRUE). Ainsi, l’authentification est validée de façon erronée. Ce dernier cas illustre un exemple d’injection de code dans la séquence exécutable de la FIG. 3 , exploitant la grammaire du langage L de programmation SQL de la requête. Dans un autre exemple, en référence à la FIG. 5 , la ligne 17 [data2 = " %s " % carburant] de la séquence exécutable fait intervenir une donnée d’entrée (qui est une donnée de carburant). Une injection de code pourrait par exemple consister à remplacer l’élément [%s] de la ligne 17 par l’ensemble : [80 " " il y a une panne " #], l’élément # indiquant que la suite des instructions est mise en commentaires (et ne fait donc plus partie de la séquence exécutable). Une telle injection modifierait alors le comportement de la séquence exécutable, qui considérerait alors systématiquement une donnée requete contenant une valeur temperature , une valeur carburant = 80 et une indication « il y a une panne » (alors même qu’avec la valeur temperature et la valeur carburant = 80 , aucune panne n’est normalement signalée). Le fonctionnement du système informatique 2 est alors dénaturé et les données stockées dans le format XML ont alors un contenu erroné. Le système de détection 1 et le procédé de la FIG. 2 proposés visent à détecter l’ensemble des injections de code possibles pour toute séquence exécutable. Il est maintenant fait référence à la FIG. 2 . La FIG. 2 détaille des étapes d’un procédé de détection d’injections de code d’une séquence exécutable, par exemple d’un système informatique 2, mis en œuvre par un système de détection 1 tel qu’illustré en FIG. 1 . Un exemple reposant sur les figures 4 et 5 servira de fil conducteur pour la mise en œuvre de chaque étape. Dans cet exemple, le système informatique 2 considéré peut être un serveur fonctionnant dans le cadre d’un service de log et configuré pour recevoir des données d’un (ou plusieurs) système utilisateur 3 correspondant à un véhicule. Un tel système utilisateur 3 est configuré pour envoyer (par exemple, périodiquement) des données de température du moteur, de niveau de carburant et de présence détectée d’une panne au système informatique 2. Le programme (et en particulier la séquence exécutable) considéré a pour objectif de stocker ces données au format XML dans un système de base de données 4 correspondant à un espace de stockage. Un tel espace de stockage peut notamment être stocké au niveau du serveur, du véhicule ou encore d’une entité tierce distante. La personne du métier comprendra que cet exemple ne se veut pas limitatif et que les étapes de la FIG. 2 s’appliquent pour tout (ou une pluralité de) système informatique 2 tel que schématisé en FIG. 1 et/ou pour toute (ou toute pluralité de) séquence exécutable d’un tel système informatique 2. À une étape 200, des données relatives à la séquence exécutable sont reçues, par exemple par l’interface d’entrée 10. De telles données reçues peuvent inclure les éléments de la séquence exécutable, par exemple le script contenant les lignes successives d’instructions. En particulier, la séquence exécutable est écrite dans un langage L de programmation défini au moins par des symboles et une grammaire (formelle). Par exemple, à l’étape 200, le script de la FIG. 5 détaillant la séquence exécutable (qui est une succession d’instructions sur les lignes 1 à 22) peut être reçu. Les données reçues à l’étape 200 peuvent inclure des informations relatives au langage L de programmation utilisé dans la séquence exécutable, par exemple des données relatives à l’ensemble de symboles, aux règles de la grammaire, de telles données permettant de définir la manière d’engendrer la séquence exécutable. Par exemple, à l’étape 200, le script de la FIG. 4 définissant la grammaire permettant d’engendrer l’ensemble des données au format XML peut être reçu. À une étape 210, à partir des données reçues à l’étape 200, la séquence exécutable peut être traitée, par exemple par un module de traitement de la séquence exécutable 111. Pour cela, une méthode d’interprétation abstraite ou encore une exécution symbolique peut être mise en œuvre sur la séquence exécutable, pour le langage L de programmation donné. Un tel traitement intègre une étape 211 et une étape 212. À l’étape 211, les éléments permettant de caractériser et de contraindre les données utilisateur dans la séquence exécutable sont identifiés et interprétés. Autrement dit, les contraintes C sur les variables impliquées dans la séquence exécutable sont identifiées. Par exemple, les contraintes C portant sur des variables d’une séquence exécutable peuvent porter sur un type de données d’entrée, un format de données d’entrée, une taille de données d’entrée, une valeur ou un ensemble de valeurs pouvant être prises par les données d’entrées et/ou un nombre minimal et/ou maximal de caractères par exemple. En référence à la FIG. 4 , l’étape 211 inclut par exemple d’identifier que les variables de la séquence exécutable sont id , temperature , carburant et panne et que ces variables sont respectivement un entier, un flottant, un entier et une chaîne de caractères. De plus, en référence à la FIG. 5 , l’analyse de la séquence exécutable à l’étape 211 inclut d’identifier que des contraintes C sont associées aux variables temp erature , carburant , panne . Aux lignes 3 et 13 de la séquence exécutable, une contrainte C associée à la variable temperature est que sa valeur est inférieure à 200.0. Aux lignes 7 et 14 de la séquence exécutable, une contrainte C associée à la variable carburant est que sa valeur est comprise entre 0 et 100. Aux lignes 10 et 15 de la séquence exécutable, une contrainte C est associée à la variable carburant : il s’agit d’une chaîne de caractères ne dépassant strictement pas 100 caractères. L’étape 211 peut notamment inclure de traduire les variables d’entrée de la séquence exécutable et leurs contraintes C dans un langage formel (notée L_x pour un élément x), par exemple sous la forme d’expressions rationnelles (également désignées par expressions régulières) pour les variables. Par exemple, en référence à l’exemple des figures 4 et 5 : la variable id peut être traduite par L_id = Σ * la variable temperature peut être traduite par L_temperature = ([0-9] | [1-9][0-9] | 1[0-9][0-9]) (. [0-9]+)? la variable carburant peut être traduite par L_carburant = [0-9] | [1-9][0-9] | 100 la variable panne peut être traduite par L_panne = Σ{0,99} À l’issue de l’étape 211, les variables d’entrée de la séquence exécutable ont été identifiées, caractérisées et formalisées en langage formel. À l’étape 212, au moins un point d’entrée de la séquence exécutable est identifié. Pour cela, l’unité de traitement 11 peut localiser l’intervention des variables dans la séquence exécutable et identifier les lignes appelant directement ou indirectement de telles variables. En particulier, un point d’entrée de la séquence exécutable peut correspondre aux éléments formant une requête dans la séquence exécutable, une telle requête appelant une ou plusieurs variables identifiées. Un tel point d’entrée peut correspondre à la portion (ou les portions) de la séquence exécutable dans laquelle les données d’entrée sont intégrées lors de l’exécution et de l’interprétation du script. Par exemple, en référence à la séquence exécutable de la FIG. 5 , les lignes 16 à 19 sont des points d’entrée. La ligne 21 comprend également un point d’entrée. Dans la suite et pour simplifier la description, le traitement d’un seul point d’entrée sera détaillé. Cependant, la suite du procédé peut être mise en œuvre sur chaque point d’entrée. Il est illustré l’exemple du point d’entrée de la ligne 21, en ce que l’élément requete % (id, data) appelle les quatre variables id , temperature , carburant et panne . À l’étape 212, le point d’entrée requete est identifié et traduit en langage formel : L_requete = 0 .* .* .* .* En effet, l’élément requete prend deux variables : id (%d de la ligne 20) et data ( %s de la ligne 20 ) , ce dernier prenant lui-même les valeurs des variables temperature , carburant et panne . Les éléments notés « .* » correspondent alors à l’emplacement, dans le langage formel, des données utilisateur dans le point d’entrée requete . L’étape 212 permet alors d’identifier, dans le point d’entrée ainsi traduit, un motif M, correspondant à une succession de symboles ordonnés dans le langage L utilisé par la séquence exécutable. Le motif M de l’élément requete correspond aux symboles formant l’élément L_requete. Ici, le motif M comprend vingt-et-un symboles : , , , 0, , , , .*, , , .*, , , .*, , , .*, , , et . Pour simplifier la suite de la description, la notation L_requete pourra désigner de façon confondue le point d’entrée requete et son motif M en langage formel. À une étape 220, le motif M identifié à l’étape 200 est traité, par exemple par un module de traitement du motif M 112. Un tel traitement intègre une étape 221 et une étape 222 permettant de décomposer le motif M en radicaux et points d’injection. Pour cela, une méthode d’interprétation abstraite ou encore une exécution symbolique peut être mise en œuvre sur le motif M, pour le langage L de programmation donné. À l’étape 221, des radicaux sont identifiés dans le motif M. De tels radicaux correspondent à des parties fixes du motif M, qui ne peuvent être dénaturées. Autrement dit, de tels radicaux sont une succession de symboles invariables du motif M. Par exemple, le motif L_requete présente cinq radicaux distincts : Radical 1 : ^ 0 Radical 2 : Radical 3 : Radical 4 : Radical 5 : $ Le marqueur « ^ » représente le début du motif M et le marqueur « $ » représente la fin du motif M. De tels radicaux sont alors ordonnés. À l’étape 222, des points d’injection sont identifiés dans le motif M. De tels points d’injection correspondent aux parties variables du motif M, qui peuvent potentiellement dénaturer le contenu du motif M, notamment en fonction du contenu des données d’entrée injectées. Il s’agit par ailleurs des points au niveau desquels des injections de codes interviennent dans la séquence exécutable. Autrement dit, les points d’injection sont les portions du motif M au niveau desquelles des données d’entrée peuvent compléter le motif M lors de l’exécution et de l’interprétation de la séquence exécutable. En particulier, les radicaux correspondent aux portions du motif M séparés par les points d’injection. Par exemple, le motif L_requete présente quatre points d’injection, représentés par les marqueurs « .* ». Les quatre points d’injection représentés dans le motif L_requete correspondent notamment aux points d’entrée respectifs des éléments de données L_id, L_temperature, L_carburant et L_panne. Ainsi, à l’issue de l’étape 220, le motif M identifié est décomposé en des radicaux et des points d’injection. À une étape 230, la séquence exécutable est traitée à l’échelle des symboles, par exemple par un module de traitement des symboles 113 de l’unité de traitement 11. En particulier, à l’étape 230, les symboles combinés dans la séquence exécutable selon la grammaire du langage L utilisé peuvent être associés à des labels. Dans la suite de la description, les labels correspondront à des indices numériques (ou index). Cependant, dans d’autres modes de réalisation, les labels peuvent correspondre à d’autres valeurs ou éléments (par exemple, des lettres d’un alphabet donné). Dans ce cas, la notion de labels successifs peut être définie selon un premier critère prédéfini (par exemple, un pas donné dans l’ensemble ordonné de valeurs pouvant être prise par ces labels). Les symboles sont dits étiquetés avec l’indice numérique, de sorte que le système de détection 1 est configuré pour enregistrer une mise en correspondance entre un indice numérique et un symbole. Une telle étape 230 inclut une étape 231 de traitement des symboles des radicaux déterminés à l’étape 221, une étape 232 de traitement des symboles des expressions des variables déterminées à l’étape 211 et une étape 233 de traitement des symboles des règles de réécriture de la grammaire utilisée par le motif M. En particulier, le traitement des symboles dépend de la définition des symboles au sein du langage L utilisé par la séquence exécutable. Un symbole correspond à un élément unitaire, de base du langage L. Dans l’exemple des figures 4 et 5, un élément balisé (par exemple ou encore ) est considéré comme un symbole. Ainsi, la grammaire permettant d’engendrer l’ensemble du langage L telle qu’illustrée par les règles en FIG. 4 permet de réécrire ces symboles (et plus précisément les symboles non-terminaux). Dans un autre mode de réalisation, un symbole pourrait être . Dans ce cas, les étapes 230 et suivantes sont adaptées à une telle granularité et à la définition du symbole dans le langage L utilisé. À l’étape 231, les symboles des radicaux sont associés à des indices numériques de même première parité. Par exemple, tous les indices numériques associés aux symboles des radicaux sont impairs. De plus, pour chaque radical considéré du motif M, les symboles du radical considéré sont associés à des mêmes indices numériques. Par exemple, chacun des radicaux du motif L_requete peut s’écrire avec des indices numériques (indicés au niveau de chaque symbole du radical) de la façon suivante : Radical 1 : ^ 1 1 1 0 1 1 1 1 Radical 2 : 3 3 Radical 3 : 5 5 Radical 4 : 7 7 Radical 5 : 9 9 9 9 $ À l’étape 232, les symboles des expressions régulières traduisant les variables et leurs contraintes C dans la séquence exécutable sont associés à des indices numériques de même deuxième parité (distincte de la première parité). Par exemple, tous les indices numériques associés aux symboles des expressions régulières des variables sont pairs. De plus, pour chaque expression régulière associée à une variable considérée, les symboles de l’expression régulière considérée sont associés à des mêmes indices numériques. Par exemple, chacun des radicaux des éléments L_id, L_temperature, L_carburant et L_panne peuvent s’écrire avec des indices numériques (indicés au niveau de chaque symbole de l’élément) de la façon suivante : L_id = Σ 2 * L_temperature = ([0-9] 4 | [1-9] 4 [0-9] 4 | [1-2] 4 [0-9] 4 [0-9] 4 ) (. 4 [0-9] 4 +)? L_carburant = [0-9] 6 | [1-9] 6 [0-9] 6 | 1 6 0 6 0 6 L_panne = Σ 8 {0,99} À l’étape 233, les symboles formant les règles de réécriture de la grammaire sont également associés à des indices numériques. En particulier, une telle grammaire, qui est la grammaire initiale permettant d’engendrer, entre autres, le motif M considéré dans la séquence exécutable au format considéré (sur les figures 4 et 5, le XML), est associée à un même indice numérique initial, par exemple 1. Ainsi, en référence aux règles de la grammaire illustrée en FIG. 4 , l’étape 233 permet d’écrire : S → 1 N 1 N → 1 1 entier 1 1 N 1 N → 1 1 entier 1 1 L 1 N → N N L → L L D → D D → 1 flottant 1 1 D → 1 entier 1 1 D → 1 chaine_de_caracteres 1 1 D → 1 entier 1 1 La grammaire ainsi étiquetée à l’issue de l’étape 233 correspond à une grammaire initiale (i.e., un ensemble de règles de réécriture initiales), notée G 1 , qui permet notamment d’engendrer les éléments de la séquence exécutable au format XML, par exemple le motif L_requete. À une étape 240, une grammaire permettant d’engendrer toutes les données au format de la séquence exécutable qui contiennent les radicaux du motif M est déterminée. Une telle grammaire est qualifiée de grammaire exécutable. Autrement dit, l’étape 240 vise à déterminer de façon formelle et exhaustive l’ensemble des éléments permettant de compléter le motif M de façon syntaxiquement correcte. Une donnée issue d’une telle grammaire exécutable contient alors les radicaux du motif M ainsi que les données utilisées pour compléter ce motif M. Pour cela, la grammaire initiale est utilisée et progressivement spécifiée par rapport à chacun des radicaux du motif M. Autrement dit, l’étape 240 est une étape formée d’itérations sur chacun des radicaux du motif M, de sorte à générer une succession de grammaires G 2, G 3 , …, , G j à partir des règles de réécriture de la grammaire initiale G 1 (e.g., les règles de réécriture de la FIG. 4 ). Chaque grammaire G j est spécifiée (donc en générant une grammaire G j+1 ) de sorte que chaque mot (ou élément) engendré contienne les j premiers radicaux du motif M dans leur ordre d’apparition dans le motif M, (où j est un entier naturel supérieur à 1). Ainsi, à l’étape 240, chaque itération j va ajouter de nouvelles règles et de nouveaux symboles à la grammaire G j , de sorte que la grammaire générée G j+1 qui en découle intégrera ces nouvelles règles et ces nouveaux symboles. De par la construction de chaque grammaire et de la définition des indices numériques à l’étape 230, chaque élément (ou terminal) de la grammaire G j est associé à un indice numérique compris entre 1 et (2j-1). En particulier, à l’étape 240, des nouveaux symboles pour la grammaire G j+1 peuvent être créés et nommés de la façon suivante, pour un symbole X de la grammaire G j considérée : : nouveau symbole se réécrivant selon les mêmes règles de réécriture que le symbole X, mais en engendrant le j -ème radical, : nouveau symbole se réécrivant selon les mêmes règles de réécriture que le symbole X, mais en engendrant le suffixe du j -ème radical, en préfixe en position k du nouveau symbole, : nouveau symbole se réécrivant selon les mêmes règles de réécriture que le symbole X, mais en engendrant le préfixe du j -ème radical, en préfixe en position k du nouveau symbole, : nouveau symbole se réécrivant selon les mêmes règles de réécriture que le symbole X, mais en engendrant des éléments associés à un indice numérique (2j+1). Ainsi, compte tenu des nouveaux symboles pouvant être créés, chaque élément de la grammaire G j +1 est associé à un indice numérique compris entre 1 et (2j+1). Il est détaillé à présent la première itération mise en œuvre lors de l’étape 240, permettant de passer de la grammaire initiale G 1 à une deuxième grammaire G 2 . Pour cela, on considère le premier radical : Radical 1 : [ 1 1 1 0 1 1 1 1 ]. Une telle première itération est particulière en ce que le Radical 1 apparaît en préfixe des données générées. En particulier, pour une telle première itération, le nouveau symbole n’apparaît pas, par définition, puisqu’aucun élément ne vient en amont du Radical 1. La première itération débute avec l’élément (non-terminal) S de la grammaire initiale (ligne 1 de la FIG. 4 ). Un tel élément S peut engendrer des éléments combinés (mots) contenant ou non le Radical 1. Il s’agit alors de construire une deuxième grammaire G 2 dans laquelle le nouveau symbole se réécrivant selon les mêmes règles de réécriture que S mais en contenant le Radical 1, c’est-à-dire le nouveau symbole (non terminal) . L’élément S dérive le premier radical en préfixe avec la première règle de la ligne 1 de la FIG. 4 : [S→ 1 N 1 ]. Une telle règle contient une partie gauche (S) et une partie droite ( 1 N 1 ) de réécriture. L’élément 1 en première position de la partie droite engendre par égalité le préfixe 1 du Radical 1. L’élément 1 de la première règle étant égal au préfixe 1 du Radical 1, la nouvelle première règle traduit cet élément en 2 , en incrémentant de un l’indice numérique associé à l’élément 1 . L’élément (non terminal) N en deuxième position de la partie droite engendre le suffixe 1 1 0 1 1 1 1 du Radical 1, après le premier élément (préfixe) de ce Radical 1. La nouvelle première règle traduit donc l’élément N en . L’élément 1 de la première règle étant engendré après le Radical 1, la nouvelle première règle traduit un tel élément en 3 , en incrémentant de deux l’indice numérique associé à l’élément 1 . La nouvelle première règle suivante est donc générée : [ → 2 3 ] Une telle nouvelle première règle introduit le nouvel élément (non-terminal) , qui doit être construit à partir des règles de N dans la grammaire initiale G 1 (i.e., les lignes 2 à 4 de la FIG. 4 ), afin que engendre le suffixe 1 1 0 1 1 1 1 du Radical 1 en première position de . L’élément (non terminal) N engendre le suffixe 1 1 0 1 1 1 1 du Radical 1 avec la deuxième règle : [N→N N] (ligne 4 de la FIG. 4 ). Une telle deuxième règle contient une partie gauche (N) et une partie droite (N N) de réécriture. L’élément N en première position de la partie droite engendre le suffixe 1 1 0 1 1 1 1 du Radical 1. Ainsi, la nouvelle deuxième règle générée traduit un tel élément en . L’élément N en deuxième position de la partie droite étant engendré en aval du Radical 1, la nouvelle deuxième règle générée traduit un tel élément en . La nouvelle deuxième règle suivante est donc générée : [ → ] Une telle nouvelle deuxième règle introduit le nouvel élément (non-terminal) , qui est construit selon les mêmes règles de réécriture que le symbole N (donc génère le même langage L que N), dans la grammaire initiale G 1 (i.e., les lignes 2 à 4 de la FIG. 4 ), mais en engendrant des éléments associés à un indice numérique (2j+1, i.e., 3 ici), et non avec un indice numérique 1 (comme c’est le cas de N dans la grammaire initiale G 1 ). L’élément (non terminal) N engendre le suffixe 1 1 0 1 1 1 1 du Radical 1 avec la deuxième règle : [N→ 1 1 entier 1 1 N 1 ] (ligne 2 de la FIG. 4 ). Une telle deuxième règle contient une partie gauche (N) et une partie droite ( 1 1 entier 1 1 N 1 ) de réécriture. L’élément [ 1 1 entier 1 1 ], formée par les quatre premiers symboles de la partie droite engendre les deuxième à cinquième symboles [ 1 1 0 1 1 ] formant le Radical 1. L’élément N correspondant au cinquième symbole de la partie droite, engendre le suffixe [ 1 1 ] du Radical 1. La nouvelle troisième règle suivante est donc générée : [ N > → 2 2 0 2 2 N > 3 ]. Une telle nouvelle troisième règle introduit le nouvel élément (non-terminal) , qui doit être construit à partir des règles de N dans la grammaire initiale G 1 (i.e., les lignes 2 à 4 de la FIG. 4 ), afin que engendre le suffixe 1 1 du Radical 1 en sixième position de (car jusqu’à la cinquième position, les symboles précédents sont engendrés notamment par les symboles [ 1 1 entier 1 1 ] de la partie droite). L’élément (non terminal) N engendre le suffixe 1 1 du Radical 1 avec la quatrième règle : [N→N N] (ligne 4 de la FIG. 4 ). Une telle deuxième règle contient une partie gauche (N) et une partie droite (N N) de réécriture. L’élément N en première position de la partie droite engendre le suffixe [ 1 1 ] du Radical 1. La nouvelle quatrième règle suivante est donc générée : [ → ]. L’élément N engendre le suffixe [ 1 1 ] du Radical 1 avec la troisième règle : [N → 1 1 entier 1 1 L 1 ] (ligne 3 de la FIG. 4 ). Une telle troisième règle contient une partie gauche (N) et une partie droite ( 1 1 entier 1 1 L 1 ) de réécriture. L’élément [ 1 1 ] formant les deux premiers symboles de la partie droite engendre le suffixe [ 1 1 ] du Radical 1. La nouvelle cinquième règle suivante est donc générée : [ → 2 2 'entier 3 3 3 ]. L’élément N engendre le suffixe [ 1 1 ] du Radical 1 avec la deuxième règle [N → 1 1 entier 1 1 N 1 ] (ligne 2 de la FIG. 4 ). Une telle deuxième règle contient une partie gauche (N) et une partie droite ( 1 1 entier 1 1 N 1 ) de réécriture. L’élément [ 1 1 ] formant les deux premiers symboles de la partie droite, engendre le suffixe [ 1 1 ] du Radical 1. La règle suivante est donc générée : [ → 2 2 entier 3 3 3 ]. Une telle première itération permet alors d’aboutir à une grammaire G 2 , spécifiée par rapport à la grammaire initiale G 1 en prenant en compte le premier radical. Un ensemble de nouvelles règles et des nouveaux symboles (non terminaux) de formes , (ou k est un entier naturel), ou encore sont créés. Les itérations suivantes pour aboutir aux grammaires suivantes spécifiées par rapport à chacun des radicaux Radical 2, Radical 3, Radical 4 et Radical 5 sont mises en œuvre sur le même principe que la première itération. Afin de faciliter la visualisation du résultat de chaque itération sur chaque radical, il est présenté la forme générale des éléments obtenus par réécriture avec chaque nouvelle grammaire itérativement déterminée, sur la base d’un exemple formel (afin de simplifier l’écriture). Pour simplifier l’écriture formelle dans la suite de cette étape 240, on note (a, b, c, d) les radicaux et (v, w, x, y, z) les points d’injection d’un motif M considéré dans une séquence exécutable. L’étape 240 mise en œuvre dans un tel exemple formel vise alors à déterminer l’ensemble des injections exécutables dans les différents points d’injections (v, w, x, y, z). L’ordre des injections exécutables (correspondent à des données injectables au niveau des points d’injections) est alors représenté par l’ordre d’apparition dans la forme générale représentée ci-après. La forme générale des éléments illustrée ci-après permet de représenter successivement la forme des mots obtenus par la grammaire correspondante après chaque intersection avec un radical, ainsi que leurs indices numériques respectifs, qui servent de points de repère dans la mise en œuvre des intersections successives. Chaque intersection est mise en œuvre comme détaillé précédemment pour la première itération (pour le Radical 1). À la première itération, la grammaire initiale G 1 engendre la forme générale d’éléments associés respectivement à des indices numériques suivante : v1 a1 w1 b1 x1 c1 y1 d1 z1. Ainsi, v1 donne la forme générale de la première donnée injectable, w1 celle de la deuxième donnée injectable etc. Une telle forme générale peut comprendre un ou plusieurs terminaux. Par exemple, v1 correspondant à la première donnée injectable peut s’écrire sous la forme d’un ou plusieurs terminaux. Une telle forme des éléments engendrés par la grammaire initiale G 1 est ensuite intersectée, lors de la première itération, avec le radical a indicé avec la valeur 1. Les terminaux en amont du radical ont un indice numérique inférieur ou égal à 1 et conservent cette marque. Les terminaux en aval du radical ont un indice numérique égal à 1 qui est mis à jour avec la valeur 3 (i.e., 2x1+1) à l’issue de la première itération. Autrement dit, à l’issue de la première itération sur le radical a, la seconde grammaire G 2 obtenue engendre la forme générale d’éléments avec les indices numériques suivants : v1 a2 w3 b3 x3 c3 y3 d3 z3. Une telle forme des éléments engendrés par la seconde grammaire G 2 est ensuite intersectée, lors de la deuxième itération, avec le radical b indicé avec la valeur 3. Les terminaux en amont du radical ont un indice numérique inférieur ou égal à 3 et conservent cette marque. Les terminaux en aval du radical ont un indice numérique égal à 3, qui est mis à jour avec la valeur 5 (i.e., 2x2+1) à l’issue de la deuxième itération. Autrement dit, à l’issue de la deuxième itération sur le radical b, la troisième grammaire G 3 obtenue engendre la forme générale d’éléments avec les indices numériques suivants : v1 a2 w3 b4 x5 c5 y5 d5 z5. Une telle forme des éléments engendrés par la troisième grammaire G 3 est ensuite intersectée, lors de la troisième itération, avec le radical c indicé avec la valeur 5. Les terminaux en amont du radical ont un indice numérique inférieur ou égal à 5 et conservent cette marque. Les terminaux en aval du radical ont un indice numérique égal à 5, qui est mis à jour avec la valeur 7 (i.e., 2x3+1) à l’issue de la deuxième itération. À l’issue de la troisième itération sur le radical c, la quatrième grammaire G 4 obtenue engendre la forme générale d’éléments avec les indices numériques suivants : v1 a2 w3 b4 x5 c6 y7 d7 z7. Une telle forme des éléments engendrés par la quatrième grammaire G 4 est ensuite intersectée, lors de la quatrième itération, avec le radical d indicé avec la valeur 7. Les terminaux en amont du radical ont un indice numérique inférieur ou égal à 7 et conservent cette marque. Les terminaux en aval du radical ont un indice numérique égal à 7, qui est mis à jour avec la valeur 9 (i.e., 2x4+1) à l’issue de la quatrième itération. Autrement dit, à l’issue de la quatrième itération sur le dernier radical d, la cinquième grammaire G 5 obtenue engendre la forme générale d’éléments avec les indices numériques suivants : v1 a2 w3 b4 x5 c6 y7 d8 z9. Suite à l’itération de l’indice du dernier radical, la grammaire G 5 correspond au langage L des données qui permettent de compléter le motif M sans générer une erreur de syntaxe. Par conséquent, l’étape 240 permet de déterminer une grammaire dite exécutable, qui engendre des éléments respectant la grammaire initiale G 1 (et donc le langage L utilisé par la séquence exécutable) et qui contient les radicaux du motif M. Dans l’exemple formel précédent, la grammaire G 5 correspond à la grammaire exécutable obtenue à l’issue de l’étape 240 et l’ensemble des injections exécutables est obtenu à partir de la forme générale associée à une telle grammaire G 5 . Autrement dit, l’étape 240 permet de déterminer formellement l’ensemble des injections (i.e., une forme générale de ces injections, ou mots) qui permet de compléter le motif M au niveau des points d’injection en respectant la grammaire de la séquence exécutable. À l’issue de l’étape 240, les expressions régulières correspondant aux contraintes C sur les variables (et donc sur le contenu des points d’injection) ne sont pas encore prises en compte. L’étape 240 permet d’aboutir de façon formelle à une grammaire exécutable (i.e., un ensemble de règles de réécriture) permettant d’engendrer l’ensemble des injections exécutables syntaxiquement au niveau des points d’injection (e.g., au niveau des marqueurs .* dans le motif M L_requete), au regard des radicaux voisins en amont (i.e., en préfixe) et aval (i.e., en suffixe) de ces points d’injection dans le motif M. Néanmoins, les contraintes C appliquées au formalisme du contenu de ces points d’injection n’est pas encore pris formellement en considération à ce stade. À une étape 250, une intersection, ou un filtrage, des éléments engendrés par la grammaire exécutable avec les expressions formelles des contraintes C sur les données d’entrée est mise en œuvre. Dans l’exemple des figures 4 et 5, l’expression formelle des éléments engendrés par la grammaire exécutable déterminée à l’étape 240 est intersectée avec les expressions L_id, L_temperature, L_carburant et L_panne. Pour cela, les expressions étiquetées à l’étape 232 sont utilisées. L’intersection de l’expression formelle des éléments engendrés par la grammaire exécutable et des expressions régulières L_id, L_temperature, L_carburant et L_panne s’appuie alors sur les indices numériques d’une part, des éléments engendrés par la grammaire exécutable tels que déterminés à l’issue de l’étape 240, et d’autre part, des expressions régulières correspondant aux données d’entrée. Une telle intersection permet alors de réduire la quantité et la diversité d’éléments effectivement exploitables dans chaque point d’injection par rapport aux éléments pouvant être engendrés par la grammaire exécutable. Par exemple, on considère d’une part la forme générale des éléments engendrés par la grammaire exécutable déterminée avec les radicaux du motif L_requete, c’est-à-dire : v1 a2 w3 b4 x5 c6 y7 d8 z9. On considère d’autre part l’expression régulière étiquetée associée à un point d’injection donné du motif L_requete, par exemple, le deuxième point d’injection associé à l’élément L_temperature : L_temperature = ([0-9] 4 | [1-9] 4 [0-9] 4 | [1-2] 4 [0-9] 4 [0-9] 4 ) (. 4 [0-9] 4 +)? L’indice 4 d’une telle expression régulière permet alors de filtrer les éléments engendrés par la grammaire exécutable qui concernent le deuxième point d’injection. Un tel filtrage peut par exemple être mis en œuvre par tout algorithme de filtrage ou d’intersection connu. L’étape 250 permet alors d’aboutir à une grammaire finale, qui engendre l’ensemble des injections exécutables syntaxiquement dans le motif M et qui répondent aux contraintes C du contenu des points d’injection. Dans un mode de réalisation de l’étape 250, une telle intersection peut requérir un temps d’exécution considérable, du fait de la dimension des espaces des éléments engendrés par la grammaire exécutable d’une part, et du degré de contraintes C sur les données d’entrées. Afin de réduire un tel temps d’exécution, l’étape 250 peut inclure une relaxation (ou sur-approximation) des contraintes C sur les données d’entrée, de sorte à réduire le degré de précision du filtrage au profit d’un meilleur temps d’exécution. En particulier, une telle relaxation des contraintes C peut se traduire par la considération d’expression régulières modifiées (dites deuxièmes expressions régulières) associées aux contraintes C relaxées par rapport aux contraintes C exactes (associées à des premières expressions régulières telles que déterminées à l’étape 211). Des deuxièmes expressions régulières associées aux éléments L_id, L_temperature, L_carburant et L_panne peuvent par exemple être exprimées par : L_id = Σ 2 * L_temperature = [0-9.] 4 * L_carburant = [0-9] 6 {1,3} L_panne = Σ 8 {0,99} Dans un tel mode de réalisation où les contraintes C sur les données d’entrée sont sur-approximées, l’ensemble des injections exploitables déterminé devient plus large en ce qu’il englobe des faux-positifs (i.e., des injections qui valident les contraintes C relaxées mais qui ne valident en réalité par les contraintes C exactes des données d’entrée). Cependant, la détection des injections exploitables reste exhaustive en ce que l’ensemble des injections exploitables déterminé n’inclut pas de faux-négatifs (i.e., d’injections exploitables qui ne seraient pas décrits par la forme générale des éléments engendrés par la grammaire finale). Ainsi, à l’issue de l’étape 250, l’ensemble des injections exploitables dans la séquence exécutable (plus précisément, dans le ou chaque motif M de la séquence exécutable) est déterminé. Un tel ensemble d’injections exploitable peut être exprimé par l’ensemble de symboles du langage L utilisé dans la séquence exploitable et la grammaire finale, ou encore par une forme générale des éléments engendrés par une telle grammaire finale. Par conséquent, pour chaque point d’injection de la séquence exécutable, le procédé de détection proposé permet, à l’issue de l’étape 250, d’identifier de façon exhaustive toutes les combinaisons de symboles formant des injections exploitables au niveau de ce point d’injection. À une étape 260, optionnelle, l’ensemble des injections exploitables est analysé ou exploité, par exemple par un module d’interprétation 116 de l’unité de traitement 11. Une telle étape 260 peut par exemple être à des fins de développement, d’analyse du code, de test d’injection de code, d’analyse de risque, d’audit de vulnérabilité. Dans un mode réalisation, l’ensemble des injections exploitables peut être utilisé pour générer aléatoirement des entrées dans le cadre du fuzzing , ce qui permet d’améliorer la qualité des entrées testées, puisqu’elles sont sélectionnées parmi un ensemble effectivement exploitable. L’ensemble des injections exploitables peut également être utilisé à titre d’outil de vérification dans le cadre du développement logiciel, afin d’améliorer la robustesse et/ou de réduire le degré de vulnérabilité du code source. L’ensemble des injections exploitables peut également être utilisé pour une analyse de risque de compromission du système informatique 2, en analysant le contenu des injections exploitables. Par exemple, l’étape 260 peut inclure l’attribution d’indices de vulnérabilité ou la hiérarchisation des injections exploitables, qui vise à quantifier le degré de compromission de la séquence exécutable si une telle injection était exploitée. Par exemple, dans le langage SQL, une injection exploitable incluant le symbole « DROP » peut être considéré comme rendant la séquence exécutable vulnérable. Le procédé proposé permet ainsi de formaliser la détection des injections, de sorte à permettre une détection exhaustive, systématique et applicable à tout langage L de programmation. En effet, au même titre que le contenu de la séquence exécutable, le langage L employé est une entrée du système de détection 1 puisque celui-ci met en œuvre des traitements selon un langage formel (i.e., en formalisant les symboles et les règles de réécriture du langage L et de sa grammaire formelle). Procédé mis en œuvre par des moyens informatiques pour déterminer un ensemble d’injections exploitables dans une séquence exécutable, la séquence exécutable utilisant un langage (L), le procédé comprenant : a) déterminer au moins un point d’entrée de la séquence exécutable, b) déterminer, à partir dudit point d’entrée, un motif (M) comprenant au moins un point d’injection de la séquence exécutable, le motif respectant le langage (L) de la séquence exécutable, c) pour chaque point d’injection, extraire un ensemble de contraintes (C) associé au point d’injection, d) déterminer, pour chaque point d’injection, l’ensemble d’injections exploitables à partir du motif (M) auquel appartient le point d’injection, de l’ensemble de contraintes (C) associé et du langage (L). Procédé selon la revendication 1, le langage (L) étant formé de symboles et construit selon un ensemble de règles (G 1 ), le motif (M) étant construit par une succession de symboles respectant ledit ensemble de règles (G 1 ), et dans lequel l’ensemble des injections exploitables est déterminé à l’étape d) par la génération de symboles générés injectables au motif (M), lesdits symboles générés étant injectables au niveau de l’au moins un point d’injection du motif (M), à partir des symboles du motif (M) et respectant l’ensemble de règles (G 1 ) et l’ensemble de contraintes (C). Procédé selon la revendication 2 comprenant en outre, après l’étape b) : b1) déterminer, pour le motif (M) de la séquence exécutable, une pluralité de radicaux correspondant à des portions invariables du motif (M), deux radicaux voisins du motif (M) étant séparés par un point d’injection, et dans lequel l’étape d) comprend : d10) une comparaison itérative de chaque radical de la pluralité de radicaux du motif (M) avec l’ensemble de règles (G 1 ). Procédé selon la revendication 3, dans lequel chaque itération de l’étape d10) pour chaque radical considéré est associée à la génération d’un ensemble de symboles générés comprenant le radical considéré. Procédé selon la revendication 4 comprenant en outre : d11) une spécification itérative de l’ensemble de règles (G 1 ) à chaque radical de la pluralité de radicaux du motif (M) résultant en des ensembles de règles spécifiées (G 2 , G 3 ,…), chaque ensemble de règles spécifiées (G 2 , G 3 ,…) engendrant l’ensemble de symboles générés comprenant le radical considéré. Procédé selon la revendication 5, les radicaux du motif (M) étant formés par une succession de symboles, et dans lequel l’étape d) comprend en outre : d101) associer les symboles des radicaux du motif (M) à des premiers labels, les symboles d’un même radical étant associé au même premier label, les symboles respectifs des radicaux voisins étant associés à des premiers labels successifs selon un premier critère, d102) associer les symboles formant l’ensemble de règles (G 1 ) à un même label initial, et dans lequel chaque ensemble de symboles générés et chaque ensemble de règles spécifiées (G 2 , G 3 ,…) sont associés à des labels générés dépendant des premiers labels des radicaux du motif (M) et du label initial de l’ensemble de règles (G 1 ), l’étape d) comprenant : d12) une mise à jour itérée des labels générés en fonction d’un résultat de chaque itération des étapes d10) et d11), d13) une identification des éléments des ensembles de symboles générés ayant des labels générés différents des premiers labels. Procédé selon l’une des revendications précédentes, dans lequel l’étape d) comprend : d1) à partir du motif (M) et du langage (L), déterminer un ensemble d’injections exécutables, d2) filtrer l’ensemble des injections exécutables en fonction de l’ensemble de contraintes (C) associé de sorte à obtenir l’ensemble d’injections exploitables, l’ensemble des injections exploitables étant de dimension inférieure à l’ensemble des injections exécutables. Procédé selon la revendication 7 combinée aux revendications 2 à 6, dans lequel la détermination de l’ensemble d’injections exécutables résultent des étapes d10), d11), d101), d102), d12) et d13). Procédé selon la revendication 7 dans lequel le filtrage de l’étape d2) est mis en œuvre à partir d’un ensemble élargi de contraintes (C’) incluant ledit ensemble de contraintes (C). Procédé selon l’une des revendications 7 à 9 et comprenant en outre, après l’étape c), : c1) convertir, pour chaque point d’injection, l’ensemble de contraintes (C) associé en un premier ensemble d’expressions régulières, et dans lequel l’ensemble d’injections exploitables correspond aux injections exécutables filtrées selon un ensemble d’expressions régulières parmi le premier ensemble d’expressions régulières et un deuxième ensemble d’expressions régulières sur-approximé par rapport au premier ensemble d’expressions régulières. Procédé selon la revendication 10 prise en combinaison avec la revendication 6, chaque expression régulière de l’ensemble d’expressions régulières étant formée par une succession de symboles, et dans lequel l’étape d2) comprend en outre : d21) associer les symboles de chacune des expressions régulières de l’ensemble d’expressions régulières à des deuxièmes labels, les symboles d’une même expression régulière étant associés au même deuxième label, les symboles respectifs de deux expressions régulières voisines dans l’ensemble d’expressions régulières étant associés à des deuxièmes labels successifs selon un deuxième critère, d22) comparer les deuxièmes labels de chacune des expressions régulières de l’ensemble d’expressions régulières avec les labels générés à l’issue de l’étape d12), d23) déterminer l’ensemble d’injections exploitables à partir des éléments des ensembles de symboles générés associés aux labels générés correspondant aux deuxièmes labels. Procédé selon l’une des revendications précédentes et comprenant en outre : e) à partir de l’ensemble d’injections exploitables, mettre en œuvre une analyse de vulnérabilité de la séquence exécutable. Procédé selon l’une des revendications précédentes et comprenant en outre : e’) attribuer des indices de vulnérabilité respectivement associés à chaque injection exploitable de l’ensemble d’injections exploitables, ledit indice de vulnérabilité étant déterminé à partir du motif (M) complété par l’injection exploitable au niveau du point d’injection correspondant. Programme informatique comportant des instructions pour la mise en œuvre du procédé selon l’une des revendications 1 à 13 lorsque ce programme est exécuté par un processeur. Support d’enregistrement non transitoire lisible par un ordinateur sur lequel est enregistré un programme pour la mise en œuvre du procédé selon l’une des revendications 1 à 13 lorsque ce programme est exécuté par un processeur.