Automatisation de la Spécification et de la Vérification d'applications Java Card
Institution:
Paris 11Disciplines:
Directors:
Abstract EN:
This work is about static verification of formally-annotated Java Card programs, by deductive methods. It aims at making such an approach practicable in an industrial setting. Implementations have been performed inside the Krakatoa prototype, and experiments were conducted on industrial applets. The first part concerns the improvement of the automation in the verification step. The first contribution is a precise interpretation of the semantics of the Java Card language: transactions and card tear. The second contribution proposes a policy of non-null references, allowing to verify the validity of memory accesses by static typing. The third contribution is an interprocedural analysis for inferring annotations, by abstract interpretation, allowing to obtain loop invariants, and pre- and post-conditions for methods. The second part is about the design of specifications. The first contribution proposes links between JML-like annotations and abstract specifications. Functional properties are expressed using algebraic specifications, whose link with the program is defined by a refinement relation. The second contribution proposes a structured use of UML diagrams allowing to generate annotations, to verify specific safety properties (e. G. Structural invariants, protocol descriptions). Finally, a perspective is opened towards the definition and the automatic propagation of annotations to assist security audits of Java Card applets.
Abstract FR:
Ce travail concerne la vérification statique de programmes Java Card annotés formellement, par des méthodes déductives. Il contribue à rendre cette approche praticable dans un contexte industriel. Ce travail a donné lieu à des implantations au sein du prototype Krakatoa, et des expérimentations sur des applets industrielles. La première partie concerne le renforcement du degré d'automatisation de l'étape de vérification. La première contribution est l'interprétation fine de traits de la sémantique du langage Java Card: transactions et arrachage de la carte. La deuxième contribution propose une politique de références non-null par défaut qui permet de vérifier la validité des accès mémoire par typage statique. La troisième contribution est une analyse inter-procédurale d'inférence d'annotations par interprétation abstraite, qui permet d'obtenir des invariants de boucle, ainsi que des préconditions et des postconditions de méthodes. La seconde partie concerne la phase amont c'est-à-dire la conception des spécifications. La première contribution propose des liens entre les annotations à la JML et des spécifications abstraites. Des propriétés fonctionnelles sont exprimées à l'aide de spécifications algébriques, dont le lien avec un programme annoté est défini par une relation de raffinement. La deuxième contribution propose une utilisation structurée de diagrammes UML permettant d'engendrer des annotations, pour vérifier des propriétés de sûreté spécifiques (e. G. Invariants de structure, utilisation de protocoles). Enfin, une perspective est ouverte sur la définition et la propagation automatique d'annotations pour aider à l'audit de sécurité des applets Java Card.