Tóth Gergely, május 5. ELTE JAVA Speci JAVA Security Tóth Gergely Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
Tóth Gergely, május 5.(2) ELTE JAVA Speci Tartalom JAVA security alapkövek Buffer overflow JAVA security architektúra Bytecode security JAVA cryptography Applikáció authentikáció Appletek J2ME Saját projektem
Tóth Gergely, május 5.(3) ELTE JAVA Speci JAVA security alapkövek nyelvi szintennyelvi szinten buffer overflow elleni védelem osztályok szintjénosztályok szintjén security architektúra beépített kriptográfiai csomagok (JCE) SDK szintenSDK szinten –applikáció authentikációs utilityk kulcskészítés biztonságos kulcstárolás applikáció aláírás aláírás ellenőrzés
Tóth Gergely, május 5.(4) ELTE JAVA Speci Buffer overflow – az elmélet leggyakoribb kihasznált biztonsági lyukbuffer overflow: magasan a leggyakoribb kihasznált biztonsági lyuk
Tóth Gergely, május 5.(5) ELTE JAVA Speci Buffer overflow – például C-ben #define BUF_SIZE 16 void ExploitableFunction(char* param) { // do something... char localBufferOnStack[BUF_SIZE]; strcpy(localBufferOnStack, param); // do something... printf("%s", localBufferOnStack); } void ExploiterFunction() { // nothing serious ExploitableFunction(" "); // what will happen? ExploitableFunction(" "); }
Tóth Gergely, május 5.(6) ELTE JAVA Speci Buffer overflow – JAVA-ban VM szinten valószinűtlenVM szinten valószinűtlen –nagyon kemény buffer-overflow elleni projekt a SUN-on belül nyelvi szinten lehetetlennyelvi szinten lehetetlen –nincs pointer művelet –tömböt nem lehet túlcímezni a tömb tudja a hosszát (length mező) elhanyagolható a valószínűségeösszességében: JAVA-ban elhanyagolható a valószínűsége
Tóth Gergely, május 5.(7) ELTE JAVA Speci JAVA security architektúra I. beépített security funkciók –standard osztályok szintjén jogosultságok (Permission) jogosultság hozzárendelések (Policy) jogosultsági csoportok (ProtectionDomain) –kezelése egyszerű integrált a legtöbbe esetben mind a felhasználó, mint a programozó számára transzparens
Tóth Gergely, május 5.(8) ELTE JAVA Speci JAVA security architektúra II. Permissionjava.security.Permission –jogosultságok leírására –FilePermission FilePermission(„/tmp/*”, „read”) –SocketPermission SocketPermission(„localhost:1024-”, „listen”) –RuntimePermission –AWTPermission –...
Tóth Gergely, május 5.(9) ELTE JAVA Speci JAVA security architektúra III. ProtectionDomainjava.security.ProtectionDomain osztályok halmazához rendel jogosultságokat minden osztály pontosan egy domainhez tartozik minden új objektum példány az osztálya domainjének jogosultságait kapja
Tóth Gergely, május 5.(10) ELTE JAVA Speci JAVA security architektúra IV. Policyjava.security.Policy leképezés: a futó kód bizonyos jellemzőihez ( CodeSource ) jogosultságok halmazát rendeli –jelenleg a futó kódot jellemzi:.CLASS fájljának URL-je ÉS a hozzá tartozó certificate-ek bár több Policy objektum is létezhet, egyszerre csak egy lehet aktív
Tóth Gergely, május 5.(11) ELTE JAVA Speci JAVA security architektúra V. Policy beállításaPolicy beállítása –van rá JDK tool ( policytool ) –policy fájl grant { permission java.lang.RuntimePermission "stopThread"; permission java.net.SocketPermission "localhost:1024-", "listen"; permission java.util.PropertyPermission "java.version", "read";... };
Tóth Gergely, május 5.(12) ELTE JAVA Speci JAVA security architektúra VI. amellett, hogy melyik osztály objektuma hajtja végre az utasítást, azt is figyelembe kell venni, hogy melyik szálon ki hívta meg őt privilege gain –user domainbeli objektum ki akar írni valamit, meghívja a system domainbeli objektum metódusát (privilege gain) privilege loss –a system domain frissíti a képernyőt és meghívja egy user domainbeli objektum paint metódusát (privilege loss)
Tóth Gergely, május 5.(13) ELTE JAVA Speci JAVA security architektúra VII. jogosultságok metszeteaz aktuális szál jogosultsága: az általa bejárt összes domain által biztosított jogosultságok metszete java.security.AccessController –annak eldöntésére, hogy van-e jogunk valamire AccessController.checkPermission( Permission permission) –privilegizált művelet végrehajtására (a hívó domainjének összes jogosultságával) AccessController.doPrivileged( PrivilegedAction action)
Tóth Gergely, május 5.(14) ELTE JAVA Speci JAVA security architektúra – példa cursor = (Cursor) java.security.AccessController.doPrivileged( new java.security.PrivilegedExceptionAction() { public Object run() throws Exception { Toolkit toolkit = Toolkit.getDefaultToolkit(); Image image = toolkit.getImage( systemCustomCursorDirPrefix + fileName); return toolkit.createCustomCursor( image, new Point(fx,fy), flocalized); } ); java.awt.Cursor –getSystemCustomCursor the system specific custom Cursor named
Tóth Gergely, május 5.(15) ELTE JAVA Speci Bytecode security I. futtatása közben dinamikusan tölti bea JAVA virtuális gép az alkalmazás futtatása közben dinamikusan tölti be az osztályokat (bytecode-ot) –fájlból –hálózaton keresztül –elképzelhető run-time generált bytecode betöltése is a betöltés során ellenőrizni kellezeket a bytecode-okat a betöltés során ellenőrizni kell
Tóth Gergely, május 5.(16) ELTE JAVA Speci Bytecode security II.
Tóth Gergely, május 5.(17) ELTE JAVA Speci Bytecode security III. Ellenőrzésre kerülnek: szintakszisa –a bytecode szintakszisa legális-e; paraméter stack over/underflow –nincs-e paraméter stack over/underflow; minden paramétere megfelelő típusú-e –minden bytecode parancs minden paramétere megfelelő típusú-e; hozzáférések jogosultságai –konstruktor, metódus és mező hozzáférések jogosultságai megfelelőek-e ( private, public, protected ); –objektumokat annak használ-e amik –objektumokat annak használ-e amik ( InputStream -et nem OutputStream -nek).
Tóth Gergely, május 5.(18) ELTE JAVA Speci JAVA cryptography javax.crypto és java.security csomagok –interface-ek kriptográfiai algoritmusoknak továbbfejlesztési és kiegészítési lehetőség –beépített kriptográfiai algoritmus implementációk szabványoknak megfelel (RFC, IETF, PKCS) garantáltan biztonságos maximális teljesítmény
Tóth Gergely, május 5.(19) ELTE JAVA Speci Titkosítás titkosító algoritmusok –szimmetrikus kulcsú –szimmetrikus kulcsú algoritmusok blokk-kódolók (pl. DES, 3DES, Blowfish, AES) folyam-kódolók (pl. RC4) működési módok (ECB, CBC, OFB, CFB) –aszimmetrikus kulcsú –aszimmetrikus kulcsú algoritmusok (pl. RSA, ECC) nyilvános kulcs titkos kulcs
Tóth Gergely, május 5.(20) ELTE JAVA Speci Titkosítás II. szimmetrikus kulcsúszimmetrikus kulcsú –kódolásnál és dekódolásnál ugyanaz a kulcs nem letagadhatatlan aszimmetrikus kulcsúaszimmetrikus kulcsú –A a B-nek küldött üzenetet B nyilvános kulcsával kódolja –kézbesítéskor B titkos kulcsával dekódolja –mivel csak B ismeri titkos kulcsát, csak ő tudja a nyilvános kulcsával kódolt üzenetet dekódolni ha küldéskor B nyilvános, A titkos kulcsával kódolunk, akkor letagadhatatlan is
Tóth Gergely, május 5.(21) ELTE JAVA Speci Kriptográfiai példa I. – titkosítás import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; public class BlowfishKey { public static void main(String[] args) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("Blowfish"); SecretKey skey = kgen.generateKey(); byte[] raw = skey.getEncoded(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "Blowfish"); Cipher cipher = Cipher.getInstance("Blowfish"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); System.out.println(new String( cipher.doFinal("This is just an example".getBytes())); }
Tóth Gergely, május 5.(22) ELTE JAVA Speci Kriptográfiai hash generálás hashelés (pl. SHA1 vagy MD5) –tetszőleges sztringhez konstans hosszú egyértelmű hash sztringet rendel sztringből hashet generálni egyszerű adott hashből eredeti sztringet visszaállítani elméletileg lehetetlen adott hashhez olyan sztringet generálni, aminek az adott hash a hash sztringje, gyakorlatilag lehetetlen –önmagában ritkán használják
Tóth Gergely, május 5.(23) ELTE JAVA Speci Kriptográfiai példa II. – hash generálás SHA-1 hash érték kiszámolása: futtatás: > java sha1 abc A9993E ABA3E C26C9CD0D89D MessageDigest sha = MessageDigest. getInstance("SHA-1"); sha.update(toHash); byte[] hash=sha.digest(); System.out.println(toHex(hash));
Tóth Gergely, május 5.(24) ELTE JAVA Speci MAC generálás MAC (Message Authentication Code) rejtjel kulccsal elvégzett hash művelet –„rejtjel kulccsal elvégzett hash művelet” –csak a rejtjelkulccsal rendelkező entitások képesek a MAC generálására –integritásvédelemre –pl. HMAC HMAC-SHA1 HMAC-MD5
Tóth Gergely, május 5.(25) ELTE JAVA Speci Kriptográfiai példa III. – MAC import java.security.*; import javax.crypto.*; public class initMac { public static void main(String[] args) throws Exception { // Generate secret key for HMAC-MD5 KeyGenerator kg = KeyGenerator.getInstance("HmacMD5"); SecretKey sk = kg.generateKey(); // Get instance of Mac object and // initialize it with the above secret key Mac mac = Mac.getInstance("HmacMD5"); mac.init(sk); System.out.println(new String(mac.doFinal( "Hi There".getBytes())); }
Tóth Gergely, május 5.(26) ELTE JAVA Speci Digitális aláírás I. titkos kulcs birtokosa írta alácélja annak biztosítása, az aláírt dokumentumot a titkos kulcs birtokosa írta alá –direkt aláíró algoritmus (pl. DSA) –hash érték titkos kulccsal történő aszimmetrikus titkosítása (pl. SHA1withRSA)
Tóth Gergely, május 5.(27) ELTE JAVA Speci Digitális aláírás II. – generálás
Tóth Gergely, május 5.(28) ELTE JAVA Speci Digitális aláírás III. – ellenőrzés
Tóth Gergely, május 5.(29) ELTE JAVA Speci Kriptográfiai példa IV. – digitális aláírás byte[] toSign="Text to sign...".getBytes(); SecureRandom ran = new SecureRandom(); KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(1024, ran); KeyPair pair = keyGen.generateKeyPair(); // sign Signature sig = Signature.getInstance("SHA1withRSA"); sig.initSign(pair.getPrivate()); sig.update(toSign); byte[] signature=sig.sign(); // verify Signature ver = Signature.getInstance("SHA1withRSA"); ver.initVerify(pair.getPublic()); ver.update(toSign); System.out.println("Verification: "+ver.verify(signature));
Tóth Gergely, május 5.(30) ELTE JAVA Speci Egyéb kriptográfiai osztályok biztonságos véletlen szám generálásbiztonságos véletlen szám generálás –kulcsgenerálás biztonságosságának növelésére kulcsgeneráláskulcsgenerálás kulcstároláskulcstárolás (keystore) –jelszóval védett, titkosított fájl certificate kezeléscertificate kezelés (X.509) –nyilvános kulcs tárolására
Tóth Gergely, május 5.(31) ELTE JAVA Speci Applikáció authentikáció I. aszimmetrikus kulcsokaszimmetrikus kulcsok (RSA) –generálása ( keytool ) –biztonságos tárolása (keystore-ban) szoftverfejlesztőnélszoftverfejlesztőnél:.JAR fájl aláírása ( jarsigner ) –aszimmetrikus kulcsú digitális aláírás (pl. SHA1withRSA) szoftver felhasználónálszoftver felhasználónál:.JAR fájl aláírásának ellenőrzése ( jarsigner )
Tóth Gergely, május 5.(32) ELTE JAVA Speci Applikáció authentikáció II. a program gyártója aláírja a futtatható kódota program gyártója aláírja a futtatható kódot –igazolja, hogy ő írta a programot –de tulajdonképpen mit is csinál a program? ez már csak így fog maradni :( a tendencia –nem a program jogosultságait állítják be –hanem megbízol a gyártójában :(
Tóth Gergely, május 5.(33) ELTE JAVA Speci Keystore KulcsfájlKulcsfájl –egy keystore-ban több kulcspár is tárolható (azonosításuk aliasszal) –titkos kulcsok tárolására fájlszinten kódolt jelszóval védett (fájlszinten és aliasokként is) –nyilvános kulcsok tárolására certificate-ek formájában
Tóth Gergely, május 5.(34) ELTE JAVA Speci JAR aláírás ( jarsigner ) I. normálisnormális.JAR fájl –.CLASS fájlok –manifest aláírtaláírt.JAR fájl –.CLASS fájlok –módosított manifest –ALIAS.SF (pl. TG.SF ) –ALIAS.DSA (pl. TG.DSA )
Tóth Gergely, május 5.(35) ELTE JAVA Speci JAR aláírás ( jarsigner ) II. ALIAS.SFALIAS.SF –minden aláírt fájlra hash (pl. SHA-1) BASE-64-ben kódolva Name: com/monica/javacom/streams/MJCWriteableIsAIS.class SHA1-Digest: lcNRm/q+QZnxygf9Ubf3PJWgND8= ALIAS.DSAALIAS.DSA –aláírók nyilvános kulcsa (certificate-ek) –aláírások
Tóth Gergely, május 5.(36) ELTE JAVA Speci Applikáció authentikáció – példa I. kulcsgeneráláskulcsgenerálás >keytool -genkey -alias tgm -keystore keystore.jks Enter keystore password: password What is your first and last name? [Unknown]: Gergely Toth What is the name of your organizational unit? [Unknown]: MIS What is the name of your organization? [Unknown]: BUTE What is the name of your City or Locality? [Unknown]: Budapest What is the name of your State or Province? [Unknown]: Budapest What is the two-letter country code for this unit? [Unknown]: HU Is CN=Gergely Toth, OU=MIS, O=BUTE, L=Budapest, ST=Budapest, C=HU correct? [no]: yes
Tóth Gergely, május 5.(37) ELTE JAVA Speci Applikáció authentikáció – példa II. applikáció készítésapplikáció készítés applikáció aláírásapplikáció aláírás >jarsigner -keystore keystore.jks sha1.jar tgm Enter Passphrase for keystore: password Enter key password for tgm: tgmpassword >jar cvf sha1.jar sha1.class
Tóth Gergely, május 5.(38) ELTE JAVA Speci Applikáció authentikáció – példa III. applikáció ellenőrzés – OKapplikáció ellenőrzés – OK >jarsigner -verify -verbose -certs sha1.jar 134 Thu Mar 27 18:21:00 CET 2003 META-INF/MANIFEST.MF 187 Thu Mar 27 18:21:02 CET 2003 META-INF/TGM.SF 1026 Thu Mar 27 18:21:02 CET 2003 META-INF/TGM.DSA 0 Thu Mar 27 18:20:12 CET 2003 META-INF/ sm 1009 Thu Mar 27 18:06:06 CET 2003 sha1.class X.509, CN=Gergely Toth, OU=MIS, O=BUTE, L=Budapest, ST=Budapest, C=HU s = signature was verified m = entry is listed in manifest k = at least one certificate was found in keystore i = at least one certificate was found in identity scope jar verified.
Tóth Gergely, május 5.(39) ELTE JAVA Speci Applikáció authentikáció – példa IV. applikáció ellenőrzés – HIBAapplikáció ellenőrzés – HIBA –ha módosul a tartalom anélkül, hogy az aláírásokat újragenerálnánk >jarsigner -verify -verbose -certs sha1.jar jarsigner: java.lang.SecurityException: SHA1 digest error for sha1.class
Tóth Gergely, május 5.(40) ELTE JAVA Speci Appletek I. Applet –alapvetően browserben futó JAVA program –ha az Applet nincs aláírva: nincs fájlrendszer-hozzáférésnincs fájlrendszer-hozzáférés csak ahhoz a hosthoz tud socketet nyitni, ahonnan le lett töltvecsak ahhoz a hosthoz tud socketet nyitni, ahonnan le lett töltve nincs natív hívás nem indíthat más programot nem tölthet be libraryt nehézkes
Tóth Gergely, május 5.(41) ELTE JAVA Speci Appletek II. aláírt Applet: –„trusted” ha megfelelő az aláírás ismert certificatehez tartozó titkos kulccsal írták alá az aláírás érvényes –ugyanúgy tud futni, mintha nem is Applet lenne kényelmesebb
Tóth Gergely, május 5.(42) ELTE JAVA Speci Aláírt Applet példa I. – készítés KulcskészítésKulcskészítés –keytool -genkey... Certificate exportálásCertificate exportálás –keytool -export... JAR fájl készítés és aláírásJAR fájl készítés és aláírás –jar cvf... –jarsigner...
Tóth Gergely, május 5.(43) ELTE JAVA Speci Aláírt Applet példa II. – használat Certificate importCertificate import –JAVA plug-in control panelből
Tóth Gergely, május 5.(44) ELTE JAVA Speci J2ME - JAVA 2 Micro Edition limitált kapacitású eszközökrelimitált kapacitású (memória, CPU) eszközökre –mobiltelefonok –kézi számítógépek lecsupaszított nyelvi környezetlecsupaszított nyelvi környezet –kevesebb standard osztály –bizonyos nyelvi tulajdonságok is hiányoznak (pl. nincs float)
Tóth Gergely, május 5.(45) ELTE JAVA Speci MIDP 1.0 jelenlegi állapot homokozó„homokozó” elv –nincs fájlrendszer-hozzáférés –limitált erőforrások (~100k memória, ~100k bytecode) és kevés beépített osztály –kommunikációs csatorna absztrakció ( Connection osztály) nincs applikáció authentikáció! –az aláírást figyelmen kívül hagyja
Tóth Gergely, május 5.(46) ELTE JAVA Speci MIDP 2.0 hamarosan megjelenik (~idén nyáron) security++ –permissions bizonyos funkciók letiltása/engedélyezése –protection domains Permission templates (untrusted, trusted,...) –applikáció authentikáció aláírás ellenőrzése –crypto csomagok (pl. SSL, HTTPS, WTLS) push architecturepush architecture: security?
Tóth Gergely, május 5.(47) ELTE JAVA Speci JAVA rákfenék natív hívásnatív hívás –JAVA kiegészítése: a VM-et futtató környezetre írt gépi kódú library is használható –nem platform-független –nem biztosítja a JAVA által nyújtott biztonsági megoldásokat és megbízhatóságot MIDP 1.0MIDP 1.0 –nincs applikáció authentikáció
Tóth Gergely, május 5.(48) ELTE JAVA Speci Saját magamról – MONICA projekt I. JAVA alapú open-source SSH2 –
Tóth Gergely, május 5.(49) ELTE JAVA Speci Saját magamról – MONICA projekt II. JAVA alapú SCP2 (fejlesztés alatt)
Tóth Gergely, május 5.(50) ELTE JAVA Speci Kriptográfiai műveletek az SSH2-ben digitális aláíráscertificatedigitális aláírás és certificate kezelés a kulcscseréhez szimmetrikus kulcsú titkosításszimmetrikus kulcsú titkosítás a csatorna bizalmasságának védelmére MACMAC a csatorna integritásának biztosításához
Tóth Gergely, május 5.(51) ELTE JAVA Speci SSH2 csomag képzése
Tóth Gergely, május 5.(52) ELTE JAVA Speci SSH2 csomag képzése – MONICA payload=compressionAlg.compress(payload); len_without_mac=16; padding_len=len_without_mac-5-payload.length(); if (padding_len<4) padding_len=4; len_without_mac=padding_len+payload.length()+5; while ((len_without_mac%minLen)!=0) len_without_mac++; padding_len=len_without_mac-5-payload.length(); result=io.wUint32(len_without_mac-4); result=result.concat(io.wByte(padding_len)); result=result.concat(payload); padding=new char[padding_len]; for (int i=0; i<padding_len; i++) padding[i]=(char)(Math.random()*255.0); result=result.concat(new String(padding)); mac=macAlg.createMAC(io.wUint32(seqNo)).concat(result),IK); result=cipherAlg.encode(result); result=result.concat(mac);
Tóth Gergely, május 5.(53) ELTE JAVA Speci Kérdések ?