Foundational
Proof-Carring Code
Andrew W.Appel
Princeton University
Relatore: Fabio Mortillaro 802657
Anno accademico 2005-06
Corso di Analisi e Verifica Programmi
Proof-Carrying code: PCC
Framework per la verifica automatica delle proprietà di
sicurezza dei programmi scritti in linguaggio macchina
Tipologie di PCC
Conventional PCC
Foundational PCC
Problema: “quis custodiet ipso custodes?”
Fabio Mortillaro 802657
2
Scopo e modalità di PCC
Eseguire solo software sicuro
Software: piccole applicazioni, plugin per browser, applet,
estensioni del kernel di OS
Sicuro: accede solo alle zone di memoria ad esso dedicate,
rispetta le variabili private delle API a cui è linkato, non accede a
risorse senza autorizzazione, non sovrascrive i valori delle
variabili, non legge dati privati
Costruire e testare dimostrazioni matematiche sul
programma scritto in LM
Garantisce sicurezza solo se non ci sono bugs nel verificationcondition generator, negli assiomi logici, nelle typing rules o nel
proof-checker
Fabio Mortillaro 802657
3
Esempi
TAL (Typed Assembly Language)
•Linguaggio assembly idealizzato su
architetture RISC
•Semantica operativa formale per una
semplice macchina astratta
Java System:•Sistema
byte-code
fornisce
garanzia
di
di tipiverifier
formali che
catturauna
lo stato
del
lo nel
stackverifier
e la memoria
sicurezza soloregistro
se nondelciprocessore,
sono bugs
stesso,
•Importante
type-checker
per quasiotutte
le
nel compilatore
JIT, nel garbage
collector
in altre
parti
architetture Intel
della JVM
•Prototipo di compilatore per un linguaggio
imperativo sicuro
TAL: compilatore produce TAL e si effettua il typeTML (Typed Machine Language)
checking del linguaggio
a basso livello che fornisce una
•Linguaggio a più basso livello di TAL
garanzia di sicurezza
solo se
ci sono ebugs
nel
•Interfaccia
tra non
il compilatore
il prover
compilatore stesso,
nel type-checker
o nell’assembler
•Sposta
il lavoro al type-checker
che traduce TAL in ML
Semplificato in TML
Fabio Mortillaro 802657
4
Soluzione
Il provider di un programma PCC deve fornire il
codice eseguibile e la dimostrazione machinecheckable che il codice non violi la politica di
sicurezza della macchina su cui gira
Il computer non lancia il programma finché non
ha verificato che il codice sia sicuro (la
dimostrazione è valida)
Fabio Mortillaro 802657
5
TYPE SYSTEM
Conventional
PCC
Descrive come un linguaggio di
(Typed-Specialized)
programmazione classifica i valori e le
variabili in TIPI, come li può manipolare
e come
essi interagiscono
tra di loro
scritte
utilizzando
una logica
che
Dimostrazioni
ha incorporata la comprensione di un particolare
type-system
Type constructor appaiono come primitive delle
logica stessa e alcuni lemmi sono costruiti
all’interno del sistema di verifica
Semantica dei costruttori e validità dei lemmi
sono dimostrati rigorosamente dagli autori del
PCC ma non in modo meccanico
Fabio Mortillaro 802657
6
Conventional PCC: VCGen
VCGen (Verification Condition Generator): ricava
per ogni programma una verification condition
(formula logica che se vera garantisce la
sicurezza del programma)
VCGen
usato dal provider e dal consumer per trovare
la giusta formula per il programma considerato
VC fornita dal provider e controllata dal consumer
Fabio Mortillaro 802657
7
LOGICA di HOARE
Sistema formale che fornisce un insieme di regole
logiche al fine di motivare la correttezza di un
programma con il rigore della logica matematica
Conventional PCC: VCGen
TRIPLA di HOARE
Programma
grosso
CedilladiSystems
Descrive
come(es:
l’esecuzione
un pezzo di è
codice
lo stato righe
della computazione
costituitocambi
da 23000
di codice C)
{P} C {Q}
Esamina
le istruzioni macchina
del programma
P (precondizione),
C(comando),
Q (postcondizione)
Espande le sostituzioni del codice macchina secondo
la logica di Hoare
Esamina i parametri formali per trovare le
precondizioni e i risultati per le postcondizioni
Bug in VCGen consente a formule errate di
essere approvate
Fabio Mortillaro 802657
8
Foundational PCC
Sistema per la specifica, la dimostrazione automatica e il
controllo della sicurezza dei programmi in LM
Evita di specializzarsi per un type-system
Evita di usare un VCGen
Semantiche operazionali delle istruzioni macchina e
politiche di sicurezza definite in una logica
sufficientemente espressiva da servire da fondamento
alla matematica
Logica di alto livello con pochi assiomi dell’aritmetica, da cui è
possibile costruire la maggior parte della matematica moderna
Fabio Mortillaro 802657
9
Foundational PCC
Provider deve fornire il codice e una dimostrazione in
foundational logic che il codice soddisfi la politica di
sicurezza del consumer
Dimostrazione deve definire in modo esplicito, con i fondamenti
di matematica, tutti i concetti richiesti e provare in modo esplicito
tutte le loro proprietà
Dimostrazione della correttezza rispetto ai tipi inserita nella
dimostrazione della sicurezza del codice
Vantaggi rispetto Conventional PCC:
Flessibilità: provider può inserire un nuovo type-system o una
nuova politica di sicurezza
Sicurezza: base da verificare è minore (sistema è più piccolo
con logica di alto livello, definizione delle semantiche delle
istruzioni macchina e politica di sicurezza)
Fabio Mortillaro 802657
10
Foundational PCC
1.
2.
3.
4.
Scelta della logica e del framework
Specifica delle istruzioni macchina
Definizione della sicurezza
Dimostrazione della sicurezza
5.
Typing rules
Modelli semantici
Modelli indicizzati per i tipi ricorsivi
Mutable fields
Pruning del runtime system
Fabio Mortillaro 802657
11
1 - Logica e Framework
LF (Logical Framework)
Metalinguaggio per la specifica di sistemi deduttivi
rappresentati attraverso la dichiarazioni di costanti. È
una teoria dei tipi definita su tre livelli: oggetti, tipi e
generi di alto livello di Church con assiomi
Logica
di aritmetica
TWELF
Versione
corrente di una attraverso
serie di implementazioni
Rappresentata
la metalogica
del framework logico LF. Twelf è un software di
che produce in modo naturale delle
ricerca
LF
dimostrazioni inviabili al consumer
Framework TWELF
Fabio Mortillaro 802657
12
TWELF
1/2
tp : type
tm : tp -> type
o: tp
num: tp
arrow
%tipi della logica
%tipo metalogico di tipo type
%proposizioni (primitive di tp)
%numeri (primitive di tp)
%costruttori di tipi funzione
pf
%data una formula A, la sua
%dimostrazione appartiene a pf(A)
lam
@
imp
forall
%costruttore di funzioni
%applico una funzione ad un argomento
%implicazione logica
%quantificatore universale
Fabio Mortillaro 802657
13
TWELF
2/2
Regole di introduzione e di eliminazione per
i costruttori
beta_e
forall_i
beta_i
forall_e
imp_i
not_not_e
imp_e
Lemmi e nuovi operatori
and
and_i
and_e1
Fabio Mortillaro 802657
14
2 – Istruzioni macchina
Machine state: coppia
(r,m) costituita da:
Register
r
Memory m
Relazione da interi
(indirizzi) a interi
(contenuti)
Fabio Mortillaro 802657
15
Istruzioni
1/2
Machine step = esecuzione di un’istruzione
Esecuzione = (r , m) (r ' , m' )
Descrive
la relazione tra lo stato della macchina
prima e dopo l’esecuzione
Fabio Mortillaro 802657
16
Istruzioni
2/2
Considero l’istruzione r (1) r (2) r (3)
Descritta
da
( r , m) ( r ' , m' )
r ' (1) r (2) r (3) (x 1.r ' ( x) r ( x)) m' m
Da
cui è possibile definire add(i,j,k)
add (i, j , k )
r , m, r ' , m'.r ' (i ) r ( j ) r (k )
(x i.r ' ( x) r ( x)) m' m
Fabio Mortillaro 802657
17
Instruction fetch e decoding
1/2
Supponiamo di codificare l’istruzione add in una
word a 32 bit con opcode = 3
decode( w, instr )
(i, j , k
0 i 25 0 j 25 0 k 2 5
w 3 226 i 221 j 216 k 20
instr add (i, j , k )
...
Fabio Mortillaro 802657
18
Instruction fetch e decoding
2/2
SLED
(Specification Language for Encoding and Decoding)
•Descrive
le rappresentazioni
di istruzioni
macchina
Macchine
reali non usano
l’aritmetica
degli interi ma
in linguaggio
assembly
quella modulare
•Usa
fields emacchine
tokens (parti
di istr),
Alcune
hanno
PCpatterns
multipli (Sparc)
(rappresentazioni binarie di istr o gruppi di istr),
Alcune macchine hanno istruzioni di lunghezza variabile
constructors (mapping tra livello astratto e binario)
(Pentium)
•Supporta implementazioni di elementi a livello
macchina in modo indipendente dalla macchina
Tutte le istruzioni non definite vengono trattate come
illegali in base alla politica di sicurezza
Parte sintattica: relazione decode
1035 (600) linee di logica Twelf (da 151 linee di specifiche SLED)
Parte semantica: definizione di add,..
600 linee di logica (compresa definizione di logica modulare)
Fabio Mortillaro 802657
19
3 – Definizione della sicurezza
Situazione: alcuni stati non hanno
successore e r(PC) punta a istruzioni
illegali (violano politica di sicurezza)
Esempio: “solo gli indirizzi readable
saranno caricati”
Definisco
il predicato readable
readable ( x) 0 x 1000
Fabio Mortillaro 802657
20
Esempio
1/3
L’istruzione load (i, j, c)
r , m, r ' , m'.r ' (i ) m(r ( j ) c)
(x i.r ' ( x) r ( x)) m' m
diviene load (i, j, c)
r , m, r ' , m'.r ' (i ) m(r ( j ) c)
readable (r ( j ) c)
(x i.r ' ( x) r ( x)) m' m
Fabio Mortillaro 802657
21
Esempio
2/3
Stato è sicuro se ogni stato raggiungibile nella
sua chiusura di Kleene ha un successore
safe state(r , m)
r ' , m'.(r , m r ' , m' ) r" , m". r ' , m' r" , m"
Un programma p è caricato in un punto start
della memoria m se
loaded ( p, m, start ) i dom( p).m( start i ) p(i )
Fabio Mortillaro 802657
22
Esempio
3/3
Un programma p è sicuro se
safe( p)
r , m, start.loaded ( p, m, start ) r ( PC ) start
safe state(r , m)
OSS: non c’è VCGen e la sintassi e la
semantica in esso implicite sono rese esplicite e
più concise
Fabio Mortillaro 802657
23
4 – Dimostrazione della
sicurezza
Per produrre dimostrazioni in modo automatico
servono:
Typed Intermediate Languages
Typed Assembly Language
Dimostrazioni per induzione strutturale in ogni
punto del programma per dimostrare che è
sicuro
CPCC: dimostrazioni fatte dai fornitori
FPCC: dimostrazione della correttezza
dei tipi inserita
nella dimostrazione spedita al consumer
Fabio Mortillaro 802657
24
Compilatori diversi
Fabio Mortillaro 802657
25
Typing rules
Approccio sintattico (definizione di |- )
m | x : 1 2
Lemma
m | msemantico
( x) : 1 che
m(deve
x 1essere
) : 2 dimostrato:
dimostrazioni semantiche sono preferibili alle
riduzioni sintattiche perché esse portano a
Approccio
(lemma
1semantico
nella
Se x ha tipodimostrazioni
memoria
allora il da
contenuto
2
più cortem
e maneggevoli
in
della locazione
di memoria
x ha tipo
1
Foundational
Logic
dimostrare)
e quello della locazione di memoria x+1 ha tipo 2
| x :m 1 2
| m( x) :m 1 m( x 1) :m 2
Fabio Mortillaro 802657
26
Modelli semantici
Type: insieme di values
Lambda
calcolo: costrutto sintattico
Value: coppia (m,x) dove m è la memoria
e x un intero (indirizzo)
Per
puntatori a strutture dati, x è il root-pointer
della struttura
Per le funzioni, x è l’entry address della f
Fabio Mortillaro 802657
27
VALUE ((a,m),x)
Coppia costituita da uno State (a,m) e da un
root-pointer x
Modelli semantici
STATE (a,m)
Coppia costituita da un allocset a e dal
contenuto della memoria m
Modello buono per strutture dati allocate staticamente
Fabio Mortillaro 802657
28
Modelli semantici - Limitazioni
Problemi:
ricorsione
heap
(mutable fields)
Soluzioni:
Modello
indicizzato
Mutable fields
Fabio Mortillaro 802657
29
Modello indicizzato
Value: coppia k, v dove k è un indice di
approssimazione e v è un valore
k, v significa che v approssimativamente
ha tipo e tutti i programmi che eseguono
per meno di k istruzioni non notano diversità
Tipo: insieme di coppie k, v dove k è un
intero non negativo, v è un valore e è
tale che se k, v e 0 j k allora j, v
Fabio Mortillaro 802657
30
Mutable fields
Immutable fields
State: coppia (a,m) dove m è la memoria e a è un insieme di indirizzi allocati
Mutable fields
State: coppia (a,m) dove m è la memoria e a è una mappa da indirizzi a tipi
Definizione metalogica di tipo:
allocset num type
value allocset memory num
fin
type num value o
Problema: ricorsione
Soluzione: sostituire il tipo nell’allocset col suo numero di Godel
Fabio Mortillaro 802657
31
Livelli di astrazione di
un’istruzione
1.
2.
3.
4.
5.
6.
1/2
Intero (codice opcode 3 per l’add)
Implementa una relazione sugli stati ( r , m) ( r ' , m' )
Livello di astrazione usato in modo
Istruzione
add (es
Sparc) implementa
implicito
daldiConventional
Proof- una add
indipendente
dalla
macchina
Carrying
Code
Add manipola non solo i registri ma delle variabili locali
Add è una delle numerose istruzioni tipate che
lavorano sui tipi (int int int)
Add tipata viene specializzata per un particolare
contesto dove appaiono alcune sue istanze
Fabio Mortillaro 802657
32
Livelli di astrazione di
un’istruzione
2/2
FPCC ricerca e tenta di trovare modelli
semantici per ciascuno dei livelli di
astrazione in modo da poter dimostrare
lemmi che consentano il passaggio da un
livello all’altro
Livelli di astrazione definiti per
modularizzare le dimostrazioni in modo da
semplificare il lavoro del prover
Fabio Mortillaro 802657
33
5 - Pruning del Runtime System
Problemi: bugs del garbage collector,
debugger, mashaller/unmarshaller,…
Soluzione: portare le componenti dal
runtime system al codice utente typecheckable
Bugs
individuati dal type-checking
Type-safe Bugs che portano a
comportamento non corretto ma sicuro
Fabio Mortillaro 802657
34
Garbage collector
Problemi:
Alloca
e dealloca
di memoria
con oggetti
Regionaree
calculus
di Tofte e Talpin
Lambda
calcolo tipato in modo polimorfico con
di tipo
diverso
Intensional
Type Analysis
annotazioni che
rendono esplicita
l’allocazione e la
Attraversa
tipo
sconosciuto
in liberati
modo
Utilizzo
dioggetti
linguaggi
che
consentono
il polimorfismo
deallocazione
delladi
memoria.
Possono
essere
ad
hoc,
l’analisi
tipi a runtime
e la morti
definizione di
arbitrario
solo
oggetti
che dei
probabilmente
sono
operatori che determinino la struttura di un abstract
Soluzioni:
type
Region
calculus di Tofte e Talpin
Intesional type analysis
Fabio Mortillaro 802657
35
Conclusioni
Sfrutta il lavoro di molti
Logical framework (teoria e implementazione)
Prover automatici
Type theory e type system
Verifica partendo dall’insieme di assiomi più piccolo
possibile, usando il più piccolo e semplice verifier e
runtime system
Riduzione della costo di computazione dei sistemi
che fanno girare codice macchina da risorse non
sicure
Fabio Mortillaro 802657
36