Java Security Model Fabrizio Pastore Università degli Studi di Milano -­‐ Bicocca Class <<load>> ClassLoader Class <<load>> ClassLoader Bootstrap Extension ClassLoader ClassLoader App ClassLoader Class Loader Types • Nella JVM possono essere idenGficate due macro categorie di class loaders: – Bootstrap Class Loaders – Class Loader objects. • Il Bootstrap Class Loader: – è una parte essenziale della JVM – non può essere ignorato – Viene invocato durante il bootstrapping dell’ambiente Java e carica le classi fidate, di solito dal disco locale. • Ci sono diversi Class Loader Objects, forniscono a Java le capacità di dynamic linking: – – – – – Extensions Class Loader System Class Loader Applet Class Loaders RMI Class Loaders Secure Class Loaders Security Manager Class <<use>> <<load>> ClassLoader Extension Bootstrap ClassLoader ClassLoader App ClassLoader Operazioni Svolte quando una classe viene caricata • Controlla se la classe sia stata già caricata in precedenza – se si, resGtuisce la classe precedentemente caricata • Invoca il Bootstrap Class Loader – per caricare la classe dal CLASSPATH – questo previene il caricamento di classi che sosGtuiscono le classi fornite dalla JVM (ad esempio le classi del package java.lang) • Verifica invocando il Security Manager che il ClassLoader abbia i permessi necessari per creare la classe – se non li ha lancia una Security ExcepGon • Legge il contenuto del class file e lo me[e in un array di byte – questa operazione viene fa[a in modo diverso a seconda del class loader specifico – class loader diversi possono caricare le classi dal filesystem locale, piu[osto che da un database o dalla rete • Costruisce l’ogge[o che rappresenta la classe a parGre dal bytecode Operazioni Svolte quando una classe viene caricata • Recupera le classi dire[amente riferite dalla classe appena caricata prima che questa sia usata – include anche le classi usate dai costru[ori staGci (staGc inizializer) della classe e delle classi che estende • Verifica la classe con il Verifier Security Manager Class <<checks>> Verifier <<use>> <<load>> <<use>> ClassLoader Extension Bootstrap ClassLoader ClassLoader App ClassLoader Verifier • verifica suddivisa in due fasi – controlli interni (in fase di caricamento) – controllo a runGme (in fase di esecuzione) • ad esempio viene verificata la corre[ezza delle operazioni di cast • La verifica garanGsce che – Il class file ha il corre[o formato – gli stack (data stack, operand stack) non possono subire overflow / underflow – Le istruzioni del Byte code instrucGons sono riferite a parametri del Gpo corre[o – Non sono presenG conersioni di Gpo illegale – Gli accessi ai campi Private, public, protected, e default siano legali Access Controller Class <<checks>> Security Manager Verifier <<use>> <<load>> <<use>> <<use>> ClassLoader Extension Bootstrap ClassLoader ClassLoader App ClassLoader Policy <<use>> Access Controller Class <<checks>> Security Manager Verifier <<use>> <<load>> <<use>> <<use>> ClassLoader Extension Bootstrap ClassLoader ClassLoader App ClassLoader Policy <<use>> Access Controller <<may use>> <<use>> <<may use>> Class <<checks>> Verifier <<use>> <<load>> Security Manager <<use>> ClassLoader Extension Bootstrap ClassLoader ClassLoader App ClassLoader Java Security Model • Java gesGsce gli accessi alle risorse del sistema uGlizzando delle Policy (poliGche di sicurezza) configurabili dall’utente – queste policy perme[o un controllo a granularità fine dell’a`vità dell’applicazione • Quando il codice viene caricato gli vengono assegnaG dei permessi sulla base delle Policy a`ve in quel momento • Un permesso specifica quale Gpologia di accesso il codice possa fare su una certa risorsa. – Ad esempio: • un permesso può indicare che il codice può leggere (assegnando il permesso “read” ) il contenuto della cartella /home/user • un permesso può indicare che il codice può scrivere(assegnando il permesso “write” ) all’interno della cartella /tmp • Se un permesso non è esplicitamente garanGto ad un certo codice, il codice non può accedere alla risorsa controllata da quel permesso Policy • Un Policy serve a determinare se il codice può accedere ad una certa risorsa • I criteri per determinarlo sono: – codebase cioè l’URL (può indicare anche una posizione del filesystem) in cui si trovano i .class che sGamo caricando – signer il/i firmatari, cioè lo sviluppatore che ha (eventualmente) firmato un certo jar con la firma ele[ronica – principal il ruolo assegnato a runGme al codice in esecuzione, viene usato Gpicamente nei sistemi enterprise in cui viene effe[uato un login (non verrà visto a lezione) Security Policy File • La/Le policy che specifica/specificano quali permessi siano garanGG al codice proveniente da una o più locazioni, piu[osto che da uno o più sviluppatori possono essere specificate dall’utente in uno o più policy file – sono file di testo scri` con codifica ASCII – esiste un insieme di policy di default che sono specificate nel file • jre/lib/security/policy • All’interno del policy file ci sono una o più entry che associano ad un insieme di elemenG codebase/signer/ principal un certo inseme di permessi – quesG sono i permessi che vengono garanGG alle applicazioni che corrispondono al codebase/signer/principal elencaG • Le policy entry seguono una sintassi specifica – possono essere modificate con il comando policytool – or usando un text editor qualsiasi Esempio di Security Policy File URL da cui viene eseguita l’applicazione grant CodeBase "h[ps://www.rstcorp.com/users/gem", SignedBy “fabrizio" { Firmatario dell’applicazione (deve corrispondere ad un nome caricato nel keystore, vedremo più avanG di cosa si tra[a) permission java.io.FilePermission "read,write", "/applets/tmp/*"; permission java.net.SocketPermission "connect", "*.rstcorp.com"; }; Permesso: l’applicazione può leggere e scrivere i file nella cartella /applets/tmp Permesso: l’applicazione può conne[ersi a tu` i server il cui hostname termina per rstcorp.com Come sono verificaG i permessi a runGme? • Se viene richiesto l’accesso ad una risorsa prote[a – l’intero call stack viene analizzato per verificare se l’accesso può essere consenGto • Chi fa questo controllo? – Il SecurityManager tramite l’AccessController Come si può scrivere del codice che impone delle verifiche su cerG permessi? • Inserendo delle chiamate al SecurityManager SecurityManager sm = System.getSecurityManager(); != null) { if (sm P ermission perm = new java.io.FilePermission("/tmp/abc", "read"); sm.checkPermission(perm); } • Le classi fornite con la JDK includono già le invocazioni al security manager (ad esempio nella classe FileWriter ci sono le invocazioni che controllano i permessi di scri[ura su un file) • Il codice di una nostra applicazione conterrà chiamate ai metodi check del SecurityManager solo se la nostra applicazione implementa dei Permessi aggiunGvi – I permessi di accesso ai file sono automa9camente controlla9 Security Manager • implementa un set di metodi invocaG internamente dalle classi della JRE – – – – – checkRead(String file) checkCreateClassLoader() checkPermission(Permission perm) checkPermission(Permission perm, Object context) ... • è possibile definire SecurityManager personalizzaG – si suggerisce di fare l’override dei metodi check... se si intende rendere l’applicazione meno sicura – per rendere l’applicazione più sicure è bene uGlizzare Policy personalizzate • la JRE implementa un SecurityManager de[o DefaultSecurityManager Usare il DefaultSecurityManager • le applicazioni java eseguite all’interno di un sistema vengono eseguite senza SecurityManager • Il SecurityManager fornito con la JDK può essere abilitato nel seguente modo – da console: java -­‐Djava.security.manager YourApp – all’interno dell’applicazione code System.setSecurityManager(new SecurityManager()); • Le applet Java eseguite nel browser sono invece eseguite da una JVM configurata con il SecurityManager Default Security Manager • Implementa i metodi check.. ma i controlli veri e propri sono delegaG alla classe AccessController che è quella che implementa la logica di sicurezza Java – Quando un metodo check viene eseguito il SecurityManager invoca il metodo corrispondente dell’ AccessController – L’access controller idenGfica la Policy assegnata al codice in esecuzione – Quindi passa alla Policy: • l’elenco dei metodi presenG sullo stack • il permesso richiesto (e.g. FilePermission) – La Policy determina se l’accesso richiesto sia garanGto – Se l’accesso non è garanGto l’AccessController lancia una java.lang.SecurityExcepGon Default Policy: Sandbox • La JVM viene fornita con una policy di default che implementa le stesse regole implementate nel modello di sicurezza di Java 1.1 de[o Sandbox • Queste regole fanno si che il codice eseguito nella JVM sia considerato inaffidabile (untrusted). Il codice untrusted non puà fare diverse operazioni – – – – – – – – – Read files Write files Delete files Rename files Create a directory List the contents of a directory Check to see whether a file exists Create a ClassLoader Create a SecurityManager Create connecGons to other computers that the host from which applet comes Default Policy: Sandbox • Il codice Untrusted può svolgere un insieme limitato di operazioni – access to the CPU of the client machine – access to memory – access to the Web server from which the applet was downloaded Esempi di Policy java.io.FilePermission(String path, String acGons) • path è il percorso del file o della cartella per cui vogliamo garanGre all’applicazione cerG permessi di accesso – un percorso che termina per "/*” rappresenta tu` i file e le directory contenuG nella directory rappresentata dal percorso – un pecorso che termina per "/-­‐" rappresenta tu` i file e le cartelle contenute ricorsivamente nel percorso – la stringa "<<ALL FILES>>" ha un valore speciale e rappresenta qualsiasi i file del sistema • ac&ons è una stringa separata da virgole che conGene le keyword che rappresentano le azioni che vogliamo garanGre su quel percorso specifico: – "read", "write", "execute", "delete", and "readlink” java.uGl.PropertyPermission(String name, String acGons) • name è il nome di una proprietà di systema ("java.home", "os.name", etc). – Un asterisco puà comparire alla fine del nome per indicare tu[e le proprietà che hanno un prefisso comune (ad esempio “user.*” corrisponde sia a “user.dir” che a “user.home”) • ac&ons è una stringa contenente una lista di keyword separate da virgola, due sono le keyword possibili – read perme[e al codice di invocare il metodo System.getProperty per acquisire il valore di una certa property – write perme[e al codice di invocare il metodo System.setProperty per assegnare un valore ad un certa property Elenco di ProperGes che sono garanGte in le[ura nel Sandbox • • • • • • • • • • java.class.version java.vendor java.vendor.url java.version os.name os.arch os.version file.separator path.separator line.separator Elenco di Property che non possono essere le[e nel SandBox • • • • • java.class.path java.home user.dir user.home user.name Altri permessi • java.security.AllPermission • java.lang.reflect.ReflectPermission – target: suppressAccessChecks • java.security.SecurityPermission – controlla accesso ad ogge` legaG alla gesGone della sicurezzacome Security, Policy, Provider, Signer, and IdenGty • • • • • javax.security.auth.AuthPermsision java.io.SerializablePermission java.net.NetPermission java.awt.AWTPermission java.lang.RunGmePermission Permessi personalizzaG • Un’applicazione può definire il proprio set di permessi • Ad esempio un’applicazione per la visualizzazione di canali televisivi potrebbe perme[ere la definizione di Policy che garanGscano/neghino l’accesso a canali specifici – Definizione di una classe che estende Permission public class com.abc.TVPermission extends java.security.Permission – All’interno dell’implementazione dell’applicazione può essere inserito un controllo sulla possibilità di accedere ad un certo canale com.abc.TVPermission tvperm = new com.abc.TVPermission("channel-­‐5", "watch"); AccessController.checkPermission(tvperm); • Quando vengono assegnaG i protecGon domain alle classi? • Quando una classe viene assegnata ad un ProtecGonDomain? – Durante il caricamento – Le slide seguenG mostrano un’animazione di quello che succede Secure ClassLoader Net ClassLoader URL App ClassLoader ClassLoader CodeSource Secure ClassLoader Class protected final Class<?> defineClass(String name, ByteBuffer b, CodeSource cs) If a non-­‐null CodeSource is supplied a ProtecGonDomain is constructed and associated with the class being defined. URL CerGficate 1..* 1 1..* 1 CodeSource Secure ClassLoader 1 protected final Class<?> defineClass(String name, ByteBuffer b, CodeSource cs) If a non-­‐null CodeSource is supplied a ProtecGonDomain is constructed and associated with the class being defined. 1 Class 1..* 0..1 ProtecGon Domain URL CerGficate 1..* 1 1..* 1 CodeSource Secure ClassLoader 1 protected final Class<?> defineClass(String name, ByteBuffer b, CodeSource cs) If a non-­‐null CodeSource is supplied a ProtecGonDomain is constructed and associated with the class being defined. 1 Class 1..* 0..1 ProtecGon Domain * 1..* Policy Permission • Policy specifica quali permessi sono garanGG al codice che proviene da una certa code source • CodeSource idenGfica la provenienza di una o più classi, e consiste di due elemenG: – code locaGon (URL) – puntatore a un cerGficato firmato (se il jar è firmato con un firma ele[ronica) • Un Protec9onDomain rappresenta l'insieme di tu` i permessi che una certa classe può eseguire. – racchiude • una CodeSource • l’insieme di permessi assegnaG al codice che proviene dalla CodeSource – Le classi caricate da uno stesso URL e da uno stesso class loader appartengono allo stesso ProtecGonDomain • Esiste un system domain che conGne le classi fornite con la JDK e caricate dal BootstrapClassloader Esempio: counter.Counter (1) • se il codice è eseguito senza Security Manager il programma può leggere il contenuto del file counter_data java –Djava.security.manager counter.Counter counter_data • quando il codice è eseguito con il Security Manager l’accesso in le[ura al file counter_data è bloccato dal security manager java –Djava.security.manager counter.Counter counter_data • usare policytool per definire una policy – Codebase file:/home/user/Workspaces/ workspaceJavaPolicy/ Esempio: counter.Counter (2) • il comando policytool può esser usato per definire una policy – Codebase file:/home/user/Workspaces/ workspaceJavaPolicy/PolicyExample/bin – Add Permission • FilePermission /home/user/Workspaces/ “read” – La policy può essere salvata ad esempio nel file / home/user/Workspaces/workspaceJavaPolicy/ PolicyExample/myPolicy Esempio: counter.Counter (3) • l’esecuzione va a buon fine se indichiamo alla JVM il percorso (relaGvo o assoluto) del policy file con la policy da noi definita java –Djava.security.manager –Djava.security.policy=myPolicy counter.Counter counter_data • TentaGvi di accesso a file che non appartengono a so[odirectory di /home/user/Workspaces causano il rilascio di eccezioni java –Djava.security.manager –Djava.security.policy=myPolicy counter.Counter /home/user/ myString Esempio: ProperGesReader • Quando associamo un Security Manager l’esecuzione va a buon fine in quanto tu[e le properGes a cui la classe accede sono leggibili all’interno del sandbox java – Djava.security.manager properGes.ProperGesReader • Se vogliamo accedere ad un altra property, ad esempio “user.dir” dobbiamo definire una policy che includa un PropertyPermission di Gpo “read” per la property “user.dir” java –Djava.security.manager –Djava.security.policy=newPolicy properGes.ProperGesReader Esempio: ProtecGonDomainPrinter • mostra quale sia l’informazione memorizzata dalla jvm per ogni classe Esempio: Simple Applet • Una applet Java è un’applicazione Java che può essere eseguita in un browser – le applet sono cosGtuite da classi java (ci deve essere una classe principale che estende la classe astra[a Applet) – le classi usate da una applet sono Gpicamente incapsulate in uno o più file jar (ma non è necessario) – un applet viene integrata in una pagina web tramite il tag <applet> • questo tag perme[e di passare alla applet uno o più parametri • questo fa si che il codice della applet possa non venire modificato, mentre il suo comportamento può essere modificato a seconda dei desideri dello sviluppatore che ha implementato la pagina web – una applet viene Gpicamente resa disponibile tramite un server remoto che ospita la pagina html con il tag applet e il bytecode della applet • a[enzione il bytecode della applet viene eseguito LOCALMENTE • la pagina html all’url che segue integra una java applet h[p://3d-­‐ xplormath.org/j/applets/en/vmm-­‐polyhedron-­‐Dodecahedron.html Esempio: Simple Applet • Questo esempio mostra come la policy di default (il cosidde[o sandbox) associata all’esecuzione di applet non perme[a alcune operazioni, come ad esempio la scri[ura di un file nella home directory dell’utente • Questo esempio invece di usare un server Web remoto uGlizza un server Web locale installato nella VirtualMachine del corso ed accedibile puntando il browser all’indirizzo h[p://localhost • Le classi che compongono l’applet sono raggruppate in un jar file, il file può essere creato da console eseguendo il comando “make” • Per simulare l’installazione del jar nella pagina di un sito web remoto il Makefile include un’operazione di deploy che copia i file simpleApplet.html, simpleApplet.jar nella cartella /var/www/simpleApplet – l’operazione viene eseguita digitando su console il comando make deploy • Per eseguire l’applet nel browser occorre inserire nella barra dell’indirizzo l’indirizzo hGp://localhost/simpleApplet/simpleApplet.html Plug-­‐in e Privilegi • Alcuni sistemi so{ware prevedono di essere personalizzaG – archite[ure a plug-­‐in • Implementazione banale in SimplePluginApplicaGon – un jar/o una cartella del classpath che include una nuova versione di UserNameDetector perme[e di personalizzare l’output dell’applicazione SimpleAppletPlugin • Scenario, abbiamo: – un’applicazione di cui ci fidiamo SimplePluginApplica9on – un’estensione di cui non ci fidiamo SimplePluginApplica9on_Extension – vorremmo usare l’estensione per personalizzare l’output ma vorremmo essere sicuri che questa si limiG a personalizzare l’output senza fare altro • ma questo codice potrebbe fare delle cose non volute (e.g. scrivere sul filesystem), – l’uGlizzo di un SecurityManager e di Policy che si fidano solo di SimplePluginApplicaGon blocca l’esecuzione di _Extension – ci sono diverse situazioni in cui non vogliamo costringere l’utente a modificare le policy (si supponga che SimplePluginApplica9on siafornita dall’azienda mentre le sue estensioni non lo sono) • soluzione PrivilegedBlocks Privileged Blocks • Abilita del codice trusted ad accedere temporaneamente più risorse di quelle garanGte al CodeSource che lo implemente • Esempio: – le applicazioni web Gpicamente (applet) non possono accedere ai file che contengono i font, tu[avia un applicaGvo che visualizza i documenG potrebbe averne bisogno, quindi la JVM perme[e temporaneamente l’accesso ai file dei font(ma solo a quelli) Privileged Block: implementazione estendendo l a c lasse A cGon import java.security.*; class MyAcGon implements PrivilegedAcGon<Void> { public Void run() { // Privileged code goes here, for example: System.loadLibrary("awt"); return null; // nothing to return } } import java.security.*; public class NoReturnNoExcepGon { public void somemethod() { MyAcGon mya = new MyAcGon(); // Become privileged: AccessController.doPrivileged(mya); } public staGc void main(String... args) { NoReturnNoExcepGon myApplicaGon = new NoReturnNoExcepGon(); myApplicaGon.somemethod(); } } Esempio: DummyHack • In presenza di un securityManager non c’è modo di eseguire operazioni privilegiate se non sono in un doPrivilege block AsserGng a Subset of Privileges doPrivileged( PrivilegedAcGon<T> acGon, AccessControlContext context, Permission... perms) • AccessControlContext. – To perform an addiGonal security check within a different context, such as a worker thread. – an AccessControlContext instance can be obtained from a parGcular calling context with the method AccessControlContext.getContext, and saved for future use – If null no addiGonal security checks. • Permission... – varargs parameter to specify one or more Permission parameters or an array of Permission objects RiferimenG AggiunGvi • AppunG del Corso Università del Sannio (Sez. 3 e 4) – h[p://www.di.unisa.it/users/ads/corso-­‐security/ www/CORSO-­‐9900/java/index.htm • Libro Securing Java – h[p://www.securingjava.com Tutorial disponibili sul sito di Oracle • h[p://docs.oracle.com/javase/8/docs/technotes/ guides/security/smPortGuide.html • h[p://docs.oracle.com/javase/8/docs/technotes/ guides/security/permissions.html • h[p://www.digicert.com/code-­‐signing/java-­‐code-­‐ signing-­‐guide.htm • h[p://docs.oracle.com/javase/8/docs/technotes/ guides/security/permissions.html • h[p://docs.oracle.com/javase/7/docs/technotes/ guides/security/PolicyFiles.html • h[p://docs.oracle.com/javase/8/docs/technotes/ guides/jweb/security/manifest.html • h[p://docs.oracle.com/javase/tutorial/deployment/ applet/deployingApplet.html