

{"id":586,"date":"2019-04-23T16:43:23","date_gmt":"2019-04-23T14:43:23","guid":{"rendered":"https:\/\/project.inria.fr\/emergences\/?p=586"},"modified":"2021-03-03T17:01:19","modified_gmt":"2021-03-03T16:01:19","slug":"garantir-lintegrite-dexecution-des-programmes","status":"publish","type":"post","link":"https:\/\/project.inria.fr\/emergences\/garantir-lintegrite-dexecution-des-programmes\/","title":{"rendered":"Garantir l&rsquo;int\u00e9grit\u00e9 d&rsquo;ex\u00e9cution des programmes"},"content":{"rendered":"<p><strong><span style=\"font-size: 12pt;\">L&rsquo;exploitation d&rsquo;une faille de s\u00e9curit\u00e9 passe souvent par le d\u00e9tournement d&rsquo;un programme. D&rsquo;o\u00f9 la n\u00e9cessit\u00e9 de le prot\u00e9ger, y compris durant son ex\u00e9cution. Au Laboratoire de haute s\u00e9curit\u00e9 (LHS) de Rennes des chercheurs exp\u00e9rimentent une m\u00e9thode consistant \u00e0 chiffrer le d\u00e9roulement des instructions de telle mani\u00e8re qu&rsquo;il devienne impossible d&rsquo;injecter du code ill\u00e9gitime pour prendre la main.<\/span><\/strong><\/p>\n<hr \/>\n<p><a href=\"https:\/\/project.inria.fr\/emergences\/files\/2021\/03\/Inria-0222-072.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-587\" src=\"https:\/\/project.inria.fr\/emergences\/files\/2021\/03\/Inria-0222-072.jpg\" alt=\"\" width=\"6016\" height=\"4016\" srcset=\"https:\/\/project.inria.fr\/emergences\/files\/2021\/03\/Inria-0222-072.jpg 6016w, https:\/\/project.inria.fr\/emergences\/files\/2021\/03\/Inria-0222-072-300x200.jpg 300w, https:\/\/project.inria.fr\/emergences\/files\/2021\/03\/Inria-0222-072-768x513.jpg 768w, https:\/\/project.inria.fr\/emergences\/files\/2021\/03\/Inria-0222-072-1024x684.jpg 1024w, https:\/\/project.inria.fr\/emergences\/files\/2021\/03\/Inria-0222-072-600x401.jpg 600w, https:\/\/project.inria.fr\/emergences\/files\/2021\/03\/Inria-0222-072-150x100.jpg 150w, https:\/\/project.inria.fr\/emergences\/files\/2021\/03\/Inria-0222-072-1320x881.jpg 1320w\" sizes=\"auto, (max-width: 6016px) 100vw, 6016px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>L&rsquo;id\u00e9e trottait dans les esprits depuis un moment. Il y avait bien eu quelques tentatives d&rsquo;impl\u00e9mentations. Mais personne n&rsquo;avait encore r\u00e9alis\u00e9 une preuve de concept offrant de grandes garanties th\u00e9oriques. Et c&rsquo;est ce que vient de parvenir \u00e0 faire le Laboratoire de Haute S\u00e9curit\u00e9 cr\u00e9\u00e9 par Inria, CentraleSupelec, le CNRS, la Direction g\u00e9n\u00e9rale de l&rsquo;armement et la R\u00e9gion Bretagne.\u00a0 Question de d\u00e9part : comment prot\u00e9ger l&rsquo;ex\u00e9cution d&rsquo;un logiciel ? Des attaques sophistiqu\u00e9es parviennent parfois \u00e0 d\u00e9tourner certaines instructions qui circulent dans le processeur pour y injecter des commandes ill\u00e9gitimes.<\/p>\n<p>&nbsp;<\/p>\n<p><iframe loading=\"lazy\" src=\"https:\/\/www.youtube.com\/embed\/3yU6Iorx3zM\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p>&nbsp;<\/p>\n<p><em>\u201cIl faut donc garantir que chaque instruction qui s&rsquo;ex\u00e9cute est bien la bonne, <\/em>r\u00e9sume <a href=\"https:\/\/ronan.lashermes.0nline.fr\/\" target=\"_blank\" rel=\"noopener\"><strong>Ronan Lashermes<\/strong><\/a>, ing\u00e9nieur de recherche.<em> Pour cela, nous utilisons une technique consistant \u00e0 chiffrer ces instructions en utilisant le graphe de flot de contr\u00f4le. Dans un logiciel, les instructions successives ne s&rsquo;ex\u00e9cutent pas toutes les unes derri\u00e8re les autres de fa\u00e7on lin\u00e9aire. En pratique, tr\u00e8s souvent, le programme saute d&rsquo;une instruction \u00e0 une autre, pour toutes sortes de raisons, par le biais de branchements. Il peut y avoir aussi des instructions conditionnelles : s&rsquo;il se passe telle chose, alors aller \u00e0 tel endroit pour continuer le travail. Cette organisation des instructions forme ce que l&rsquo;on appelle le graphe de flot de contr\u00f4le.\u201d<\/em><\/p>\n<p><span style=\"font-size: 18pt; color: #ff0000;\">Chiffrer avec l&rsquo;historique des instructions<\/span><\/p>\n<p>\u00c0 partir de l\u00e0, les scientifiques utilisent une technique connue sous le nom anglais d&rsquo;Instruction Set Randomization (randomisation du jeu d&rsquo;instructions). <em>\u201cNous chiffrons le programme en encodant l&rsquo;\u00e9tat \u00e0 chaque moment, c&rsquo;est \u00e0 dire pour chaque instruction. \u00c0 un instant t, cet \u00e9tat du programme correspond donc \u00e0 l&rsquo;historique de toutes les instructions d\u00e9j\u00e0 ex\u00e9cut\u00e9es.\u201d<\/em> C&rsquo;est comme si l&rsquo;on photographiait chaque \u00e9tape du d\u00e9roulement du programme.<\/p>\n<p><em>\u201cNous repr\u00e9sentons chacun de ces \u00e9tats successifs par une valeur sp\u00e9cifique que nous calculons \u00e0 partir du graphe. En l\u2019occurrence, il s&rsquo;agit d&rsquo;un tr\u00e8s grand nombre qui va nous servir \u00e0 chiffrer l&rsquo;instruction. Le processeur devra ensuite d\u00e9chiffrer ces instructions \u00e0 la vol\u00e9e.<\/em><\/p>\n<p><em>Si l&rsquo;on utilise la bonne valeur correspondant \u00e0 l&rsquo;\u00e9tat attendu, alors on peut d\u00e9chiffrer l&rsquo;instruction juste avant son ex\u00e9cution. En revanche, si une instruction ill\u00e9gitime s&rsquo;est gliss\u00e9e dans le syst\u00e8me, l&rsquo;\u00e9tat s&rsquo;en trouve modifi\u00e9. Impossible alors de d\u00e9chiffrer car la valeur calcul\u00e9e pour l&rsquo;\u00e9tat n&rsquo;est plus la bonne.\u201d<\/em><\/p>\n<p><span style=\"font-size: 18pt; color: #ff0000;\">Une parade \u00e0 beaucoup d&rsquo;attaques<\/span><\/p>\n<p>Compliqu\u00e9 ? <em>\u201cOui. Et cette technique pr\u00e9sente aussi une limite. Dans nos travaux, nous sommes oblig\u00e9s de consid\u00e9rer que l&rsquo;on conna\u00eet initialement le graphe. Or, en pratique, ce n&rsquo;est pas toujours le cas. Car, \u00e0 la compilation, certaines instructions pointent parfois vers des valeurs dynamiques, donc inconnues \u00e0 l&rsquo;avance.\u201d<\/em> Autre inconv\u00e9nient : le co\u00fbt de calcul pour chiffrer et d\u00e9chiffrer la litanie d&rsquo;instructions.<\/p>\n<p><em>\u201cCette\u00a0 m\u00e9thode consomme de la ressource. C&rsquo;est clair. Mais notre impl\u00e9mentation pourrait sans doute \u00eatre largement optimis\u00e9e. Ce qui nous int\u00e9ressait avant tout, c&rsquo;\u00e9tait de valider la preuve de concept dans une v\u00e9ritable impl\u00e9mentation offrant de bonnes garanties. Les <a href=\"https:\/\/ronan.lashermes.0nline.fr\/papers\/NordSec2018.pdf\" target=\"_blank\" rel=\"noopener\">r\u00e9sultats<\/a> (1) que nous venons de publier avec mes coll\u00e8gues H\u00e9l\u00e8ne Le Bouder (IMT Atlantique) et Ga\u00ebl Thomas (DGA) permettent d&rsquo;affirmer que ce genre de sch\u00e9ma offre une protection qui met le logiciel \u00e0 l&rsquo;abri de beaucoup de types d&rsquo;attaques. Les attaques \u00e9lectro-magn\u00e9tiques, par exemple. Mais aussi des attaques par ROP (Return-Oriented Programming). Dans ce deuxi\u00e8me cas, l&rsquo;attaquant ne va pas essayer de faire ex\u00e9cuter son propre programme car cela devient difficile en raison de toutes les protections qui apparaissent. Il va plut\u00f4t tenter de modifier le flot de contr\u00f4le pour ensuite r\u00e9utiliser des instructions l\u00e9gitimes afin d&rsquo;ex\u00e9cuter son propre programme. C&rsquo;est beaucoup plus difficile \u00e0 rep\u00e9rer. Mais avec notre technique de protection, le ROP devient impossible.\u201d<\/em><\/p>\n<p>Quel impact au niveau industriel ? <em>\u201cLes constructeurs ne vont pas utiliser ce sch\u00e9ma directement. Mais nos recherches vont nourrir leur r\u00e9flexion. Dans les ann\u00e9es qui viennent, nous allons certainement assister \u00e0 une sp\u00e9cialisation des c\u0153urs. Elle existe d\u00e9j\u00e0 pour l&rsquo;\u00e9nergie, par exemple, avec des optimisations diff\u00e9rentes en fonction de l&rsquo;utilisation. Et de la m\u00eame fa\u00e7on, dans les processeurs, nous allons voir \u00e9merger un c\u0153ur d\u00e9di\u00e9 \u00e0 la s\u00e9curit\u00e9. Les c\u0153urs s\u00e9curis\u00e9s pourront ex\u00e9cuter du code arbitraire avec plus de garanties. C&rsquo;est dans cet axe-l\u00e0 que notre travail (2) va plut\u00f4t s&rsquo;inscrire.\u201d<\/em><\/p>\n<p>&nbsp;<\/p>\n<table style=\"border-collapse: collapse; width: 100%;\" border=\"1\">\n<tbody>\n<tr>\n<td style=\"width: 800px; background-color: #384257; border-color: #384257;\">\n<ul>\n<li><span style=\"font-size: 10pt; color: #ffffff;\"><em>(1) Lire : Hardware-Assisted Program Execution Integrity: HAPEI. Par : Ronan Lashermes, H\u00e9l\u00e8ne Le Bouder et Ga\u00ebl Thomas. Dans : The 23rd Nordic Conference on Secure IT Systems. Novembre 2018.\u2028\u2028<\/em><\/span><\/li>\n<li><span style=\"font-size: 10pt; color: #ffffff;\"><em>(2) Ces recherches se poursuivent dans le cadre d&rsquo;une nouvelle th\u00e8se de doctorat par Mathieu Escouteloup au sein de Cidre, une \u00e9quipe de cybers\u00e9curit\u00e9 d&rsquo;Inria, CentraleSup\u00e9lec, Universit\u00e9 Rennes 1 et CNRS, commune \u00e0 l&rsquo;Irisa.<\/em><\/span><\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>L&rsquo;exploitation d&rsquo;une faille de s\u00e9curit\u00e9 passe souvent par le d\u00e9tournement d&rsquo;un programme. D&rsquo;o\u00f9 la n\u00e9cessit\u00e9 de le prot\u00e9ger, y compris durant son ex\u00e9cution. Au Laboratoire de haute s\u00e9curit\u00e9 (LHS) de Rennes des chercheurs exp\u00e9rimentent une m\u00e9thode consistant \u00e0 chiffrer le d\u00e9roulement des instructions de telle mani\u00e8re qu&rsquo;il devienne impossible d&rsquo;injecter\u2026<\/p>\n<p> <a class=\"continue-reading-link\" href=\"https:\/\/project.inria.fr\/emergences\/garantir-lintegrite-dexecution-des-programmes\/\"><span>En savoir plus<\/span><i class=\"crycon-right-dir\"><\/i><\/a> <\/p>\n","protected":false},"author":1891,"featured_media":587,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[29],"class_list":["post-586","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-recherche","tag-29"],"_links":{"self":[{"href":"https:\/\/project.inria.fr\/emergences\/wp-json\/wp\/v2\/posts\/586","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/project.inria.fr\/emergences\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/project.inria.fr\/emergences\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/project.inria.fr\/emergences\/wp-json\/wp\/v2\/users\/1891"}],"replies":[{"embeddable":true,"href":"https:\/\/project.inria.fr\/emergences\/wp-json\/wp\/v2\/comments?post=586"}],"version-history":[{"count":1,"href":"https:\/\/project.inria.fr\/emergences\/wp-json\/wp\/v2\/posts\/586\/revisions"}],"predecessor-version":[{"id":588,"href":"https:\/\/project.inria.fr\/emergences\/wp-json\/wp\/v2\/posts\/586\/revisions\/588"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/project.inria.fr\/emergences\/wp-json\/wp\/v2\/media\/587"}],"wp:attachment":[{"href":"https:\/\/project.inria.fr\/emergences\/wp-json\/wp\/v2\/media?parent=586"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/project.inria.fr\/emergences\/wp-json\/wp\/v2\/categories?post=586"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/project.inria.fr\/emergences\/wp-json\/wp\/v2\/tags?post=586"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}