Rennes - DeCert

Transcription

Rennes - DeCert
CELTIQUE
Certification de logiciel par analyse
sémantique
Semantic Analysis for Software Certification
T. Jensen, F. Besson, D. Pichardie
Decert kick-off January 2009
 in brief
Improve on the Software Certification process :
I
by providing better test case generation
I
by proposing new types of semantics-based certificates
Provide the necessary semantic analysis tools
I
precise and efficient static program analysis
Application domains :
I
Safety-critical software in embedded C (subject to existing
certification procedures)
I
Extended byte-code verification of Java byte code
(proposing new kinds of certificates) for safety and
security.
 in brief
Improve on the Software Certification process :
I
by providing better test case generation
I
by proposing new types of semantics-based certificates
Provide the necessary semantic analysis tools
I
precise and efficient static program analysis
Application domains :
I
Safety-critical software in embedded C (subject to existing
certification procedures)
I
Extended byte-code verification of Java byte code
(proposing new kinds of certificates) for safety and
security.
 in brief
Improve on the Software Certification process :
I
by providing better test case generation
I
by proposing new types of semantics-based certificates
Provide the necessary semantic analysis tools
I
precise and efficient static program analysis
Application domains :
I
Safety-critical software in embedded C (subject to existing
certification procedures)
I
Extended byte-code verification of Java byte code
(proposing new kinds of certificates) for safety and
security.
Semantics-based program analysis
Numeric domains :
I
Linear and non-linear program invariants
I
Decision procedures and abstract domains
Object-oriented languages
I
OO memory models ; null-pointer analysis
I
concurrency : data races
I
class-based analyses and modularity
Analysis goals
I
safety properties (absence of run-time errors) and
I
security (confidentiality, proper use of resources)
Software certification
Certification of static analyses
Proof-carrying code from abstract intepretation
Software certificates : communicating proofs
I
compression, certified verifiers, witnesses
Software certification
Certification of static analyses
Proof-carrying code from abstract intepretation
Software certificates : communicating proofs
I
compression, certified verifiers, witnesses
Abstract interpretation-based PCC
Prouver l’inocuité d’un code mobile
Une approche le Proof Carrying Code [NeculaPopl’97]
⇒ envoyer un code avec une preuve vérifiable
Une panoplie de méthodes de preuve :
I
par ordinateur
I
par intimidation
I
par obfuscation
I
par épuisement
coqc <pgm> <battement de paupière> Qed
Prouver l’inocuité d’un code mobile
Une approche le Proof Carrying Code [NeculaPopl’97]
⇒ envoyer un code avec une preuve vérifiable
Une panoplie de méthodes de preuve :
I
par ordinateur
I
par intimidation
I
par obfuscation
I
SANS épuisement
coqc <pgm> <battement de paupière> Qed
Prouver l’inocuité d’un code mobile
Une approche le Proof Carrying Code [NeculaPopl’97]
⇒ envoyer un code avec une preuve vérifiable
Une panoplie de méthodes de preuve :
I
par ordinateur
I
par intimidation
I
par obfuscation
I
SANS épuisement
coqc <pgm> <battement de paupière> Qed
Limiter la TCB du PCC
PCC certifiée par interprétation abstraite
Expérimentation
Le PCC original [Necula’97]
Program semantics
Safety policy
Producer
Consumer
code
VCGen
Lemma
certificate
Kcheck
Can run
Rejected
Proof Carrying Proof Checkers [TCS’2006]
Consumer
Producer
Semantics
Safety policy
checker
proof
code
certificate
Kcheck
Unsound
Sound
checker
CanRun
Rejected
Spécification du vérifieur
checker : program → certificate → bool
checker_ok :∀ p cert , checker p cert=true → p phi
p φ formalise la politique de sécurité.
Le certificat contient :
I
des invariants calculés par interprétation abstraite ;
I
des ”preuves” dans un format dédié pour vérifier les
invariants proposés.
Écrire un vérifieur, c’est facile :
checker p cert = false
Écrire un vérifieur puissant ET efficace
PS : génération automatique de certificats
Spécification du vérifieur
checker : program → certificate → bool
checker_ok :∀ p cert , checker p cert=true → p phi
p φ formalise la politique de sécurité.
Le certificat contient :
I
des invariants calculés par interprétation abstraite ;
I
des ”preuves” dans un format dédié pour vérifier les
invariants proposés.
Écrire un vérifieur, c’est facile :
checker p cert = false
Écrire un vérifieur puissant ET efficace
PS : génération automatique de certificats
Spécification du vérifieur
checker : program → certificate → bool
checker_ok :∀ p cert , checker p cert=true → p phi
p φ formalise la politique de sécurité.
Le certificat contient :
I
des invariants calculés par interprétation abstraite ;
I
des ”preuves” dans un format dédié pour vérifier les
invariants proposés.
Écrire un vérifieur, c’est facile :
checker p cert = false
Écrire un vérifieur puissant ET efficace
PS : génération automatique de certificats
Abstraction Carrying Code (ACC) [Puebla et al’04]
Le producteur génère un résultat I par analyse statique
⇒ itération de point fixe, widening, narrowing
Le consommateur exécute checker qui :
I
Vérifie que I est un (post) point fixe
P] (I) v I
I
I est suffisamment fort
I v φ]
⇒ Par correction de l’interprétation abstraite, conclue P φ
Cas d’étude : vérification de bornes de tableaux
Langage :
I
bytecode while (push, pop, load, store, if cmp, goto, +,*,-
I
méthodes statiques (récursion)
I
tableaux d’entiers
I
champs statiques
Analyse : à base de polyèdres convexes [CousotHalbwachs’78]
Élagage [ESOP’06] : pour ne conserver que les invariants
nécessaires à la propriété
⇒ certificats plus petits
Le défi : un vérifieur Coq pour avaler les monstres
Loc(m, p) = (en−1 :: · · · :: e0 :: s] , l] ) ! n = nbArgs(m 0 )
n−1
^
]
]
∃R+S0 +A ~ ei = rold
v Pre(m 0 )
i  ∃R0 (l )
i=0





