Upload
vinny
View
39
Download
0
Embed Size (px)
DESCRIPTION
JAVA Security. Tóth Gergely [email protected] 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 - PowerPoint PPT Presentation
Citation preview
Tóth Gergely, 2003. május 5.ELTE JAVA Speci
JAVA Security
Tóth [email protected]
Budapesti Műszaki és Gazdaságtudományi Egyetem
Méréstechnika és Információs Rendszerek Tanszék
Tóth Gergely, 2003. 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, 2003. 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, 2003. május 5. (4)ELTE JAVA Speci
Buffer overflow – az elmélet
• buffer overflow: magasan a leggyakoribb kihasznált biztonsági lyukleggyakoribb kihasznált biztonsági lyuk
elõzõ függvényekstack területe
visszatérésicím (4 byte)
buffer (lokálisváltozó, 4 byte)
stack pointer
Elmélet
elõzõ függvényekstack területe
visszatérésicím(0xFFFFF0E2)
buffer("foo")
stack pointer(0x00404FB6)
Normálisfutás
0xFF0xFF0xF00xE2
\0oof
BufferOverflow
elõzõ függvényekstack területe
visszatérési cím(0x00404F6B, a stackterületre mutat)
buffer (@@@@00404F6B)
felülírt visszatérési cím
bejuttatott rosszindulatú kód
0x000x400x4F0x6B
@@@@
Tóth Gergely, 2003. 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 seriousExploitableFunction("1234567890");
// what will happen?ExploitableFunction("123456789012345678901234567890");
}
Tóth Gergely, 2003. 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ő)
• összességében: JAVA-ban elhanyagolható a valószínűségeelhanyagolható a valószínűsége
Tóth Gergely, 2003. május 5. (7)ELTE JAVA Speci
JAVA security architektúra I.
• beépített security funkciók– standard osztályok szintjénstandard osztályok szintjén
• jogosultságok (Permission)• jogosultság hozzárendelések (Policy)• jogosultsági csoportok (ProtectionDomain)
– kezelésekezelé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. (8)ELTE JAVA Speci
JAVA security architektúra II.
• java.security.PermissionPermission– jogosultságok leírására – FilePermission
•FilePermission(„/tmp/*”, „read”)
– SocketPermission•SocketPermission(„localhost:1024-”, „listen”)
– RuntimePermission– AWTPermission– ...
Tóth Gergely, 2003. május 5. (9)ELTE JAVA Speci
JAVA security architektúra III.
• java.security.ProtectionDomainProtectionDomain• 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. (10)ELTE JAVA Speci
JAVA security architektúra IV.
• java.security.PolicyPolicy• 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. (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, 2003. 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– user domainbeli objektum ki akar írni
valamit, meghívja a system domainbeli objektum metódusát (privilege gainprivilege gain)
– a system domain frissíti a képernyőt és meghívja egy user domainbeli objektum paint metódusát (privilege lossprivilege loss)
Tóth Gergely, 2003. május 5. (13)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 metszetejogosultsá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. (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(Image image = toolkit.getImage(
systemCustomCursorDirPrefix + fileName);systemCustomCursorDirPrefix + fileName);return toolkit.createCustomCursor(
image, new Point(fx,fy), flocalized);}
});
• java.awt.Cursor– getSystemCustomCursor: @return the
system specific custom Cursor named
Tóth Gergely, 2003. május 5. (15)ELTE JAVA Speci
Bytecode security I.
• a JAVA virtuális gép az alkalmazás futtatása közben dinamikusan tölti befuttatá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 a betöltés során ellenőrizni kellellenőrizni kell
Tóth Gergely, 2003. május 5. (16)ELTE JAVA Speci
Bytecode security II.
Tóth Gergely, 2003. május 5. (17)ELTE JAVA Speci
Bytecode security III.
• Ellenőrzésre kerülnek:– a bytecode szintakszisaszintakszisa legális-e;– nincs-e paraméter stack over/underflowparaméter stack over/underflow;– minden bytecode parancs minden paramétere minden paramétere
megfelelő típusú-emegfelelő típusú-e;– konstruktor, metódus és mező hozzáférések hozzáférések
jogosultságaijogosultságai megfelelőek-e (private, public, protected);
– objektumokat annak használ-e amikobjektumokat annak használ-e amik (InputStream-et nem OutputStream-nek).
Tóth Gergely, 2003. május 5. (18)ELTE JAVA Speci
JAVA cryptography
• javax.crypto és java.security csomagok– interface-ek kriptográfiai algoritmusoknakinterface-ek kriptográfiai algoritmusoknak
• továbbfejlesztési és kiegészítési lehetőség
– beépített kriptográfiai algoritmus beépített kriptográfiai algoritmus implementációkimplementációk• szabványoknak megfelel (RFC, IETF, PKCS)• garantáltan biztonságos• maximális teljesítmény
Tóth Gergely, 2003. 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, 2003. 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, 2003. 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, 2003. május 5. (22)ELTE JAVA Speci
Kriptográfiai hash generálás
• hashelés (pl. SHA1 vagy MD5)– tetszőleges sztringhez konstans hosszú tetszőleges sztringhez konstans hosszú
egyértelmű hash sztringet rendelegyé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. (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
A9993E364706816ABA3E25717850C26C9CD0D89D
MessageDigest sha = MessageDigest.
getInstance("SHA-1");
sha.update(toHash);
byte[] hash=sha.digest();
System.out.println(toHex(hash));
Tóth Gergely, 2003. május 5. (24)ELTE JAVA Speci
MAC generálás
• MAC (Message Authentication Code)– „rejtjel kulccsal elvégzett hash műveletrejtjel 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. (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, 2003. május 5. (26)ELTE JAVA Speci
Digitális aláírás I.
• célja annak biztosítása, az aláírt dokumentumot a titkos kulcs birtokosa titkos kulcs birtokosa írta aláí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. (27)ELTE JAVA Speci
Digitális aláírás II. – generálás
Tóth Gergely, 2003. május 5. (28)ELTE JAVA Speci
Digitális aláírás III. – ellenőrzés
Tóth Gergely, 2003. 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// signSignature sig = Signature.getInstance("SHA1withRSA"); sig.initSign(pair.getPrivate());sig.update(toSign);byte[] signature=sig.sign(); // verify// verifySignature 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. (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, 2003. 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, 2003. május 5. (32)ELTE JAVA Speci
Applikáció authentikáció II.
• a program gyártója aláírja a futtatható a program gyártója aláírja a futtatható kódotkó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. (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, 2003. 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, 2003. május 5. (35)ELTE JAVA Speci
JAR aláírás (jarsigner) II.
• ALIASALIAS.SF.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=
• ALIASALIAS.DSA.DSA– aláírók nyilvános kulcsa (certificate-ek)– aláírások
Tóth Gergely, 2003. 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.jksEnter keystore password: passwordWhat is your first and last name? [Unknown]: Gergely TothWhat is the name of your organizational unit? [Unknown]: MISWhat is the name of your organization? [Unknown]: BUTEWhat is the name of your City or Locality? [Unknown]: BudapestWhat is the name of your State or Province? [Unknown]: BudapestWhat is the two-letter country code for this unit? [Unknown]: HUIs CN=Gergely Toth, OU=MIS, O=BUTE, L=Budapest, ST=Budapest, C=HU correct? [no]: yes
Tóth Gergely, 2003. 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 tgmEnter Passphrase for keystore: passwordEnter key password for tgm: tgmpassword
>jar cvf sha1.jar sha1.class
Tóth Gergely, 2003. 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, 2003. 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.jarjarsigner: java.lang.SecurityException: SHA1 digest error for sha1.class
Tóth Gergely, 2003. 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, csak ahhoz a hosthoz tud socketet nyitni,
ahonnan le lett töltveahonnan 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. (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, 2003. 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, 2003. 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, 2003. május 5. (44)ELTE JAVA Speci
J2ME - JAVA 2 Micro Edition
• limitált kapacitásúlimitált kapacitású (memória, CPU) eszközökreeszkö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, 2003. 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, 2003. 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, 2003. 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, 2003. május 5. (48)ELTE JAVA Speci
Saját magamról – MONICA projekt I.
• JAVA alapú open-source SSH2– http://monica.sourceforge.nethttp://monica.sourceforge.net
Tóth Gergely, 2003. május 5. (49)ELTE JAVA Speci
Saját magamról – MONICA projekt II.
• JAVA alapú SCP2 (fejlesztés alatt)
Tóth Gergely, 2003. május 5. (50)ELTE JAVA Speci
Kriptográfiai műveletek az SSH2-ben
• digitális aláírásdigitális aláírás és certificatecertificate 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, 2003. május 5. (51)ELTE JAVA Speci
SSH2 csomag képzése
Tóth Gergely, 2003. május 5. (52)ELTE JAVA Speci
SSH2 csomag képzése – MONICApayload=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, 2003. május 5. (53)ELTE JAVA Speci
Kérdések
??