iv
Elenco delle figure
fig. 1.1: La piattaforma Java 2
fig. 1.2: Corrispondenza bytecode-istruzioni mnemoniche 2
fig. 1.3: Modello della sicurezza offerto dalle JDK 1.0 6
fig. 1.4: Modello della sicurezza delle JDK 1.2 7
fig. 2.1: Alcune famiglie di carte attualmente in commercio 18
fig. 2.2: Struttura di una Contact Card 21
fig. 2.3: Comunicazione tra host e Java (Smart) Cards 22
fig. 2.4: Conversione dei file class e Java Card installer 24
fig. 2.5: Smart Card runtime environment 25
fig. 3.5: Grafo e possibili sequenze di esecuzione del bytecode 30
fig. 3.2: Esempio di grafo con nodi virtuali START e END 30
fig. 3.6: Esempio di grafo che ha un target con 4 archi entranti. 31
fig. 3.4.1: Esempio di grafo nodi (12 e 14) che non raggiungono
il nodo END 31
INDICE
v
fig. 3.5: Esempio di post-dominators (pds) e
immediate-post-dominators (ipds) 32
fig. 3.6: Blocchi di un grafo di flusso 33
fig. 3.7: Esempio di salto condizionato aperto / chiuso 34
fig. 3.8: Regole dei salti condizionati 36
fig. 3.9: Regole dell’ipd 37
fig. 3.7: Grafo di flusso di una parte del metodo
processCompleteTransaction(...)
43
fig. 3.11: goto 411, nessun frame salvato nel dizionario 44
fig. 3.12: if_icmplt 376, regola branch∉ 45
fig. 3.13: Regola ipd≠0, parte 1 – aggiorno il frame dell’ipd e il contesto 45
fig. 3.14: Regola ipd≠0, parte 2 – carico il frame per ricominciare
correttamente l’esecuzione 46
fig. 3.15: if_icmpne 376, regola branch∉ 46
fig. 3.16: Regola ipd≠0 47
fig. 3.17: Salto condizionato incontrato di nuovo 47
fig. 3.18: Regola branch= 48
fig. 3.19: Regola branch= - rewind e branch∉ 48
fig. 3.20: Regola ipd0 (I): chiusura del salto condizionato 385 49
fig. 3.21: Regola ipd0 (II): chiusura del salto condizionato 385 49
fig. 3.22: switch a 12 vie 51
fig. 3.23: Regola branch∉ 52
INDICE
vi
fig. 3.25: Regola ipd=0 53
fig. 3.26: L’in-frame di un target può cambiare durante la data-flow
analysis 54
fig. 3.27: Numero di entries nel dizionario durante la verifica 55
fig. 3.28: Ripetizione di istruzioni a causa della deallocazione del
dizionario 56
fig. 4.1: Gerarchia (incompleta) dei tipi di istruzioni nel BCEL 61
fig. 4.2: ClassLoader del BCEL 62
fig. 4.3: Grafo di flusso con una subroutine 67
fig. 4.4: Il bytecode non è strutturato: quali sono le istruzioni della subroutine? La nop fa parte della subroutine?
68
fig. 4.5: Bytecode corretto che nessun compilatore “standard” produce a partire da un sorgente java. Questo codice supera la
verifica effettuata dal verificatore della Sun, è invece rigettato dal JustIce.
69
fig. 4.6: Codice non valido: istanza del return address utilizzata più
volte 70
fig. 4.7: Relazione tra nodi del control-flow graph
(InstructionContextImpl), InstructionHandles, Instruction 72 fig. 5.1: Nuova struttura dei nodi del grafo (InstrContext) e loro
relazione con le istruzioni del bytecode 84
fig. 5.2: CFGraph e dizionario 87