Sicurezza in Java z Evoluzione dei modelli di sicurezza in Java z Architettura di autorizzazione nel JDK 1.2 1 Java Virtual Machine caricamento in memoria del file .class Loading Linking Verification verifica byte-code Preparation allocazione spazio in memoria Resolution risoluzione di tutti i riferimenti simbolici ad altre classi inizializzazione di tutte le variabili statiche allocate Initializing Esecuzione di main() Esempio: int intero = 5 preparation: memoria per l’int inizializing: il valore di int viene modificato in 5 2 Il Class Loader di Java (1.) Caratteristiche: • “lazy” loading; le classi sono caricate “on demand" e possibilmente all’ultimo momento Esempio: Prova p = new Prova(); Attrib1 a1; classe Attrib2 a2=new Attrib2(); Prova initAttrib1() { a1=new Attrib1(); } • programmabilità 3 Il Class Loader di Java (2.) Recupero dei dati della classe Definizione della classe Risoluzione della classe Restituzione della istanza di Class Caricamento della classe Caricamento delle superclassi Esecuzione della fase di Verification N.B: la risoluzione può essere ritardata, non tutte le classi riferite devono essere immediatamente caricate 4 Struttura della classe Class Loader loadClass(…) findLoadedClass(…) Classe ClassLoader findSystemClass(..) findClass(…) resolveClass() defineClass(….) 5 class MyClassLoader extends ClassLoader { 6 Tipi di Class Loader • class loader interno; in JDK 1.2 usato solo per caricare le classi di Java; •secure class loader; in JDK 1.2 permette di implementare politiche di sicurezza più granulari; • applet class loader; ogni browser implementa un proprio class loader; • URL class loader; permette di caricare classi da un insieme di URL distinte I programmatori possono definire class loader propri purchè tutti estendano i tipi predefiniti Primordial CL java.lang.CL java.security.SecureCL java.net.URLCL AppletCL 7 • Il class loader che fa il bootstrap del processo di caricamento si chiama primordial class loader (generalmente scritto in linguaggio nativo). Il class loader che definisce una classe si chiama defining class loader • concetto di delega. Un class loader puo’ direttamente caricare una classe oppure delegare un altro class loader a tale compito (ad esempio il class loader delle classi dell’applicazione si puo’ delegare al class loader interno il caricamento delle classi di sistema; questo garantisce che tutte le classi di sistema abbiano tipi considerati unici) A tempo di compilazione il tipo di una classe corrisponde a un nome A runtime il tipo effettivo della classe è determinato dalla coppia nome della classe e defining class loader: <C, L> Due tipi di classe nell’ambiente runtime Java sono considerati uguali se i tipi delle classi e i loro defining class loader sono uguali 8 • Istanze di MyClassLoader possono delegare il caricamento della classe java.lang.String al class loader di sistema • Se C è il risultato di L.defineClass() allora L è il defining class loader • Se C è il risultato di L.loadClass allora L è il class loader che ha avviarto il processo di loading di C Ogni classe è permanentemente associata al proprio defining class loader ed è il defining class loader che avvia il processo di loading di qualunque classe riferita da C Questo permette di mantenere la consistenza temporale dei namespace e la consistenza dei namespace in presenza di delega 9 Occorre garantire che le due occorrenze della classe X siano dello stesso tipo per garantire la safety della chiamata di metodo f 10 11 Class Loader e Sicurezza Il Class Loader gioca un ruolo fondamentale • crea spazi di nomi separati; • si coordina con il componente Security Manager che implementa le politiche di sicurezza www.sun.com Car Class Classi nella Virtual Machine Class Loader L1 Internet Car(ora.com) Class Loader L2 www.ora.com Car Car (sun.com) L1 L2 Car Car Class Class Class 12 Modello di Sicurezza in JDKTM 1.0 13 Modello di Sicurezza in JDKTM 1.0 Vantaggi: • la sandbox protegge l’accesso a tutte le risorse di sistema • i programmatori di applicazioni (non di applet) possono scrivere un proprio Security Manager per “aprire” la sandbox Limitazioni: • modello troppo restrittivo • i programmatori di applicazioni (non di applet) devono scrivere un proprio Security Manager per “aprire” la sandbox • ad ogni politica diversa corrisponde una nuova versione del SecurityManager 14 Modello di Sicurezza in JDKTM 1.1 15 Modello di Sicurezza in JDKTM 1.1 Vantaggi: • la firma del codice assicura: – autenticazione – integrità Limitazioni: • applicazioni locali non sono sottoposte ad alcun controllo • tutte le classi presenti nel CLASSPATH sono considerate fidate 16 Modello di Sicurezza in JDKTM 1.2 Obiettivi: • estensione dei controlli di sicurezza sia alle applet sia alle applicazioni (esterne e locali) • configurabilità semplificata delle politiche di sicurezza • controlli di accesso granulari Elementi caratterizzanti la nuova architettura: • politica di sicurezza • definizione di permessi di accesso • controllo d’accesso 17 Modello di Sicurezza in JDKTM 1.2 18 Politica di Sicurezza (1.) • Politica di sicurezza: matrice di controllo dell’accesso Codice Permessi Li Gong applet, read, write /tmp and home/gong applet firmate Esempio di Politica di Sicurezza (rappresentazione ASCII di default ): grant signedBy “*”, CodeBase “http://java.sun.com/people/gong/” { permission java.io.FilePermission “read, write”, “tmp/*”; } 19 Politica di Sicurezza (2.) • CodeSource (chi/dove): località di provenienza del codice e insieme di certificati utilizzati per la firma del codice • Permissions: permessi attribuiti al codice • abstract class Policy: – public static Policy getPolicy() – public static void setPolicy(Policy policy) – public abstract Permissions getPermissions(CodeSource codesource) – public abstract void refresh() 20 Secure Class Loader e Protection Domain Protected final Class defineClass(String name, byte [] b, int off, int len, CodeSource cs) 21 Esempio di Secure Class Loader (1.) public class AgentClassLoader extends SecureClassLoader …….. public AgentClassLoader() {} public AgentClassLoader( Environment env, String agentClass, AgentID agentID ) { …... codeSource = new CodeSource( AgentToURL( agentClass, agentID ), new Certificate[0] ); } public static URL AgentToURL( String AgentClass, AgentID agentID ) {return new URL( "http://" + agentID.place.domain + "/" + agentID.place.place + "/" + AgentClass + } 22 Esempio di Secure Class Loader (2.) protected Class findClass(final String className) throws ClassNotFoundException { ….. return myFindClass( className ); } private Class myFindClass( String className) throws Exception {if la classe si trova in locale then byte [] classData= ...loadClassFile(); verifico l’autenticità delle firme sul codice defineClass( className, classData, 0, classData.length, codeSource ); else la cerco in remoto ……. } 23 Permission Class • I permessi sono caratterizzati da: – un type: che tipo di permessi (permessi relativi a file, a socket..); – un nome: identifica l’oggetto a cui i permessi sono riferiti – azioni • 11 permessi standard Java, ognuno dei quali implementato come classe Esempio: il FilePermission class FilePermission p1 = new FilePermission (“-”, “execute”); FilePermission p2 = new FilePermission (“/myclasses/*”, “read”); 24 Struttura della gerarchia 25 Controllo dell’Accesso JDK 1.1 SecurityManager security=System.getSecurityManager(); if (security !=null) { Security.checkRead(“path/file”); JDK 1.2 FilePermission perm = new FilePermission(“path/file”,“read”); AccessController.checkPermission (perm); 26 Algoritmo di Controllo dell’Accesso (1.) • L’AccessController controlla se tutti i domini nella catena delle chiamate hanno il permesso richiesto • strategie di implementazione: lazy evaluation 27 Algoritmo di Controllo dell’Accesso (2.) • quando nello stack sono presenti più domini, tutti devono avere il permesso richiesto 28 Caratteristiche del modello di sicurezza di JDK 1.2 Vantaggi: • separazione tra specifica delle politiche ed effettivo enforcement • estensibilità e scalabilità dei controlli di sicurezza (checkRead vs. checkPermission) => controllo dell’accesso “tipizzato” Limiti: • aggiornamento delle politiche semi-statico • difficoltà di controllo dell’uso delle risorse (CPU..) 29