Brevet FR3147397A1 — publié le 20241004

Selon un aspect, il est proposé un système informatique comprenant : - une mémoire (MEM) configurée pour stocker un produit programme d’ordinateur (PRG), - un processeur (PROC) configuré pour exécuter ledit produit programme d’ordinateur, - un circuit de mémoire (CMEM), ledit produit programme d’ordinateur comprenant : ● au moins une instruction configurée pour dupliquer dans ledit circuit de mémoire une adresse de retour définie lors de l’appel de fonction, et ● au moins une instruction configurée pour comparer une valeur de l’adresse de retour stockée dans une pile d’appel à la valeur de l’adresse de retour dupliquée dans ledit circuit de mémoire (CMEM) et pour permettre d’effectuer un branchement de retour de fonction uniquement si ces deux valeurs sont identiques. Figure pour l’abrégé : Figure 1 SYSTÈME INFORMATIQUE CONFIGURÉ POUR EXÉCUTER UN PROGRAMME D’ORDINATEUR Des modes de réalisation et de mise en œuvre concernent les systèmes informatiques, et plus particulièrement l’exécution de programmes sur de tels systèmes informatiques. Les programmes d’ordinateur comprennent des instructions qui, peuvent être exécutées par un ordinateur. Un programme d’ordinateur comprend des fonctions (appelées également « sous-programmes » ou « sous-routines », en anglais « subroutines »). Une fonction est une séquence d’instructions utilisée pour exécuter une tâche spécifique. Par exemple, la tâche d’une fonction peut être de réaliser un calcul donné, d’écrire un fichier sur un disque dur, ou encore de communiquer avec un périphérique, etc. Afin d’utiliser une fonction, un programme est configuré pour appeler cette fonction. L’appel d’une fonction consiste à exécuter un branchement dont l’adresse mémoire de destination est celle de la fonction. Une fonction se termine par un branchement, qui permet à l’ordinateur de revenir à l’adresse mémoire, dite adresse de retour, correspondant à l’adresse de l’instruction qui suit le branchement d’appel de fonction. Cette adresse de retour est mémorisée lors de l’appel de la fonction de manière à être récupérée pour réaliser, à la fin de l’exécution de cette fonction, un retour de ladite fonction pour continuer l’exécution du programme. Plus particulièrement, le programme utilise une pile d’appel (désignée également par l’expression « pile d’exécution ») de l’ordinateur à chaque appel de fonction. La pile d’appel permet de stocker les informations requises pour réaliser l’appel de fonction : l'adresse de retour, les arguments/paramètres, la copie de sauvegarde des registres du processeur, les variables locales, etc. Selon la fonction exécutée, la pile d’appel peut être adaptée pour recevoir des données provenant de l’extérieur de l’ordinateur. Par exemple, la pile d’appel peut servir pour stocker des données reçues depuis un capteur, par une communication « UART » (acronyme de l’anglais « Universal Asynchronous Receiver Transmitter ») ou une communication Wi-Fi. Il est possible qu’un attaquant modifie cette pile d’appel en y injectant des données depuis l’extérieur de l’ordinateur pour forcer l’exécution d’un code malveillant par l’ordinateur. En particulier, on connaît une technique d’exploitation avancée de type dépassement de pile (en anglais « stack overflow »). Cette technique est désignée par l’acronyme « ROP » de l’anglais « Return-Oriented Programming ». Cette technique est utilisée par l’attaquant pour obtenir un contrôle de la pile d’appel d’un programme en modifiant notamment l’adresse de retour enregistrée dans la pile. L’attaquant se sert de cette modification de l’adresse de retour pour exécuter une suite d’instructions situées en zone mémoire exécutable. Ces instructions sont désignées par l’expression anglo-saxonne « gadget ». L’attaquant peut ainsi assembler plusieurs gadgets pour que l’ordinateur exécute des opérations non programmées. Cette technique permet de réaliser une attaque par déni de service par exemple, car l’ordinateur ne peut plus exécuter de programmes correctement. Plusieurs solutions connues permettent de se protéger de manière plus ou moins robuste contre les attaques « ROP ». Il est par exemple possible de dupliquer la pile d’appel de manière à obtenir une pile additionnelle. La pile additionnelle sert alors de référence pour vérifier si la pile d’appel n’a pas été modifiée de manière indésirée. La pile additionnelle est enregistrée dans une mémoire vive (« RAM » acronyme de l’anglais « Random Access Memory »). Cette pile additionnelle présente l’inconvénient d’occuper un espace relativement important dans la mémoire vive. Ainsi, l’utilisation d’une telle pile additionnelle peut être trop coûteuse, au regard de son occupation de la mémoire vive, pour des systèmes embarqués, tels que des microcontrôleurs. Cette pile additionnelle présente aussi comme inconvénient d’être complexe à mettre en œuvre que ce soit par voie logicielle ou par voie matérielle. En outre, cette pile additionnelle présente l’inconvénient de pouvoir être également modifiée par un attaquant. Il existe donc un besoin de proposer une solution simple et robuste contre les attaques de type « ROP ». Selon un aspect, il est proposé un système informatique -notamment un microcontrôleur- comprenant : - une mémoire configurée pour stocker un produit programme d’ordinateur, - un processeur configuré pour exécuter ledit produit programme d’ordinateur, - un circuit de mémoire, ledit produit programme d’ordinateur comprenant des instructions qui, lorsque le programme est exécuté par ledit processeur, conduisent celui-ci à exécuter au moins une fonction configurée pour recevoir des données depuis l’extérieur du système informatique, lesdites instructions comprenant des instructions configurées pour réaliser un appel et un retour de ladite au moins une fonction, les instructions d’appel de ladite au moins une fonction comportant une instruction configurée pour stocker une adresse de retour dans une pile d’appel, et au moins une instruction additionnelle configurée pour dupliquer ladite adresse de retour dans ledit circuit de mémoire, et les instructions de retour de ladite au moins une fonction comportant une instruction configurée pour réaliser un branchement à partir de l’adresse de retour stockée dans la pile d’appel, et au moins une instruction additionnelle configurée pour comparer la valeur de l’adresse de retour stockée dans la pile d’appel à la valeur de l’adresse de retour dupliquée dans ledit circuit de mémoire et pour permettre d’effectuer ledit branchement uniquement si ces deux valeurs sont identiques. Un tel système informatique permet d’exécuter un programme d’ordinateur comprenant lesdites instructions additionnelles uniquement pour l’appel et le retour de ladite au moins une fonction configurée pour recevoir des données provenant de l’extérieur du système informatique. En particulier, le programme d’ordinateur comprend des instructions additionnelles permettant de vérifier que la valeur de l’adresse de retour utilisée pour effectuer le retour de la fonction correspond bien à la valeur dupliquée dans le circuit de mémoire. Cela permet de s’assurer que la valeur de l’adresse de retour n’a pas été modifiée lors de l’exécution de la fonction. Si la valeur de l’adresse de retour diffère de la valeur dupliquée dans le circuit de mémoire, alors cela peut signifier que le système informatique subi un début d’attaque de type « ROP » lors de l’exécution de ladite fonction. Dans ce cas, le système informatique peut mettre en œuvre des contre-mesures pour s’opposer à l’attaque de type « ROP ». Un tel programme est donc configuré pour empêcher un attaquant de prendre le contrôle d’un registre de lien ou d’un pointeur d’instruction lors du retour de fonction. De préférence, le circuit de mémoire comprend un registre configuré pour stocker l’adresse de retour dupliquée. Un tel circuit de mémoire présente l’avantage de présenter une structure simple et peu coûteuse pour stocker l’adresse de retour dupliquée. En outre, un tel registre est difficilement modifiable par un attaquant. Dans un mode de réalisation avantageux, le programme d’ordinateur comprend des instructions qui permettent de stopper l’exécution du programme ou d’effectuer le branchement de retour selon la valeur dupliquée de l’adresse de retour si l’exécution de ladite au moins une instruction additionnelle de retour de fonction permet de détecter que la valeur de l’adresse de retour dans la pile d’appel est différente de la valeur dupliquée de l’adresse de retour dans le circuit de mémoire. De la sorte, le programme d’ordinateur permet de prendre des contre-mesures lorsque la valeur de l’adresse de retour dans la pile d’appel est différente de la valeur dupliquée de l’adresse de retour dans le circuit de mémoire, notamment lorsque le système informatique subi un début d’attaque de type « ROP ». Avantageusement, les instructions d’appel de ladite au moins une fonction comprennent en outre au moins une instruction additionnelle configurée pour dupliquer une valeur d’un pointeur de pile d’appel (en anglais « stack pointer ») définie lorsque l’adresse de retour est ajoutée à la pile d’appel. Les instructions de retour de ladite au moins une fonction comprennent au moins une instruction additionnelle configurée pour comparer la valeur du pointeur de pile d’appel définie lors d’une récupération de l’adresse de retour de la pile d’appel pour réaliser ledit branchement à la valeur du pointeur de pile d’appel dupliquée dans ledit circuit de mémoire et pour permettre d’effectuer ledit branchement uniquement si ces deux valeurs sont identiques. Le programme d’ordinateur comprend ainsi des instructions additionnelles permettant de vérifier si la valeur du pointeur de pile lors de la récupération de l’adresse de retour lors du retour de la fonction correspond à la valeur dupliquée dans le circuit de mémoire. Cela permet de s’assurer que la taille de pile n’a pas été modifiée au cours de l’exécution de ladite fonction. Si la valeur du pointeur de pile lors de la récupération de l’adresse de retour diffère de la valeur dupliquée dans le circuit de mémoire, alors cela peut signifier que le système informatique subi un début d’attaque de type « ROP ». Dans ce cas, le système informatique peut mettre en œuvre des contre-mesures pour s’opposer à l’attaque de type « ROP ». Le contrôle de la valeur du pointeur de pile lors du retour de fonction permet de savoir si l’adresse de la case mémoire de la pile d’appel qui contient l’adresse de retour a été modifiée pendant l’exécution de la fonction. Cela permet d’améliorer la détection d’attaque de type « ROP ». De préférence, le circuit de mémoire comprend un registre configuré pour stocker la valeur du pointeur de pile dupliquée. Un tel circuit de mémoire présente l’avantage de présenter une structure simple et peu coûteuse pour stocker la valeur du pointeur de pile dupliquée. En outre, un tel registre est difficilement modifiable par un attaquant. Dans un mode de réalisation avantageux, le programme d’ordinateur comprend des instructions qui permettent de stopper l’exécution du programme ou d’effectuer le branchement de retour selon la valeur dupliquée de l’adresse de retour si l’exécution de ladite au moins une instruction additionnelle de retour de fonction permet de détecter que la valeur du pointeur de pile lors du retour est différente de la valeur dupliquée du pointeur de pile. De la sorte, le programme d’ordinateur permet de prendre lui-même des contre-mesures lorsque la valeur du pointeur de pile lors du retour est différente de la valeur dupliquée du pointeur de pile, notamment lorsque le système informatique subi un début d’attaque de type « ROP ». En variante, le programme d’ordinateur peut générer un code d’exception. Ce code d’exception peut ensuite être détecté pour mettre en œuvre des contre-mesures. Selon un autre aspect, il est proposé un produit programme d’ordinateur comprenant des instructions qui, lorsque le programme est exécuté par ledit processeur d’un système informatique tel que décrit précédemment, conduisent celui-ci à exécuter au moins une fonction configurée pour recevoir des données depuis l’extérieur du système informatique, lesdites instructions comprenant une instruction configurée pour réaliser un appel et un retour de ladite au moins une fonction, les instructions d’appel de ladite au moins une fonction comportant une instruction configurée pour stocker une adresse de retour dans une pile d’appel, et au moins une instruction additionnelle configurée pour dupliquer ladite adresse de retour dans ledit circuit de mémoire du système informatique, et les instructions de retour de ladite au moins une fonction comportant une instruction configurée pour réaliser un branchement à partir de l’adresse de retour stockée dans la pile d’appel, et au moins une instruction additionnelle configurée pour comparer la valeur de l’adresse de retour stockée dans la pile d’appel à la valeur de l’adresse de retour dupliquée dans ledit circuit de mémoire et pour permettre d’effectuer ledit branchement uniquement si ces deux valeurs sont identiques. De préférence, ladite au moins une instruction additionnelle configurée pour dupliquer ladite adresse de retour est configurée pour stocker l’adresse de retour dupliquée dans un registre dudit circuit de mémoire. Dans un mode de réalisation avantageux, le produit programme d’ordinateur comprend en outre des instructions qui permettent de stopper l’exécution du programme ou d’effectuer le branchement de retour selon la valeur dupliquée de l’adresse de retour si l’exécution de ladite au moins une instruction additionnelle de retour de fonction permet de détecter que la valeur de l’adresse de retour dans la pile d’appel est différente de la valeur dupliquée de l’adresse de retour dans le circuit de mémoire. Avantageusement, les instructions d’appel de ladite au moins une fonction comprennent en outre au moins une instruction additionnelle configurée pour dupliquer une valeur d’un pointeur de pile d’appel définie lorsque l’adresse de retour est ajoutée à la pile d’appel. Les instructions de retour de ladite au moins une fonction comprennent au moins une instruction additionnelle configurée pour comparer la valeur du pointeur de pile d’appel définie lors d’une récupération de l’adresse de retour de la pile d’appel pour réaliser ledit branchement à la valeur du pointeur de pile d’appel dupliquée dans ledit circuit de mémoire et pour permettre d’effectuer ledit branchement uniquement si ces deux valeurs sont identiques. De préférence, ladite au moins une instruction additionnelle configurée pour dupliquer une valeur d’un pointeur de pile d’appel est configurée pour stocker cette valeur dans un registre du circuit de mémoire. Dans un mode de réalisation avantageux, le produit programme d’ordinateur comprend en outre des instructions qui permettent de stopper l’exécution du programme ou d’effectuer le branchement de retour selon la valeur dupliquée de l’adresse de retour si l’exécution de ladite au moins une instruction additionnelle de retour de fonction permet de détecter que la valeur du pointeur de pile lors du retour est différente de la valeur dupliquée du pointeur de pile. Selon un autre aspect, il est proposé un procédé mis en œuvre par un ordinateur -notamment par un système informatique tel que décrit précédemment- comprenant une exécution d’un produit programme d’ordinateur tel que décrit précédemment. Selon un autre aspect, il est proposé un procédé mis en œuvre par un ordinateur de génération d’un programme d’ordinateur, le procédé comprenant une génération d’instructions qui, lorsque le programme est exécuté par un processeur d’un système informatique, conduisent celui-ci à exécuter au moins une fonction configurée pour recevoir des données depuis l’extérieur du système informatique, lesdites instructions comprenant des instructions configurées pour réaliser un appel et un retour de ladite au moins une fonction, les instructions d’appel de ladite au moins une fonction comportant une instruction configurée pour stocker une adresse de retour dans une pile d’appel, les instructions de retour de ladite au moins une fonction comportant une instruction configurée pour réaliser un branchement à partir de l’adresse de retour stockée dans la pile d’appel, le procédé comprenant également : - un ajout d’ au moins une instruction additionnelle d’appel de ladite au moins une fonction, ladite au moins une instruction additionnelle d’appel étant configurée pour dupliquer ladite adresse de retour dans un circuit de mémoire du système informatique pour l’appel de ladite au moins une fonction, - un ajout d’au moins une instruction additionnelle de retour de fonction, ladite au moins une instruction additionnelle de retour de fonction étant configurée pour comparer la valeur de l’adresse de retour stockée dans la pile d’appel à la valeur de l’adresse de retour dupliquée dans ledit circuit de mémoire du système informatique et pour permettre d’effectuer ledit branchement uniquement si ces deux valeurs sont identiques. De préférence, ladite au moins une instruction additionnelle configurée pour dupliquer ladite adresse de retour est configurée pour stocker la valeur dupliquée de l’adresse de retour dans un registre dudit circuit de mémoire. Dans un mode de mise en œuvre avantageux, le procédé comprend en outre un ajout d’instructions qui permettent de stopper l’exécution du programme ou d’effectuer le branchement de retour selon la valeur dupliquée de l’adresse de retour si l’exécution de ladite au moins une instruction additionnelle de retour de fonction permet de détecter que la valeur de l’adresse de retour dans la pile d’appel est différente de la valeur dupliquée de l’adresse de retour dans le circuit de mémoire. Avantageusement, le procédé comprend en outre : - un ajout d’au moins une instruction additionnelle d’appel de ladite au moins une fonction configurée pour dupliquer une valeur d’un pointeur de pile d’appel définie lorsque l’adresse de retour est ajoutée à la pile d’appel, et - un ajout d’au moins une instruction additionnelle de retour de ladite au moins une fonction configurées pour comparer la valeur du pointeur de pile d’appel définie lors d’une récupération de l’adresse de retour de la pile d’appel pour réaliser ledit branchement à la valeur du pointeur de pile d’appel dupliquée dans ledit circuit de mémoire et pour permettre d’effectuer ledit branchement uniquement si ces deux valeurs sont identiques. De préférence, ladite au moins une instruction additionnelle configurée pour dupliquer une valeur d’un pointeur de pile d’appel est configurée pour stocker cette valeur dans un registre du circuit de mémoire. Dans un mode de mise en œuvre avantageux, le procédé comprend en outre un ajout d’instructions qui permettent de stopper l’exécution du programme ou d’effectuer le branchement de retour selon la valeur dupliquée de l’adresse de retour si l’exécution de ladite au moins une instruction additionnelle de retour de fonction permet de détecter que la valeur du pointeur de pile lors du retour est différente de la valeur dupliquée du pointeur de pile. Selon un autre aspect, il est proposé un produit programme d’ordinateur comprenant des instructions qui, lorsque le programme est exécuté par un ordinateur, conduisent celui-ci à mettre en œuvre un procédé de génération de programme d’ordinateur tel que décrit précédemment. D’autres avantages et caractéristiques de l’invention apparaîtront à l’examen de la description détaillée de modes de réalisation, nullement limitatifs, et des dessins annexés sur lesquels : illustrent des modes de réalisation et de mise en œuvre de l’invention. La illustre un mode de réalisation d’un système informatique SYS. Le système informatique SYS peut être un microcontrôleur par exemple. Le système informatique SYS comprend un processeur PROC et une mémoire MEM. La mémoire MEM permet de stocker un programme d’ordinateur PRG. Le programme d’ordinateur PRG comprend des instructions pouvant être exécutées par le processeur PROC du système informatique SYS. Lorsque le processeur PROC exécute le programme d’ordinateur PRG, le processeur PROC utilise un pointeur d’instruction (en anglais « instruction pointer » ou « program counter »). Ce pointeur d’instruction est un registre qui contient l’adresse mémoire de l’instruction en cours d’exécution ou prochainement exécutée selon l’architecture du processeur. Ce pointeur d’instruction est incrémenté dès qu’une instruction est chargée dans le processeur de manière à pointer sur l’adresse mémoire de l’instruction suivante. Le programme d’ordinateur PRG comprend plusieurs fonctions. Afin de pouvoir exécuter ces fonctions, le programme PRG comprend des instructions permettant de réaliser un appel de fonction ainsi que des instructions permettant de réaliser un retour de fonction. L’exécution des fonctions du programme d’ordinateur PRG utilise une pile d’appel. La pile d'appel est notamment réalisée dans une partie d’une mémoire vive du système informatique SYS. La pile d’appel est utilisée pour stocker une adresse de retour, des arguments/paramètres, des variables locales requis pour exécuter ladite fonction. Le système informatique SYS comporte un pointeur de pile. Le pointeur de pile est un registre qui est utilisé pour stocker l’adresse la plus haute de la pile d’appel. Les instructions permettant de réaliser un appel de fonction comprennent une instruction de branchement dont l’adresse de destination est celle la première instruction de la fonction. Ainsi, lorsqu’une fonction est appelée, la valeur du pointeur d’instruction est modifiée de manière à pointer sur l’adresse mémoire de la première instruction de ladite fonction. Les instructions permettant de réaliser un appel de fonction comprennent au moins une instruction de type « push ». Cette instruction permet d’ajouter la valeur d’un registre dans la pile d’appel. En particulier, les instructions permettant de réaliser un appel de fonction comprennent une instruction de type « push{LR} » permettant d’ajouter dans la pile d’appel le contenu d’un registre de liaison LR (en anglais « link register »). Le contenu du registre LR correspond à une adresse de retour pour exécuter la suite du programme une fois ladite fonction exécutée. Cette instruction « push{LR} » est configurée pour être exécutée au début d’un appel de fonction. Les instructions permettant de réaliser un retour de fonction comprennent au moins une instruction permettant de restaurer un contexte de la fonction. Le contexte est un espace de la pile d’appel permettant de stocker par exemple des paramètres, un résultat de la fonction, l’adresse de retour et des variables locales. Les instructions permettant de réaliser un retour de fonction comprennent également au moins une instruction de type « POP ». Cette instruction permet de retirer une valeur d’un registre de la pile d’appel. En particulier, les instructions permettant de réaliser un appel de fonction comprennent une instruction de type « pop{pc} » permettant de récupérer la valeur du registre LR stockée dans la pile et correspondant à l’adresse de retour pour la mettre dans le pointeur d’instruction. Le programme PRG comprend également des instructions additionnelles pour réaliser les appels de certaines fonctions. Ces instructions additionnelles servent à protéger ces fonctions contre les attaques de type dépassement de pile (en anglais « stack overflow »), notamment les attaques « ROP » de l’anglais « Return-Oriented Programming ». Ces instructions additionnelles sont utilisées pour les fonctions configurées pour recevoir des données provenant de l’extérieur du système informatique, notamment du microcontrôleur, telles que des données obtenues par l’intermédiaire d’une communication « UART », d’une communication Wi-Fi, ou provenant d’un capteur, etc. Les attaques de type « ROP » sont initialisées lors de l’exécution de telles fonctions, en ajoutant à la pile d’appel des données reçues depuis l’extérieur de manière à engendrer un dépassement de pile. Les instructions additionnelles sont donc uniquement intégrées pour exécuter ce type de fonctions. Cela permet d’augmenter un temps d’exécution du programme seulement lorsqu’une telle fonction est appelée. L’exécution des autres fonctions du programme n’utilise pas ces instructions additionnelles. En particulier, les instructions additionnelles sont exécutées lors des appels et des retours des fonctions configurées pour recevoir des données provenant de l’extérieur. Plus particulièrement, les instructions permettant de réaliser un appel de fonction comprennent au moins une instruction additionnelle permettant de dupliquer l’adresse de retour dans un circuit de mémoire CMEM du système informatique SYS. Les instructions permettant de réaliser un appel de fonction comprennent également au moins une instruction additionnelle permettant de dupliquer dans le circuit de mémoire CMEM du système informatique SYS la valeur du pointeur de pile lors de l’ajout de l’adresse de retour dans la pile. Le circuit de mémoire CMEM peut comprendre deux registres REG1, REG2 du système informatique SYS. Un premier registre REG1 est alors utilisé pour stocker la valeur dupliquée de l’adresse de retour définie lors de l’appel de la fonction. Un deuxième registre REG2 est utilisé pour stocker la valeur dupliquée du pointeur de pile. Ce deuxième registre REG2 est optionnel. Les registres REG1, REG2 peuvent être des registres du processeur PROC. Ces registres peuvent être des registres additionnels du processeur ou bien des registres initiaux du processeur PROC. La fonctionnalité de ces registres initiaux est donc modifiée pour les dédier au stockage de la valeur dupliquée de l’adresse de retour et de la valeur dupliquée du pointeur de pile. Par exemple, dans le cas où le processeur PROC présente une architecture ARM®, il est possible d’utiliser les registres R4 et R5. Il est également possible d’utiliser le registre R9 si aucun code indépendant de la position (en anglais « position-independent code ») n’est utilisé. Il est également possible d’utiliser des registres à virgule flottante (S0 à S31 pour une architecture ARM®) si la virgule flottante n’est pas utilisée. En variante, les registres peuvent être des registres d’un circuit sécurisé dédié du système informatique (par exemple ayant une architecture de type « TrustZone » sur ARM®). En outre, un circuit dédié peut également être configuré pour stocker plusieurs valeurs dupliquées de pointeur de pile et plusieurs valeurs dupliquées d’adresse de retour, chaque valeur dupliquée du pointeur de pile étant associée à une unique valeur dupliquée d’adresse de retour. En variante, le circuit de mémoire CMEM comprend une portion de la mémoire vive. Cette portion de la mémoire vive est alors utilisée pour stocker la valeur dupliquée du pointeur de pile et la valeur dupliquée de l’adresse de retour définie lors de l’appel de fonction. Le circuit de mémoire CMEM est configuré pour recevoir des données seulement depuis le registre LR ou depuis le registre du pointeur de pile. Les valeurs stockées dans le circuit de mémoire CMEM sont donc difficilement modifiables par un attaquant. Les instructions permettant de réaliser un retour de fonction comprennent des instructions additionnelles permettant de comparer la valeur du pointeur de pile lors de la récupération de l’adresse de retour à la valeur dupliquée du pointeur de pile stockée dans le circuit de mémoire CMEM. Cette comparaison permet de vérifier que la valeur du pointeur de pile n’a pas été modifiée lors de l’exécution de ladite fonction. Cette comparaison peut être réalisée par le processeur ou bien par un circuit dédié. Les instructions permettant de réaliser un retour de fonction comprennent des instructions additionnelles permettant de comparer la valeur de l’adresse de retour du registre LR à la valeur dupliquée de l’adresse de retour stockée dans le circuit de mémoire CMEM. Cette comparaison permet de vérifier que la valeur de l’adresse de retour du registre LR n’a pas été modifiée lors de l’exécution de ladite fonction. Si la valeur du pointeur de pile lors de la récupération de l’adresse de retour correspond à la valeur dupliquée du pointeur de pile et si la valeur de l’adresse de retour du registre LR correspond à la valeur dupliquée de l’adresse de retour, alors cela signifie que la valeur de l’adresse de retour dans la pile d’appel n’a pas été modifiée. Dans ce cas, le programme PRG est configuré pour continuer d’être exécuté en réalisant le branchement de retour de fonction. Si la valeur du pointeur de pile lors de la récupération de l’adresse de retour est différente de la valeur dupliquée du pointeur de pile et/ou si la valeur de l’adresse de retour du registre LR est différente de la valeur dupliquée de l’adresse de retour, cela signifie que la pile d’appel a été modifiée de manière indésirée. Cette modification peut être le résultat d’une attaque de type « ROP » ou du fait qu’un attaquant aurait réussi à déplacer le pointeur de pile vers une zone de mémoire (aussi désigné par l’expression anglaise « fake stack ») contrôlée par l’attaquant. Ainsi, dans ce cas, des instructions du programme PRG sont configurées pour être exécutées de manière à prendre des contre-mesures. Par exemple, ces instructions lorsqu’elles sont exécutées peuvent permettre soit de stopper l’exécution du programme PRG soit de remplacer la valeur de l’adresse de retour par la valeur dupliquée de l’adresse de retour de manière à retourner à l’adresse de retour souhaitée lors du branchement de retour de la fonction. Ces instructions peuvent également générer un signal d’alerte permettant d’informer l’utilisateur du système informatique que la pile d’appel a été modifiée et que le système informatique subi potentiellement une attaque de type « ROP ». Un tel système informatique SYS est donc configuré pour détecter simplement des attaques de type dépassement de pile « ROP ». En particulier, un tel système informatique SYS présente une architecture simple permettant de stocker les valeurs dupliquées du pointeur de pile et de l’adresse retour. Par exemple, le système informatique SYS utilise un circuit de mémoire CMEM comprenant simplement deux registres pour stocker les valeurs dupliquées du pointeur de pile et de l’adresse mémoire. En variante, l’utilisation d’un circuit dédié comme circuit de mémoire CMEM permet d’effectuer le contrôle des valeurs du pointeur de pile et de l’adresse retour en parallèle de l’exécution du programme d’ordinateur PRG. La illustre un procédé d’exécution d’un programme PRG tel que décrit précédemment. Le procédé comprend un appel 20 d’au moins une fonction configurée pour recevoir des données provenant de l’extérieur du système informatique SYS exécutant le programme PRG. L’appel 20 d’une telle fonction comprend l’exécution 20a d’une instruction de type « push{LR} » permettant d’ajouter dans une pile d’appel de fonction le contenu d’un registre de liaison LR (en anglais « link register ») qui correspond à une adresse de retour pour exécuter la suite du programme une fois ladite fonction exécutée. En particulier, l’appel 20 comprend également une exécution 20b d’instructions additionnelles permettant de dupliquer dans un circuit de mémoire du système informatique la valeur du pointeur de pile lors de l’appel de fonction lorsque l’adresse de retour est ajoutée à la pile. l’appel 20 comprend également une exécution 20c d’instructions additionnelles permettant de dupliquer l’adresse de retour dans le circuit de mémoire du système informatique. Le procédé comprend ensuite l’exécution 21 des instructions de la fonction. Le procédé comprend ensuite un retour 22 de la fonction. Le retour 22 de la fonction comprend une exécution 22a d’au moins une instruction permettant de restaurer un contexte de la fonction. Le contexte est un espace de la pile d’appel permettant de stocker par exemple des paramètres, un résultat de la fonction, l’adresse de retour et des variables locales. Le retour 22 de la fonction comprend également une exécution 22b d’instructions permettant de comparer la valeur du pointeur de pile lors de la récupération de l’adresse de retour à la valeur dupliquée du pointeur de pile et de comparer la valeur de l’adresse de retour du registre LR à la valeur dupliquée de l’adresse de retour Si la valeur du pointeur de pile lors de la récupération de l’adresse de retour correspond à la valeur dupliquée du pointeur de pile et si la valeur de l’adresse de retour du registre LR correspond à la valeur dupliquée de l’adresse de retour, alors le retour de la fonction comprend l’exécution 22c d’une instruction « pop{pc} » permettant de récupérer la valeur du registre LR stockée dans la pile et correspondant à l’adresse de retour pour la mettre dans le pointeur d’instruction de manière à sortir de la fonction et à exécuter la suite du programme. Si la valeur du pointeur de pile lors de la récupération de l’adresse de retour est différente de la valeur dupliquée du pointeur de pile et/ou si la valeur de l’adresse de retour du registre LR est différente de la valeur dupliquée de l’adresse de retour, alors le procédé comprend l’exécution 23 d’instructions configurées pour être exécutées de manière à prendre des contre-mesures, décrites précédemment. La illustre un procédé mis en œuvre par ordinateur de génération d’un programme d’ordinateur PRG tel que décrit précédemment. En particulier, un programme d’ordinateur de compilation peut comprendre des instructions qui lorsqu’elles sont exécutées par un ordinateur, conduisent celui-ci à mettre en œuvre un tel procédé de génération de programme d’ordinateur PRG. Un tel procédé peut être mis en œuvre lors d’une compilation d’un code source de manière à obtenir ledit programme. Le code source permet de définir les différentes fonctions du programme. Au moins une fonction du programme définie dans le code source est configurée pour recevoir des données provenant de l’extérieur du système informatique destiné à exécuter le programme. Le code source est configuré pour signaler chaque fonction du programme adaptée pour recevoir des données provenant de l’extérieur. En particulier, pour identifier une telle fonction, le code source peut inclure une balise placée au début de cette fonction. Cette balise peut être insérée par la personne ayant rédigé le code source. Une balise peut consister en une succession de caractères. Le procédé de génération du programme d’ordinateur comprend une transformation 30 par un compilateur du code source en une séquence d’instructions exécutables par le système informatique. Cette séquence d’instructions est donc générée par le compilateur à partir du code source. En particulier, le procédé de génération du programme d’ordinateur PRG comprend une détection 31, par le compilateur, de chaque fonction du programme configurée pour recevoir des données provenant de l’extérieur. Cette détection peut être réalisée en détectant la balise dans le code source qui identifie une telle fonction. Ensuite, pour chaque fonction détectée configurée pour recevoir des données provenant de l’extérieur, le procédé comprend un ajout 32, par le compilateur, d’instructions additionnelles à exécuter lors de l’appel et du retour de ladite fonction. Ces instructions additionnelles peuvent donc être seulement ajoutées pour les fonctions identifiées par ladite balise dans le code source. Ces instructions additionnelles sont donc générées sans intervention d’un développeur. Comme vu précédemment, ces instructions additionnelles servent à protéger ces fonctions contre les attaques de type dépassement de pile (en anglais « stack overflow »), notamment les attaques « ROP » de l’anglais « Return-Oriented Programming ». En particulier, les instructions additionnelles ajoutées pour l’appel de la fonction permettent de dupliquer, dans un circuit de mémoire du système informatique destiné à exécuter le programme, l’adresse de retour dans ce circuit de mémoire du système informatique. Ces instructions additionnelles permettent également de dupliquer dans ce circuit de mémoire du système informatique la valeur du pointeur de pile lors de l’ajout de l’adresse de retour dans la pile. Les instructions additionnelles ajoutées pour le retour de fonction comprennent des instructions additionnelles permettant de comparer la valeur de l’adresse de retour du registre LR à la valeur dupliquée de l’adresse de retour stockée dans le circuit de mémoire CMEM. Cette comparaison permet de vérifier que la valeur de l’adresse de retour du registre LR n’a pas été modifiée lors de l’exécution de ladite fonction. Comme vu précédemment, ces instructions additionnelles comprennent également des instructions permettant de prendre des contre-mesures si la valeur du pointeur de pile lors de la récupération de l’adresse de retour est différente de la valeur dupliquée du pointeur de pile et/ou si la valeur de l’adresse de retour du registre LR est différente de la valeur dupliquée de l’adresse de retour. Système informatique comprenant : - une mémoire (MEM) configurée pour stocker un produit programme d’ordinateur (PRG), - un processeur (PROC) configuré pour exécuter ledit produit programme d’ordinateur, - un circuit de mémoire (CMEM), ledit produit programme d’ordinateur (PRG) comprenant des instructions qui, lorsque le programme est exécuté par ledit processeur (PROC), conduisent celui-ci à exécuter au moins une fonction configurée pour recevoir des données depuis l’extérieur du système informatique, lesdites instructions comprenant des instructions configurées pour réaliser un appel et un retour de ladite au moins une fonction, les instructions d’appel de ladite au moins une fonction comportant une instruction configurée pour stocker une adresse de retour dans une pile d’appel, et au moins une instruction additionnelle configurée pour dupliquer ladite adresse de retour dans ledit circuit de mémoire (CMEM), et les instructions de retour de ladite au moins une fonction comportant une instruction configurée pour réaliser un branchement à partir de l’adresse de retour stockée dans la pile d’appel, et au moins une instruction additionnelle configurée pour comparer la valeur de l’adresse de retour stockée dans la pile d’appel à la valeur de l’adresse de retour dupliquée dans ledit circuit de mémoire (CMEM) et pour permettre d’effectuer ledit branchement uniquement si ces deux valeurs sont identiques. Système informatique selon la revendication 1, dans lequel le circuit de mémoire (CMEM) comprend un registre (REG1) configuré pour stocker l’adresse de retour dupliquée. Système informatique selon l’une quelconque des revendications 1 ou 2 dans lequel le programme d’ordinateur (PRG) comprend des instructions qui permettent de stopper l’exécution du programme ou d’effectuer le branchement de retour selon la valeur dupliquée de l’adresse de retour si l’exécution de ladite au moins une instruction additionnelle de retour de fonction permet de détecter que la valeur de l’adresse de retour dans la pile d’appel est différente de la valeur dupliquée de l’adresse de retour dans le circuit de mémoire. Système informatique selon l’une des revendications 1 à 3 dans lequel les instructions d’appel de ladite au moins une fonction comprennent en outre au moins une instruction additionnelle configurée pour dupliquer une valeur d’un pointeur de pile d’appel définie lorsque l’adresse de retour est ajoutée à la pile d’appel, et dans lequel les instructions de retour de ladite au moins une fonction comprennent au moins une instruction additionnelle configurée pour comparer la valeur du pointeur de pile d’appel définie lors d’une récupération de l’adresse de retour de la pile d’appel pour réaliser ledit branchement à la valeur du pointeur de pile d’appel dupliquée dans ledit circuit de mémoire (CMEM) et pour permettre d’effectuer ledit branchement uniquement si ces deux valeurs sont identiques. Système informatique selon la revendication 4 dans lequel le circuit de mémoire (CMEM) comprend un registre (REG2) configuré pour stocker la valeur du pointeur de pile dupliquée. Système informatique selon l’une quelconque des revendications 4 ou 5 dans lequel le programme d’ordinateur (PRG) comprend des instructions qui permettent de stopper l’exécution du programme ou d’effectuer le branchement de retour selon la valeur dupliquée de l’adresse de retour si l’exécution de ladite au moins une instruction additionnelle de retour de fonction permet de détecter que la valeur du pointeur de pile lors du retour est différente de la valeur dupliquée du pointeur de pile. Produit programme d’ordinateur comprenant des instructions qui, lorsque le programme est exécuté par ledit processeur (PROC) d’un système informatique (SYS) selon l’une des revendications 1 à 6, conduisent celui-ci à exécuter au moins une fonction configurée pour recevoir des données depuis l’extérieur du système informatique (SYS), lesdites instructions comprenant des instructions configurées pour réaliser un appel et un retour de ladite au moins une fonction, les instructions d’appel de ladite au moins une fonction comportant une instruction configurée pour stocker une adresse de retour dans une pile d’appel, et au moins une instruction additionnelle configurée pour dupliquer ladite adresse de retour dans ledit circuit de mémoire (CMEM) du système informatique (SYS), et les instructions de retour de ladite au moins une fonction comportant une instruction configurée pour réaliser un branchement à partir de l’adresse de retour stockée dans la pile d’appel, et au moins une instruction additionnelle configurée pour comparer la valeur de l’adresse de retour stockée dans la pile d’appel à la valeur de l’adresse de retour dupliquée dans ledit circuit de mémoire (CMEM) et pour permettre d’effectuer ledit branchement uniquement si ces deux valeurs sont identiques. Produit programme d’ordinateur selon la revendication 7, dans lequel ladite au moins une instruction additionnelle configurée pour dupliquer ladite adresse de retour est configurée pour stocker la valeur dupliquée de l’adresse de retour dans un registre (REG1) dudit circuit de mémoire (CMEM). Produit programme d’ordinateur selon l’une quelconque des revendications 7 ou 8, comprenant en outre des instructions qui permettent de stopper l’exécution du programme (PRG) ou d’effectuer le branchement de retour selon la valeur dupliquée de l’adresse de retour si l’exécution de ladite au moins une instruction additionnelle de retour de fonction permet de détecter que la valeur de l’adresse de retour dans la pile d’appel est différente de la valeur dupliquée de l’adresse de retour dans le circuit de mémoire. Produit programme d’ordinateur selon l’une des revendications 7 à 9, dans lequel les instructions d’appel de ladite au moins une fonction comprennent en outre au moins une instruction additionnelle configurée pour dupliquer une valeur d’un pointeur de pile d’appel définie lorsque l’adresse de retour est ajoutée à la pile d’appel, et dans lequel les instructions de retour de ladite au moins une fonction comprennent au moins une instruction additionnelle configurée pour comparer la valeur du pointeur de pile d’appel définie lors d’une récupération de l’adresse de retour de la pile d’appel pour réaliser ledit branchement à la valeur du pointeur de pile d’appel dupliquée dans ledit circuit de mémoire (CMEM) et pour permettre d’effectuer ledit branchement uniquement si ces deux valeurs sont identiques. Produit programme d’ordinateur selon la revendication 10, dans lequel ladite au moins une instruction additionnelle configurée pour dupliquer une valeur d’un pointeur de pile d’appel est configurée pour stocker cette valeur dans un registre (REG2) du circuit de mémoire (CMEM). Produit programme d’ordinateur selon l’une quelconque des revendications 10 ou 11, comprenant en outre des instructions qui permettent de stopper l’exécution du programme ou d’effectuer le branchement de retour selon la valeur dupliquée de l’adresse de retour si l’exécution de ladite au moins une instruction additionnelle de retour de fonction permet de détecter que la valeur du pointeur de pile lors du retour est différente de la valeur dupliquée du pointeur de pile. Procédé mis en œuvre par un ordinateur comprenant une exécution d’un produit programme d’ordinateur selon l’une des revendications 7 à 12. Procédé mis en œuvre par un ordinateur de génération d’un programme d’ordinateur (PRG), le procédé comprenant une génération d’instructions qui, lorsque le programme est exécuté par un processeur d’un système informatique, conduisent celui-ci à exécuter au moins une fonction configurée pour recevoir des données depuis l’extérieur du système informatique, lesdites instructions comprenant des instructions configurées pour réaliser un appel et un retour de ladite au moins une fonction, les instructions d’appel de ladite au moins une fonction comportant une instruction configurée pour stocker une adresse de retour dans une pile d’appel, les instructions de retour de ladite au moins une fonction comportant une instruction configurée pour réaliser un branchement à partir de l’adresse de retour stockée dans la pile d’appel, le procédé comprenant également : - un ajout d’au moins une instruction additionnelle d’appel de ladite au moins une fonction, ladite au moins une instruction additionnelle d’appel étant configurée pour dupliquer ladite adresse de retour dans un circuit de mémoire du système informatique pour l’appel de ladite au moins une fonction, - un ajout d’au moins une instruction additionnelle de retour de fonction, ladite au moins une instruction additionnelle de retour de fonction étant configurée pour comparer la valeur de l’adresse de retour stockée dans la pile d’appel à la valeur de l’adresse de retour dupliquée dans ledit circuit de mémoire (CMEM) du système informatique (SYS) et pour permettre d’effectuer ledit branchement uniquement si ces deux valeurs sont identiques. Procédé selon la revendication 14, dans lequel ladite au moins une instruction additionnelle configurée pour dupliquer ladite adresse de retour est configurée pour stocker la valeur dupliquée de l’adresse de retour dans un registre (REG1) dudit circuit de mémoire (CMEM). Procédé selon l’une des revendications 14 ou 15, comprenant en outre un ajout d’instructions qui permettent de stopper l’exécution du programme ou d’effectuer le branchement de retour selon la valeur dupliquée de l’adresse de retour si l’exécution de ladite au moins une instruction additionnelle de retour de fonction permet de détecter que la valeur de l’adresse de retour dans la pile d’appel est différente de la valeur dupliquée de l’adresse de retour dans le circuit de mémoire. Procédé selon la revendication 14 à 16, comprenant en outre : - un ajout d’au moins une instruction additionnelle d’appel de ladite au moins une fonction configurée pour dupliquer une valeur d’un pointeur de pile d’appel définie lorsque l’adresse de retour est ajoutée à la pile d’appel, et - un ajout d’au moins une instruction additionnelle de retour de ladite au moins une fonction configurée pour comparer la valeur du pointeur de pile d’appel définie lors d’une récupération de l’adresse de retour de la pile d’appel pour réaliser ledit branchement à la valeur du pointeur de pile d’appel dupliquée dans ledit circuit de mémoire (CMEM) et pour permettre d’effectuer ledit branchement uniquement si ces deux valeurs sont identiques. Procédé selon la revendication 17 dans lequel ladite au moins une instruction additionnelle configurée pour dupliquer une valeur d’un pointeur de pile d’appel est configurée pour stocker cette valeur dans un registre (REG2) du circuit de mémoire (CMEM). Procédé selon l’une quelconque des revendication 17 ou 18, comprenant en outre un ajout d’instructions qui permettent de stopper l’exécution du programme (PRG) ou d’effectuer le branchement de retour selon la valeur dupliquée de l’adresse de retour si l’exécution de ladite au moins une instruction additionnelle de retour de fonction permet de détecter que la valeur du pointeur de pile lors du retour est différente de la valeur dupliquée du pointeur de pile. Produit programme d’ordinateur comprenant des instructions qui, lorsque le programme est exécuté par un ordinateur, conduisent celui-ci à mettre en œuvre un procédé selon l’une des revendications 14 à 19.