S→S0
]
xauxjy :: s [?/auxj ],
∃S 0 +{res} ~auxj :=res]
!
n−1
^
]
old
]
0
lS→S 0 u ∃R0 ~ (ei = ri )S→S 0  Post(m )S0 →S 0



 v Loc(m, p + 1)

i=0
Pre, Loc, Post ` (m, p) : InvokeStatic m’
where p is the index of the j−th InvokeStatic in m
Loc(m, p) = (e :: s] , l] ) ∃R+A (~res:=e] (l] )) v Post(m)
Pre, Loc, Post ` (m, p) : Return
Éloge de la paresse – c’est la philosophie du vérifieur
L’analyseur calcule :
I
Projection, enveloppe convexe, transformation linéaires
I
Inclusion
Le vérifieur ne calcule pas :
I
Accumule des conditions de vérifications
[Flanagan&Saxe,Popl’01]
I
Décharge les conditions de vérifications à l’aide de
certificats
Résultats expérimentaux
size score certificate size % decrease
Program
before after
BSearch
80 100%
20
11
45%
HeapSort
143 100%
65
25
61%
276 100%
90
42
53%
QuickSort
Random
883
83%
50
31
38%
Jacobi
135
50%
31
10
67%
LU
559
45%
206
96
53%
SparseCompRow
90
33%
34
6
82%
FFT
591
78%
194
50
74%
Score : pourcentage d’accès aux tableaux vérifiés statiquement
Dans la plupart des cas, l’élagage divise par 2 la taille des
invariants.
De manière évidente, petit score ⇒ grosse compression.
Où sont les bugs ? Partout !
p phi
/\ checker p cert = false
I
Le vérifieur est incomplet
I
L’analyseur est incorrect
I
L’analyseur est incomplet
Micromega : vérification réflexive de certificats
arithmétiques
Fast Arithmetic Tactics [Types’06]
the linear case and beyond
infeasible([e1 , . . . , en ]) := ∀x̄ ∈ D , ¬(
n
m
^
ei (x̄) > 0)
i=1
avec D ∈ {Z, Q, R}
e ::= e1 + e2 |e1 ∗ e2 |var|cst
I
Indécidable sur Z
I
Décidable sur R (Tarski’49)
⇒ une preuve sur R donne une preuve sur Z
Vérification de certificats
Lemma (checker-ok)
∃cert, checker(cert, [e1 , . . . , en ]) = true ⇒ infeasible([e1 , . . . , en ])
V
Trame d’une preuve de ∀x̄ ∈ Zn , ¬( m
i=1 ei (x̄) > 0)
change infeasible([e1,...,en]) ;
apply checker-ok ;
exists (oracle [e1,\dots, en]) ;
(* vm_compute ;*)
reflexivity.
Avantages de l’approche
I
Vérifier c’est plus rapide que prouver
I
Le vérifieur est plus facile à prouver correct
I
Ici, les oracles sont des algorithmes existants
I
Le terme de preuve reste petit : taille du but + taille du
certificat
Certificat de positivité : Positivstellensatz (Stengle 74)
Definition (Cone)
Soit P = [e1 , . . . , em ] une liste de polynômes.
I
ei ∈ Cone(P)
I
p1 ∈ Cone(P), p2 ∈ Cone(P) ⇒ p1 + p2 ∈ Cone(P)
I
p1 ∈ Cone(P), p2 ∈ Cone(P) ⇒ p1 ∗ p2 ∈ Cone(P)
I
p2 ∈ Cone(P)
Theorem (Positivstellensatz)
∃cert ∈ Cone(P), ∀x̄, cert(x̄) < 0 ⇒ infeasible([e1 , . . . , en ])
En fait, Stengle a prouvé que c’était complet sur R
(en remplaçant < 0 par = −1)
Génération de certificats
Soit [e1 , ..., em ] une liste de polynôme.
Un certificat est un élément du cone de la forme :
X
Y
C :=
pI ×
ei
I⊆{1,...,m}
i∈I
avec pI est une somme de carré.
I
Si les pI sont constants, c’est un problème linéaire :
X
min
pI | ∀I, pI > 0, ∀x, C(x) = 0, C(cst) < 0
I
Pour degré fixé, c’est un problème d’optimisation convexe
Méthodes des points intérieurs (polynomial)
Linear Matrices Inequalities – Semi-definite programming
Contribution Coq 8.2
I
Paramétré par un anneau ordonné (Evgeny Makarov)
(Z, Z), (Q, Q) , (R, {0, 1})
I
Traitement (naı̈f) de la logique propositionnelle
I
Certificats étendus pour l’arithmétique linéaire entière
cutting plans proofs + énumération
Prouveurs :
I
I
I
I
linéaire : Fourier (ou glpk)
non-linéaire : driver de Hol Light pour csdp
Quelques leçons :
Ltac trop lent
glpk n’est pas fiable
vm compute essentiel
Conclusion
Une architecture PCC en Coq
I
génération efficace de conditions de vérification
I
à base de vérifieurs réflexifs
I
utilisant des résultats d’analyses statiques
Cas d’étude : une analyse polyhèdrique
Travaux futurs :
I
Invariants non-linéaires
I
Étendre le langage
Couche objet ≡ control flow analysis
I
Étendre la logique des vérifieurs
Certificats pour SMT solver (demain)

Documents pareils