530 likes | 699 Views
JAVA Security. Tóth Gergely tgm@mit.bme.hu Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék. Tartalom. JAVA security alapkövek Buffer overflow JAVA security architektúra Bytecode security JAVA cryptography Applikáció authentikáció Appletek
E N D
JAVA Security Tóth Gergely tgm@mit.bme.hu Budapesti Műszaki és Gazdaságtudományi Egyetem Méréstechnika és Információs Rendszerek Tanszék
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, 2003. május 5. (2) ELTE JAVA Speci
JAVA security alapkövek • nyelvi szinten • buffer overflow elleni védelem • osztályok szintjén • security architektúra • beépített kriptográfiai csomagok (JCE) • SDK 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, 2003. május 5. (3) ELTE JAVA Speci
Buffer overflow – az elmélet • buffer overflow: magasan a leggyakoribb kihasznált biztonsági lyuk Tóth Gergely, 2003. május 5. (4) 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("1234567890"); // what will happen? ExploitableFunction("123456789012345678901234567890"); } Tóth Gergely, 2003. május 5. (5) ELTE JAVA Speci
Buffer overflow – JAVA-ban • VM szinten valószinűtlen • nagyon kemény buffer-overflow elleni projekt a SUN-on belül • nyelvi szinten lehetetlen • nincs pointer művelet • tömböt nem lehet túlcímezni • a tömb tudja a hosszát (length mező) • összességében: JAVA-ban elhanyagolható a valószínűsége Tóth Gergely, 2003. május 5. (6) 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, 2003. május 5. (7) ELTE JAVA Speci
JAVA security architektúra II. • java.security.Permission • jogosultságok leírására • FilePermission • FilePermission(„/tmp/*”, „read”) • SocketPermission • SocketPermission(„localhost:1024-”, „listen”) • RuntimePermission • AWTPermission • ... Tóth Gergely, 2003. május 5. (8) ELTE JAVA Speci
JAVA security architektúra III. • java.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, 2003. május 5. (9) ELTE JAVA Speci
JAVA security architektúra IV. • java.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, 2003. május 5. (10) ELTE JAVA Speci
JAVA security architektúra V. • Policy 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, 2003. május 5. (11) 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 • user domainbeli objektum ki akar írni valamit, meghívja a system domainbeli objektum metódusát (privilege gain) • 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, 2003. május 5. (12) ELTE JAVA Speci
JAVA security architektúra VII. • az 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, 2003. május 5. (13) ELTE JAVA Speci
JAVA security architektúra – példa • java.awt.Cursor • getSystemCustomCursor: @return the system specific custom Cursor named 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); } } ); Tóth Gergely, 2003. május 5. (14) ELTE JAVA Speci
Bytecode security I. • a 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 • ezeket a bytecode-okat a betöltés során ellenőrizni kell Tóth Gergely, 2003. május 5. (15) ELTE JAVA Speci
Bytecode security II. Tóth Gergely, 2003. május 5. (16) ELTE JAVA Speci
Bytecode security III. • Ellenőrzésre kerülnek: • a bytecode szintakszisa legális-e; • nincs-e paraméter stack over/underflow; • minden bytecode parancs minden paramétere megfelelő típusú-e; • konstruktor, metódus és mező hozzáférések jogosultságai megfelelőek-e (private, public, protected); • objektumokat annak használ-e amik (InputStream-et nem OutputStream-nek). Tóth Gergely, 2003. május 5. (17) 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, 2003. május 5. (18) ELTE JAVA Speci
Titkosítás • titkosító algoritmusok • 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ú algoritmusok (pl. RSA, ECC) • nyilvános kulcs • titkos kulcs Tóth Gergely, 2003. május 5. (19) ELTE JAVA Speci
Titkosítás II. • szimmetrikus kulcsú • kódolásnál és dekódolásnál ugyanaz a kulcs • nem letagadhatatlan • 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, 2003. május 5. (20) 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, 2003. május 5. (21) 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, 2003. május 5. (22) ELTE JAVA Speci
Kriptográfiai példa II. – hash generálás • SHA-1 hash érték kiszámolása: • futtatás: MessageDigest sha = MessageDigest. getInstance("SHA-1"); sha.update(toHash); byte[] hash=sha.digest(); System.out.println(toHex(hash)); > java sha1 abc A9993E364706816ABA3E25717850C26C9CD0D89D Tóth Gergely, 2003. május 5. (23) ELTE JAVA Speci
MAC generálás • MAC (Message Authentication Code) • „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, 2003. május 5. (24) 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, 2003. május 5. (25) ELTE JAVA Speci
Digitális aláírás I. • 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, 2003. május 5. (26) ELTE JAVA Speci
Digitális aláírás II. – generálás Tóth Gergely, 2003. május 5. (27) ELTE JAVA Speci
Digitális aláírás III. – ellenőrzés Tóth Gergely, 2003. május 5. (28) 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, 2003. május 5. (29) ELTE JAVA Speci
Egyéb kriptográfiai osztályok • biztonságos véletlen szám generálás • kulcsgenerálás biztonságosságának növelésére • kulcsgenerálás • kulcstárolás (keystore) • jelszóval védett, titkosított fájl • certificate kezelés (X.509) • nyilvános kulcs tárolására Tóth Gergely, 2003. május 5. (30) ELTE JAVA Speci
Applikáció authentikáció I. • aszimmetrikus kulcsok (RSA) • generálása (keytool) • biztonságos tárolása (keystore-ban) • szoftverfejlesztőnél: .JAR fájl aláírása (jarsigner) • aszimmetrikus kulcsú digitális aláírás (pl. SHA1withRSA) • szoftver felhasználónál: .JAR fájl aláírásának ellenőrzése (jarsigner) Tóth Gergely, 2003. május 5. (31) ELTE JAVA Speci
Applikáció authentikáció II. • a 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, 2003. május 5. (32) ELTE JAVA Speci
Keystore • Kulcsfá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, 2003. május 5. (33) ELTE JAVA Speci
JAR aláírás (jarsigner) I. • normális.JAR fájl • .CLASS fájlok • manifest • aláírt.JAR fájl • .CLASS fájlok • módosított manifest • ALIAS.SF (pl. TG.SF) • ALIAS.DSA (pl. TG.DSA) Tóth Gergely, 2003. május 5. (34) ELTE JAVA Speci
JAR aláírás (jarsigner) II. • ALIAS.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.DSA • aláírók nyilvános kulcsa (certificate-ek) • aláírások Tóth Gergely, 2003. május 5. (35) ELTE JAVA Speci
Applikáció authentikáció – példa I. • kulcsgenerá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, 2003. május 5. (36) ELTE JAVA Speci
Applikáció authentikáció – példa II. • applikáció készítés • applikáció aláírás >jar cvf sha1.jar sha1.class >jarsigner -keystore keystore.jks sha1.jar tgm Enter Passphrase for keystore: password Enter key password for tgm: tgmpassword Tóth Gergely, 2003. május 5. (37) ELTE JAVA Speci
Applikáció authentikáció – példa III. • appliká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, 2003. május 5. (38) ELTE JAVA Speci
Applikáció authentikáció – példa IV. • appliká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, 2003. május 5. (39) ELTE JAVA Speci
Appletek I. • Applet • alapvetően browserben futó JAVA program • ha az Applet nincs aláírva: • nincs fájlrendszer-hozzáférés • csak 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, 2003. május 5. (40) 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, 2003. május 5. (41) ELTE JAVA Speci
Aláírt Applet példa I. – készítés • Kulcskészítés • keytool -genkey ... • Certificate exportálás • keytool -export ... • JAR fájl készítés és aláírás • jar cvf ... • jarsigner ... Tóth Gergely, 2003. május 5. (42) ELTE JAVA Speci
Aláírt Applet példa II. – használat • Certificate import • JAVA plug-in control panelből Tóth Gergely, 2003. május 5. (43) ELTE JAVA Speci
J2ME - JAVA 2 Micro Edition • limitált kapacitású (memória, CPU) eszközökre • mobiltelefonok • kézi számítógépek • lecsupaszított nyelvi környezet • kevesebb standard osztály • bizonyos nyelvi tulajdonságok is hiányoznak (pl. nincs float) Tóth Gergely, 2003. május 5. (44) ELTE JAVA Speci
MIDP 1.0 • jelenlegi állapot • „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, 2003. május 5. (45) 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 architecture: security? Tóth Gergely, 2003. május 5. (46) ELTE JAVA Speci
JAVA rákfenék • natí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.0 • nincs applikáció authentikáció Tóth Gergely, 2003. május 5. (47) ELTE JAVA Speci
Saját magamról – MONICA projekt I. • JAVA alapú open-source SSH2 • http://monica.sourceforge.net Tóth Gergely, 2003. május 5. (48) ELTE JAVA Speci
Saját magamról – MONICA projekt II. • JAVA alapú SCP2 (fejlesztés alatt) Tóth Gergely, 2003. május 5. (49) ELTE JAVA Speci
Kriptográfiai műveletek az SSH2-ben • digitális aláírás és certificate kezelés a kulcscseréhez • szimmetrikus kulcsú titkosítás a csatorna bizalmasságának védelmére • MAC a csatorna integritásának biztosításához Tóth Gergely, 2003. május 5. (50) ELTE JAVA Speci