Analyse de la sécurité de systèmes critiques embarqués à forte composante logicielle, par interprétation abstraite

par Marc Chevalier

Projet de thèse en Informatique

Sous la direction de Jérôme Feret.

Thèses en préparation à Paris Sciences et Lettres , dans le cadre de Sciences Mathématiques de Paris Centre , en partenariat avec LIENS - Laboratoire d'informatique de l'École normale supérieure (laboratoire) et de Ecole normale supérieure (établissement de préparation de la thèse) depuis le 01-09-2017 .


  • Résumé

    Contexte Les systèmes embarqués sont maintenant partout dans notre quotidien. Mais pouvons- nous pour autant leur faire confiance ? Au delà des problèmes de sûreté (i.e. l'absence de bogues logicielles telles que les erreurs à l'exécution) se pose celui de leur sécurité. Il faut en effet assurer que le comportement de ces systèmes ne peut pas être altéré par des tâches ou des intrusions malveillantes. Les pressions économiques sur les processus de développement d'une part, et sur les temps d'exécution d'autre part, incitent souvent au déploiement de larges systèmes distribués dans lesquels les protections ne sont assurées qu'au niveau logiciel. Il faut alors s'assurer que ces protections garantissent les propriétés de sécurité attendues. Prouver la sécurité d'un logiciel est une tâche délicate. Il s'agit de raisonner non pas, sur l'en- semble des traces potentielles d'un programme, mais sur comment cet ensemble de traces évolue lorsque leur environnement est modifié. Il s'agit donc de propriétés sur des ensembles d'ensembles de trace, ou encore, d'hyper-propriétés. On évite souvent une approche frontale en ayant recours à des approximations qui consistent à prouver des sécurités de sûreté plus fortes. Objectifs Le but de ce projet est de développer des outils d'interprétation abstraite pour vérifier la sécurité de grands systèmes à forte composante logicielle. L'accent sera mis sur le pas- sage à l'échelle. Nous considérerons des cas d'étude réalistes fournis par des partenaires indus- triels (Airbus dans un premier temps, puis éventuellement Rockwell et Colins). Ce projet s'articule autour de deux axes complémentaires. Le premier concerne l'analyse en avant. L'objectif est ici de prouver statiquement l'absence de faille de sécurité. Le second consiste à développer de nouveaux outils pour aider à comprendre l'origine de ces éventuelles failles de sécurité en utilisant des mé- thodes combinant à la fois analyse causale et analyse en arrière. Ce projet vise principalement l'analyse de tâches applicatives à haut niveau de criticité, qui sont hébergées par des plates-forme logicielles chargées d'assurer leurs propriétés de sécurité. Il comporte cependant des aspects beaucoup plus exploratoires. Il devrait permettre des avancées significatives dans la compréhension de l'analyse des propriétés sécurités des logiciels critiques embarqués. Bien entendu, sa portée ne se limite pas à ce seul secteur applicatif. Les techniques développées pour combiner analyse arrière et analyse causale pourront bénéficier à l'analyse de tout système concurrent, notamment les modèles de voies de signalisation intra- et extra-cellulaire que l'on trouve en biologie des systèmes. 1. Analyse avant des propriétés de sécurité. Les principales difficultés à analyser les pro- priétés de sécurités de systèmes embarqués résident plus dans la taille du code et dans la complexité des structures de données, que dans les propriétés de sécurité en elles-mêmes. 1En effet, les plateformes d'accueil, qui hébergent les tâches applicatives, assurent les pro- priétés de sécurité au niveau assembleur. Il faut donc être capable d'analyser à la fois du code source, C, mais aussi le code assembleur qui gère les accès aux registres, la pile, les appels de fonction, les sauts, etc.. Le code source, C, et le code assembleur sont souvent profondément intriqués. Par ailleurs, les plates-formes utilisent souvent des modes d'exé- cution différents selon les différentes phases du système, notamment pendant l'initialisa- tion des tâches applicatives. Il est alors nécessaire de distinguer dans l'analyse ces différents modes, et d'adapter l'abstraction en conséquence. La première partie de la thèse consistera à étendre l'analyseur statique ASTRÉE, développé dans l'équipe Antique, afin de permettre, non seulement, la prise en compte des bouts de codes écrits en langage assem- bleur, mais aussi l'inférence du bon respect des politiques de sécurités. Cela reposera donc sur la conception de domaines abstraits spécialisés pour la représentation bas niveau du contenu des registres, de la pile d'instructions assembleur, de la pile des appels de fonction, etc. Par ailleurs, des domaines dédiés permettront d'abstraire des sémantiques non stan- dards dans lesquelles les éléments sémantiques seront étiquetés par des informations sur les politiques d'accès aux ressources. Enfin, des stratégies de partitionnement d'états et de traces seront développées, pour améliorer localement la précision de l'analyse pendant les phases critiques, comme l'initialisation des tâches applicatives. 2. Analyse arrière des alarmes. L'analyseur statique fournit une réponse approchée. Si une analyse indique qu'il n'y a pas d'erreur, la sécurité du logiciel est assurée. Par contre, une analyse peut fournir une liste d'alarmes (que nous espérons suffisamment petite). Ces alarmes peuvent alors soit décrire des véritables failles de sécurité, soit au contraire être dues à l'imprécision de l'abstraction. Comprendre ces alarmes et corriger les failles est une étape compliquée et coûteuse. En effet, les failles peuvent être causées par des interactions entre plusieurs tâches concurrentes ; la distance entre la cause initiale d'une alarme peut en être arbitrairement éloignée (et peut remonter à plusieurs cycles du système) ; et enfin, il ne faut pas oublier que les étapes d'abstraction, en perdant de l'information, sont suscep- tibles d'avoir provoqué de fausses alarmes. Aussi est-il donc primordial de faciliter la tâche des ingénieurs, en fournissant un diagnostique précis sur l'origine de ces alarmes. C'est la question qui sera traitée dans la deuxième partie de la thèse. Nous proposons de construire de nouvelles analyses en combinant les avantages de deux grandes familles de travaux. En concurrence, les structures d'événements permettent de représenter de manière com- pacte les différentes étapes nécessaires à atteindre un but donné, pour un certain scénario. La force de ce formalisme vient de sa capacité à représenter les avènements concurrents in- dépendamment de l'ordre dans lequel ils ont été effectués. Par le passé, nous avons conçu de telles abstractions pour les structures d'événements de modèles de voies de signalisa- tion intra- et extra-cellulaire, mais ces abstractions ne sont pas suffisantes pour traiter les instructions de langages de haut-niveau (pour résonner sur des valeurs numé- riques par exemple), et ne passent pas à l'échelle des systèmes embarqués utilisés dans l'industrie. En analyse statique, l'analyse arrière permets de remonter à la source des invariants découvert par un analyseur, mais n'offre que très peu de support pour traiter le cas des sémantiques des langages distribués. Nous proposons donc de réunir le meilleur de ces deux mondes. Il s'agit donc de calculer en arrière des structures d'événements pour expliquer l'origine des alarmes qui viennent donc soit de failles de sécurité, soit d'impréci- sion de l'analyse. Les événements pourront être vu à différent niveaux d'abstraction pour exploiter par exemple, les opérations arithmétiques. De plus, ces structures d'évènements 2mêleront les étapes de la sémantique concrète, ainsi que les étapes d'abstractions propres à l'interpréteur abstrait. Enfin, il nous faudra étendre la classe des propriétés d'intérêt, afin de par exemple, s'interroger sur les différentes successions d'étapes qui ont permis un certain événement de se produite en nombre non borné (afin de garantir l'absence d'attaque par répétition par exemple). Conclusion Pour conclure, ce projet comporte à la fois des aspects applicatifs, et d'autres as- pects plus fondamentaux. Il cible essentiellement l'analyse des propriétés de sécurité des logiciels critiques embarqués. Il permettra également la conception de nouveaux outils théoriques pour appréhender l'analyse arrière des systèmes concurrents.

  • Titre traduit

    Proving the security of software-intensive embedded systems by abstract interpretation.


  • Résumé

    Context Nowadays embedded systems are everywhere. But can we trust them? Beyond security problems (i.e. the absence of software flaws such that runtime errors) there is the question of security. The behavior of these systems must be proven to not be alterable by malicious task or intrusion. Economic constraints on development process and on execution time often induce the deployment of large distributed systems in which protections are only enforced at the software level. So, it is necessary to check that these protections guarantees expected security properties. Proving the security of a software is a tricky task. It's not about reasoning on a set of potential traces of the program, but on how this set of traces change when their environment is modified. Thus, they are properties on set of traces, or hyper-properties. We often avoid direct approach using approximations which consist of proving stronger safety properties. Objectives The goal of this project is to develop abstract interpretation tools to check security of large software-intensive systems. The focus will stay on scaling up. We consider realistic case study supplied by industrial partners (firstly Airbus, then, potentially Rockwell and Colins). This project is built on the complementary axes. The first one is about forward analysis. The objective is to statically prove the absence of security breach. The other axis is about developing new tools to help to understand the origin of potential security breach using methods combining causal analysis and backward analysis. This project aims the analysis of software tasks with a high level of criticality, which are hosted on software platform in charge of ensures their security properties. However, it includes more exploratory sides. It should allow significant advances in the understanding of the analysis of security properties of critical embedded software. Of course, its scope isn't limited to this only field of application. The techniques developed to combine backward and causal analysis will benefit to the analysis of every concurrent system, in particular model of intra- and extra-cellular signaling pathway which can be found in systems biology. 1. Forward analysis of security properties. The main difficulties in analyzing security proper- ties of embedded systems lies more in the size and complexity of the source code than in the security properties themselves. In fact, hosting platform ensures security properties at the assembly level. Thus, we have to be able to analyze C source code, but also assembly code which handles access to registers, stack, function calls, jumps, etc.. C and assembly code are deeply entangled. Furthermore, platforms often use distinct execution mode according to the various phases of the system, especially, during initialization of software tasks. It is nec- essary to distinguish these modes in the analysis and to adapt abstraction consequently. The first part of the thesis will consist of extending static analyzer A STRÉE , developed in the Antique team, in order to allow, not only to take into account chunk of code written in assembly, but also the inference of respect of security policy. This will rely on the conception of specialized abstract domains for the low level representation of the regis- ters, stack, instruction blocks, etc.. Moreover, specialized domains will allow the abstraction of non-standard semantics in which elements will be tagged by information about the re- source access policy. Finally, state and trace partitioning strategies will be developed to locally improve the precision of the analysis during critical phases, like initialization. 2. Backward analysis of alarms. The static analyzer provides an approximate reply. If an anal- ysis claims there is no flaw, the security is proven. On the other hand, an analysis can give a list of alarms (hopefully small). These alarms can either be real security flaws, or coming from the imprecision of the abstraction. Understand these alarms and fix flaws are a difficult and expensive step. Indeed, flaws can come from interaction between several concurrent tasks; the distance between the initial cause of an alarm can be arbitrarily far away (even several system cycles before); and finally, we have to remember than abstraction steps, by losing information, are pat to cause a false alarm. Thus, it is primary to ease the task of en- gineers by providing a precise diagnosis of the origin of these alarms. That's the question that will be treated in the second part. We propose to build new analysis combining benefits of two big class of work. In concurrency, events structures allow representing compactly distinct steps which are needed to reach a given goal, for a given scenario. The strength of this formalism come from the capacity to represent concurrent events independently of the order in which they are performed. In the past, such abstraction have been conceived for event structures of intra and extra-cellular signaling pathway, but these abstrac- tions are not sufficient to process instructions in high level language (to reason on numerical values for instance), and don't scale to the industrial embedded systems. In static analysis, backward analysis allows to recover the source of the invariants found by an analyzer, but offer very poor support to handle the semantics of distributed languages. We propose to unify the best of both worlds. We have to backward compute event structure to explain the origin of alarms which come from either security breach, or imprecise analysis. These events can be viewed at various abstraction level to use, for instance, arithmetic operations. Moreover, these event structures will mix concrete semantics steps, as well as abstraction steps specific to the abstract interpreter. Finally, we have to extend the class of properties of interest, in order to, for instance, to question on the various successions of steps which have allowed a given event to happen an unbounded number of times (in order to guarantee the absence of repetition attacks for instance). Conclusion This project include both applicative and theoretical sides. It mainly targets analy- sis of security properties of critical embedded software. It will allow the design of new theoretical tools to understand backward analysis of concurrent systems.