Validation de composants système

Contexte

Les systèmes embarqués tendent à évoluer vers les systèmes ouverts pour accroître leur réactivité aux besoins de nouvelles applications. Dans l’industrie des cartes à puce, par exemple, toutes les cartes étaient, il y a encore quelques années, bâties sur le modèle de la carte bancaire, à savoir une carte contenant une et une seule application. Aujourd’hui se développe une nouvelle gamme de produits carte, dits multi-applicatifs. L’objet de ces cartes est d’accroître la réactivité des logiciels embarqués en permettant le chargement « post issuance » de nouveaux services : ce chargement de nouvelles applications alors que les cartes sont déjà déployées dans les poches de leurs utilisateurs soulève de nombreux problèmes dont celui, essentiel (pour cette industrie), de la sécurité. Les cartes de la gamme JavaCard ont trouvé dans le langage et surtout dans la machine virtuelle Java un moyen d’atteindre cet objectif. La machine virtuelle se présente comme un support universel capable de recevoir de nouveaux programmes à chaque instant, tout en garantissant leur sécurité, en termes de confidentialité et d’intégrité. Le caractère universel de la machine permet aux programmes de fonctionner sur toutes sortes de microprocesseurs en définissant un ensemble d’abstractions de haut niveau.

Cependant l’industrie a rapidement atteint la limite de cette démarche. En effet, la machine virtuelle (vue comme un système d’exploitation à part entière dans le cas des cartes à puce Java) acquitte l’industrie du problème de la sécurité et de la portabilité des logiciels chargés « hors de l’usine ». Toutefois, cette même machine virtuelle impose un modèle d’abstraction : un paradigme d’applications à base d’objets persistants. Or les applications cartes sont variées par exemple celles des cartes reposant sur l’exploitation des normesISO 7816-4 voient en la carte un système de fichiers (sécurisés), d’autres encore, reposant sur les cartes de norme ISO 7816-7 exploitent la carte en temps que base de données. Comment, dans ces conditions distribuer des cartes en assurant qu’elles pourront supporter toutes sortes de nouvelles applications ? Il est certes possible de réaliser un système de fichiers à partir de la mémoire à objets persistants d’une carte Java, il est de la même manière possible de réaliser sur ces fondements un système de gestion de base de données, bien évidemment les performances en seront profondément dégradées.

Pour dépasser ces difficultés des résultats de recherche récents ont promu un ensemble de paradigmes architecturaux dans lesquels les systèmes évoluent par adjonction de nouveaux « composants système ». Ces architectures en « exo-noyaux » ont pu être appliquées aux systèmes embarqués . De tels systèmes permettent la juxtaposition efficace d’abstractions et peuvent donc s’adapter aux besoins de chaque application. Une application nécessitant un nouveau paradigme système pourra demander le chargement du composant système (appelé parfois oslib) au dessus d’une vue du matériel homogène (universelle) mais non abstraite.

Problématique

Les problèmes de fiabilité et de sécurité induits par l’extensibilité des systèmes n’ont aujourd’hui que partiellement été adressés. En effet, la sécurité apportée par les exo-noyaux embarqués, tels que Camille, n’adresse que les problèmes d’innocuité du code : une extension système, au même titre qu’une application, ne peut en effet pas obtenir les informations privées appartenant à une autre application (garantie de confidentialité) ; elle ne peut pas davantage fausser les résultats d’une opération extérieure (intégrité des opérations). Néanmoins des problèmes de sécurité essentiels restent en suspens, et cela tant en termes de disponibilité des ressources (éviter les dénis de ressource), qu’en termes de temps de réponse garanti (assurer des notions de « temps réel »).

Plus généralement les propriétés « non fonctionnelles » fournies aux applications par les extensions du système ne sont pas aujourd’hui validées formellement. Ainsi l’application doit nécessairement considérer les composants systèmes additionnels qu’elle exploite comme des parties intégrantes de sa base de confiance ( Trusted Computing Base). Cela est dommageable à la réutilisation des composants système embarqués par différentes applications qui ne se font pas mutuellement confiance.

Objectifs

Dans ce contexte, l’objectif de cette thèse est d’étudier les moyens d’assurer la fiabilité des composants système chargés dynamiquement. La possibilité d’obtenir de telles garanties a été montrée dans de précédents travaux dans le cadre de Camille sur un ensemble restreint de problèmes : les applications qui utilisent de nouveaux composants leur font confiance, par contre, les applications qui ne les utilisent pas voient leur intégrité et leur confidentialité assurées. Il s’agit ici d’étendre ces premiers résultats à un champ plus large de propriétés (et de systèmes) et de garantir la fiabilité des composants système à toutes les applications.

On s’attachera dans un premier temps à exhiber et spécifier un échantillon de propriétés caractéristiques des composants système servant de base à l’expérimentation. Cette tâche, malgré son apparente trivialité, soulève de nombreuses difficultés. Les éléments logiciels composant les abstractions système sont en interaction avec des matériels qui imposent des règles d’usage liées à leurs propriétés physiques. Dans ce contexte, une opération système correcte sur le plan fonctionnel peut être biaisée par l’entremise d’un comportement temporel (par exemple par le non respect du temps de rétention minimal de sollicitation d’une page EEPROM ou, à l’inverse, par le non respect d’une deadline critique imposée pour le temps de réponse à un protocole de communication). Nous regroupons ces préoccupations temporelles sous le terme de composants « temps réel ».

Aussi s’intéressera-t-on ensuite, d’une part, aux propriétés fonctionnelles des composants et, d’autre part, à leurs interactions avec le reste du système :

  • pour les propriétés fonctionnelles, il s’agira d’adapter des travaux en cours dans l’équipe sur la spécification fonctionnelle de composants logiciels (en particulier les ramener dans le contexte du système peu de traitement des données par exemple pour en augmenter l’automatisation) ; certains composants système sont très difficiles à identifier en raison de leur très forte interaction avec les autres composants système et les applications elles-mêmes. Ils agissent sur les applications en changeant l’interprétation des opérations élémentaires exécutées. Il s’agit ici de parvenir à spécifier les modifications comportementales entraînées par le chargement d’un nouveau composant système ;

  • un autre type de composants système a un impact explicite sur le code applicatif. Le problème se rapproche alors d’un « tissage » d’un aspect « système » sur le code applicatif et le reste du code système. La spécification formelle des aspects et du tissage est aujourd’hui étudiée dans le cadre de la programmation de composants applicatifs mais peu dans le cadre de composants système (on peut citer par exemple les travaux autour des ordonnanceurs Bossa tissés dans le noyau Linux ). Il s’agira ici d’appliquer l’approche « tissage » aux composants système afin d’en spécifier les interactions avec les autres composants système et le code applicatif.

À plus long terme, en raison de la faible connectivité des systèmes embarqués et de leurs faibles ressources, il est nécessaire qu’ils puissent, seuls, s’assurer de la qualité des composants qu’ils chargent. Il sera donc nécessaire d’envisager des solutions type PCC ( Proof-Carrying Code) . Pour que cela soit possible par la suite, il est nécessaire de s’orienter, dès le début, vers un type de preuves compactes et simples à valider. Rappelons que le principe de base de PCC est qu’en règle générale, il est plus simple de vérifier la validité d’une preuve préexistante que d’extraire cette preuve ex nihilo. Cette préoccupation est essentielle pour que l’exo-noyau puisse lui-même valider les composants chargés malgré les contraintes de performance et de ressources (mémoire et communications) disponibles et devra donc guider le choix des techniques utilisées.

Contexte

Laboratoire : LIFL., USTL, Lille.

Équipe : STC (Spécification Test et Contraintes).

Département d’enseignement : U.F.R d’IEEA (Informatique, Électronique, Électrotechnique et Automatique) de l’USTL.

Collaborations

Ce sujet s’inscrit dans plusieurs actions en cours:

  • ATIP CNRS « Jeunes Chercheurs » STAC (Spécification et Test d’Applications à base de Composants logiciels), responsable Isabelle Ryl ;
  • ACI Sécurité « SPOPS : Sécurité et sûreté des systèmes d’exploitation ouverts pour petits objets portables de sécurité » notifiée en juillet 2003 et coordonnée par Gilles Barthe (INRIA Sophia-Antipolis) ;
  • projet TACT-COLORS (COmposants LOgiciels Réutilisables et Sûrs), MOSAIQUES du contrat de plan état/région ;
  • projet « Composants Logiciels du Futur » de l’IRCICA (Institut de Recherche sur les Composants logiciels et matériels pour l’Information et la Communication Avancée), responsable Jean-Marc Geib.

Il s’effectuera également en collaboration avec :

  • Gemplus ;