Hogyan működik az SSL? Csak rájöttem, hogy itt valójában nincs végleges válaszunk, és ez érdemes kitérni.

Szeretném látni a részleteket a következők tekintetében:

  • A protokoll magas szintű leírása.
  • Hogyan működik a kulcscsere.
  • Hogyan érvényesül a hitelesség, az integritás és a titoktartás.
  • Mi a célja a hitelesítésszolgáltatóknak, és hogyan adnak ki tanúsítványokat?
  • A fontosabb technológiák és szabványok részletei (pl. PKCS).

Megjegyzések

  • Négy évvel később, és én ‘ ve egy működő TLS-implementációt írt le a Python-ban a specifikáció-korrekciós teszt alapjaként. Az itt szereplő válaszok fantasztikus hivatkozást jelentettek a hivatalos specifikáció mellett.

Válasz

Általános

Az SSL (és annak utódja, TLS ) egy protokoll, amely közvetlenül a TCP tetején működik (bár vannak olyan datagram alapú protokollok megvalósításai is, mint az UDP). Így a magasabb rétegeken (például a HTTP-n) lévő protokollok változatlanok maradhatnak, míg az s amíg biztonságos kapcsolatot biztosít. Az SSL réteg alatt a HTTP megegyezik a HTTPS-szel.

Az SSL / TLS megfelelő használatakor a támadók a kábelen csak azt láthatják, hogy melyik IP-hez és porthoz csatlakozol, nagyjából mennyi adatot küldesz. , és milyen titkosítást és tömörítést használnak. Megszakíthatja a kapcsolatot is, de mindkét fél tudja, hogy a kapcsolatot megszakította egy harmadik fél.

Tipikus használat esetén a támadó képes lesz kitalálni, hogy melyik gazdagépnévhez csatlakozik (de az URL többi részét nem): bár maga a HTTPS nem fedi fel a hosztnevet, a böngészőjének általában először DNS-kérelmet kell benyújtania, hogy megtudja, milyen IP-címre küldje el a kérést.

Magas a protokoll szintjének leírása

A TCP kapcsolat kiépítése után az ügyfél elindítja az SSL kézfogást. Az ügyfél (amely lehet böngésző, valamint bármely más program, például a Windows Update vagy a PuTTY) számos specifikáció:

  • mely az SSL / TLS verziója fut,
  • milyen rejtjelezõket akar használni, és
  • mit tömörítési módszerek használni kívánt.

A szerver azonosítja a legmagasabb SSL / TLS verziót, amelyet mind az ügyfél, mind az ügyfél támogat, kiválaszt egy titkoslapot az ügyfél egyik opciójából (ha egyet támogat), és opcionálisan kiválaszt egy tömörítési módszert.

Ezek után az alapbeállítás elkészül, a szerver elküldi tanúsítványát. Ebben a tanúsítványban magának az ügyfélnek vagy egy félnek kell megbíznia. Például, ha az ügyfél megbízik a GeoTrustban, akkor az ügyfél megbízhat a Google.com tanúsítványában, mert a GeoTrust rejtjelesen aláírt Google tanúsítvány.

Miután ellenőrizte a tanúsítványt, és megbizonyosodott arról, hogy ez a szerver valóban az, akinek állítja magát (és nem egy férfi a közepén), kulcsot cserél. Ez lehet nyilvános kulcs, egy ” PreMasterSecret ” vagy egyszerűen semmi, a választott rejtjelkészlettől függően. A kiszolgáló és az ügyfél is kiszámíthatja a kulcsot az > szimmetrikus titkosítás miért nem PKE? . Az ügyfél azt mondja a szervernek, hogy ezentúl minden kommunikáció titkosításra kerül, és egy titkosított és hitelesített üzenetet küld a szervernek.

A szerver ellenőrzi, hogy a MAC (hitelesítésre használt) helyes-e és az üzenet helyesen visszafejthető-e. Ezután visszaküld egy üzenetet, amelyet az ügyfél ellenőriz mint jól.

A kézfogás befejeződött, és a két gép biztonságosan kommunikálhat. További információ: technet.microsoft.com/en-us/library/cc785811 és hu.wikipedia .org / wiki / Secure_Sockets_Layer .

A kapcsolat bezárásához close_notify “riasztást” használnak. Ha egy támadó a TCP-kapcsolat befejezésével (FIN csomag beadásával) próbálja megszakítani a kapcsolatot, akkor mindkét fél tudni fogja, hogy a kapcsolatot helytelenül bontották meg. A kapcsolatot ez azonban nem veszélyeztetheti, csupán megszakíthatja.

További részletek

Miért bízhat meg a Google.com-ban a GeoTrust megbízásával?

Egy webhely biztonságosan akar kommunikálni veled. A személyazonosságának igazolásához és annak biztosításához, hogy ne támadó legyen, rendelkeznie kell a szerver “s nyilvános kulcsával . Azonban alig tárolhatja az összes kulcsot az összes földi weboldalról az adatbázis hatalmas lenne, és óránként frissítéseket kellene futtatni!

Erre a megoldás a Certificate Authorities, vagy röviden a CA.Az operációs rendszer vagy a böngésző telepítésekor valószínűleg a megbízható CA-k listája is érkezett hozzá. Ez a lista tetszés szerint módosítható; eltávolíthatja azokat, akikben nem bízik, másokat hozzáadhat, vagy akár saját hitelesítésszolgáltatót is létrehozhat (bár ebben a hitelesítésszolgáltatóban egyedül te fogsz megbízni, ezért nem sokat használ a nyilvános weboldalak számára). Ebben a CA listában a CA nyilvános kulcsa is van tárolva.

Amikor a Google szervere elküldi Önnek a tanúsítványát, megemlíti azt is, hogy a GeoTrust aláírta. Ha megbízik a GeoTrustban, ellenőrizheti (a GeoTrust nyilvános kulcsának használatával), hogy a GeoTrust valóban aláírta-e a szerver tanúsítványát. A tanúsítvány önálló aláírásához szüksége van a privát kulcsra, amelyet csak a GeoTrust ismer. Így a támadó nem tudja aláírni a tanúsítványt, és helytelenül állíthatja magát a Google.com-nak. Amikor a tanúsítványt akár egy bit is módosította, a jel hibás lesz, és az ügyfél elutasítja.

Tehát, ha tudom a nyilvános kulcsot, a szerver képes igazolja személyazonosságát?

Igen. Általában a nyilvános kulcs titkosítja, a titkos kulcs pedig visszafejt. Titkosítson egy üzenetet a szerver nyilvános kulcsával, küldje el, és ha a szerver meg tudja ismételni az eredeti üzenetet, az csak bebizonyította, hogy a privát kulcsot a kulcs felfedése nélkül kapta meg.

Ez az oka annak, hogy annyira fontos, hogy megbízhassunk a nyilvános kulcsban: bárki létrehozhat magán / nyilvános kulcs párokat, támadó is. Nem akarja, hogy a támadó nyilvános kulcsát használja!

Ha Az egyik hitelesítésszolgáltató, amelyben megbízik, sérül, a támadó az ellopott titkos kulcs segítségével aláírhatja tanúsítványát minden tetsző webhelyhez. Amikor a támadó hamisított tanúsítványt küldhet az ügyfelének, amelyet ő maga ír alá a megbízható hitelesítésszolgáltató magánkulcsával, az ügyfele nem tudja, hogy a nyilvános kulcs hamisított, ellopott titkos kulccsal aláírva.

De egy hitelesítésszolgáltató meg tudja bízni, hogy bármelyik kiszolgálóban bízzak!

Igen, és itt jön a bizalom Meg kell bízni a CA-ban, hogy ne készítsen tanúsítványokat, ahogy tetszik. Amikor azonban az olyan szervezetek, mint a Microsoft, az Apple és a Mozilla megbíznak egy CA-ban, a CA-nak ellenőriznie kell; egy másik szervezet rendszeresen ellenőrzi őket, hogy megbizonyosodjon arról, hogy minden továbbra is megfelelően működik-e. a szabályoknak.

A tanúsítvány kiadása akkor és csak akkor történik meg, ha a regisztráló be tudja bizonyítani, hogy birtokában van annak a domainnek, amelyre a tanúsítványt kiállították.

Mi ez a MAC az üzenet hitelesítéséhez?

Minden üzenetet úgynevezett üzenet hitelesítési kóddal írnak alá , vagy Röviden MAC. Ha megegyezünk egy kulcsban és egy hash-rejtjelben, akkor ellenőrizheti, hogy az üzenetem tőlem származik-e, és hogy az üzenet tőletek származik-e.

Például a helyes ló akkumulátor kapcsok ” és az ” példa ” üzenet, Kiszámolhatom a MAC ” 58393 “. Amikor ezt az üzenetet elküldöm Önnek a MAC-mal (Ön már ismeri a kulcsot), akkor ugyanazt a számítást végezheti el, és egyeztetheti a kiszámított MAC-ot az általam elküldött MAC-szal.

A támadó módosíthatja az üzenetet de nem ismeri a kulcsot. Nem tudja kiszámítani a megfelelő MAC-ot, és tudni fogja, hogy az üzenet nem hiteles.

Ha a MAC kiszámításakor sorszámot ad meg, kiküszöbölheti a visszajátszást támadások . Az SSL ezt csinálja.

Azt mondta, hogy az ügyfél küld egy kulcsot, amelyet a beállításhoz használnak szimmetrikus titkosítás. Mi akadályozza a támadókat abban, hogy használják?

A szerver nyilvános kulcsa igen. Mivel meggyőződtünk arról, hogy a nyilvános kulcs valóban a szerveré, és senki másé, titkosítani tudja a kulcsot a nyilvános kulccsal. Amikor a szerver megkapja, akkor titkosíthatja a privát kulccsal. Amikor bárki más megkapja, nem tudja visszafejteni.

Ezért is fontos a kulcs mérete: Minél nagyobb a nyilvános és a magánkulcs, annál nehezebb feltörni azt a kulcsot, amelyet az ügyfél a szervernek küld.

Az SSL feltörése

Összefoglalva :

  • Próbálja meg, ha a felhasználó figyelmen kívül hagyja a tanúsítványra vonatkozó figyelmeztetéseket;
  • Az alkalmazás adatokat tölthet le innen: titkosítatlan csatorna (pl. HTTP), amelyet meg lehet hamisítani;
  • A HTTPS-hez beküldött védtelen bejelentkezési oldal módosítható úgy, hogy a HTTP-nek is beküldje magát;
  • a nem javított alkalmazások sebezhető az olyan kizsákmányolások miatt, mint a BEAST és a CRIME;
  • más módszerekhez folyamodik h mint fizikai támadás;
  • Használja ki az mellékcsatornákat , mint az üzenet hossza és az idő az üzenet kialakításához;
  • várja meg a kvantum támadásokat .

Lásd még: Ivan Ristic SSL elleni sok támadási vektort tartalmazó sémája (png)

Részletesen:

Nincs egyszerű és egyértelmű út; Az SSL biztonságos, ha helyesen végzett. A támadó megpróbálhatja, ha a felhasználó figyelmen kívül hagyja a tanúsítványra vonatkozó figyelmeztetéseket , ami azonnal megsértené a biztonságot. Amikor a felhasználó ezt megteszi, a támadónak nincs szüksége egy hitelesítésszolgáltatótól származó magánkulcsra a tanúsítvány hamisításához, csupán saját tanúsítványt kell küldenie.

Egy másik módszer a alkalmazás (kiszolgáló- vagy kliens-oldal). Könnyű példa erre a weboldalak: ha a webhely által használt erőforrások (például kép vagy szkript) egyikét HTTP-n keresztül töltik be, akkor a titoktartás már nem garantálható. ne küldje el a HTTP Referer fejlécet, ha nem biztonságos erőforrásokat igényel egy biztonságos oldalról ( forrás ), akkor is lehetséges, hogy valaki lehallgatja a forgalmat, és kitalálja, hol van innen látogat el; Például, ha tudják, hogy az X, Y és Z képeket egy oldalon használják, akkor sejthetik, hogy az adott oldalt látogatja, amikor látja, hogy a böngésző egyszerre kéri ezt a három képet. Ezenkívül a Javascript betöltésekor az egész oldal sérülhet. A támadó bármilyen szkriptet végrehajthat az oldalon, módosítva például azt, hogy kinek fog menni a banki tranzakció.

Amikor ez megtörténik (az erőforrás HTTP-n keresztül töltődik be), a böngésző vegyes tartalmú figyelmeztetést ad: Chrome , Firefox , Internet Explorer 9

A HTTP másik trükkje az, ha a bejelentkezési oldal nincs biztonságban, és beküldik egy https oldalnak. ” Remek, ” valószínűleg a fejlesztő gondolta, ” most elmentem a szerver terhelését és a a jelszót továbbra is titkosítva küldjük! ” A probléma sslstrip , egy eszköz, amely a nem biztonságos bejelentkezési oldalt úgy módosítja, hogy az beküld valahova, hogy a támadó el tudja olvasni.

Az elmúlt években különféle támadások is történtek, például a TLS újratárgyalási sebezhetőség , sslsniff , BEAST , és nemrégiben, BŰNÖZÉS . Valamennyi gyakori böngésző védett mindezen támadások ellen, így ezek a biztonsági rések nem jelentenek kockázatot, ha naprakész böngészőt futtat.

Végül, de nem utolsósorban más módszereket is igénybe vehet a beszerzéshez. az SSL által megtagadott információkat. Ha már látja és megváltoztatja a felhasználó kapcsolatát, akkor nem biztos, hogy olyan nehéz helyettesíteni az egyik .exe letöltését egy billentyűzárral, vagy egyszerűen csak fizikailag megtámadni az illetőt. A titkosítás meglehetősen biztonságos, de az emberek és az emberi tévedés még mindig gyenge tényező. a Verizon közleménye szerint az adatsértések 10% -a fizikai támadással járt (lásd a 3. oldalt), tehát ” s minden bizonnyal szem előtt tartandó dolog.

Megjegyzések

  • Érdekelne egy kis további magyarázat a ” kulcsot cserélnek ” a szimmetrikus kulcsra. Hogyan történhet ez meg úgy, hogy valaki, akinek csomagszippantója van, nem tud hozzáférni.
  • @Yehosef Jó kérdés! Ezt elfelejtettem elmagyarázni a válaszomban. Körülnézve kiderül, hogy tulajdonképpen van erre vonatkozó kérdés: security.stackexchange.com/q/6290/10863
  • @ Iwazaru Az összes CA ezt teszi az első nap óta. A tanúsítvány lényege, hogy megadja az adott domain nyilvános kulcsát, és annak aláírásával igazolja, hogy valóban a megfelelő kulcs a tartományhoz. Hagyja, hogy a ‘ s Encrypt pontosan azt tegye, amire kellene: igazolja, hogy Ön a domain tulajdonosa, és ha bizonyítani tudja, írja alá a tanúsítványt (kulccsal). Most mindenki, aki bízik a Let ‘ s Encrypt programban, amely gyakorlatilag minden böngésző, megbízik ebben a tanúsítványban.
  • Er, nem. A TLS valóban csak a TCP tetején van megvalósítva.
  • Nagyon egyértelműnek találta ezt a grafikus SSL kézfogási folyamatot.

Válasz

Mivel az SSL általános fogalmát már más kérdések is lefedték (pl. ez és az egyik ), ezúttal a részletekért folytatom. A részletek fontosak. Ez a válasz kissé bonyolult lesz.

Előzmények

Az SSL nagy múltú és több verziójú protokoll.Az első prototípusok a Netscape-től származnak, amikor fejlesztették zászlóshajó böngészőjük, a Netscape Navigator első verzióit (ez a böngésző megölte Mozaik a Böngészőháborúk korai szakaszában, amelyek még mindig tombolnak, bár új versenytársakkal). Az 1. verziót soha nem hozták nyilvánosságra, ezért nem tudjuk, hogy nézett ki. Az SSL 2. verzióját egy vázlat írja le, amely ott olvasható; számos gyengesége van, némelyik meglehetősen súlyos, ezért elavult és az újabb SSL / TLS implementációk nem támogatják (míg a régebbi alapértelmezés szerint deaktiváltak). Az SSL 2-es verzióról nem beszélek tovább, csak alkalmi hivatkozásként.

Az SSL 3-as verzió (amelyet “SSLv3-nak fogok nevezni) egy továbbfejlesztett protokoll volt, amely ma is működik és széles körben támogatott. Noha a Netscape Communications továbbra is a tulajdona (vagy bárki, akinek manapság ez a tulajdonosa), a protokollt “történelmi RFC-ként” ( RFC 6101 ) tették közzé. Időközben a protokollt szabványosították, a jogi problémák elkerülése érdekében új névvel ; az új név TLS .

A TLS-nek eddig három verziója készült, mindegyik a dedikált RFC: TLS 1.0 , TLS 1.1 és TLS 1.2 . Belsőleg nagyon hasonlítanak egymásra és az SSLv3-ra, olyan mértékben, hogy egy megvalósítás könnyen támogathatja az SSLv3-at és mindhárom TLS-verziót, a kód legalább 95% -a közös. Mégis, belsőleg, az összes verziót egy major.minor formátumú verziószám jelöli; Az SSLv3 ekkor 3.0, míg a TLS verziók 3.1, 3.2 és 3.3. Így nem csoda, hogy a TLS 1.0-t néha SSL 3.1-nek hívják (és ez sem hibás). Az SSL 3.0 és a TLS 1.0 csak néhány részletben különbözik egymástól. A TLS 1.1 és 1.2 még nem támogatott széles körben, bár erre van lendület a lehetséges gyengeségek miatt (lásd alább, a “BEAST támadás”). Az SSLv3 és a TLS 1.0 “mindenhol” támogatott (még az IE 6.0 is ismeri őket).

Context

Az SSL célja egy biztonságos kétirányú alagút biztosítása tetszőleges adatok számára. Tekintsük a TCP -et, az interneten keresztüli adatküldés jól ismert protokollját. A TCP az IP “csomagokon” keresztül működik, és kétirányú alagutat biztosít a bájtok számára; minden bájtértéknél működik, és két adatfolyamba küldi őket, amelyek egyszerre működhetnek. A TCP elvégzi azt a nehéz munkát, hogy az adatokat csomagokra bontja, nyugtázza, visszaállítja a megfelelő sorrendbe, miközben eltávolítja az ismétlődéseket és visszahozza az elveszett csomagokat. A TCP-t használó alkalmazás szempontjából csak két adatfolyam van, és a csomagok láthatatlanok; Különösen a folyamok nem oszlanak “üzenetekre” (az alkalmazás feladata, hogy saját kódolási szabályokat fogadjon el, ha üzeneteket szeretne kapni, és ez pontosan az, ami HTTP nem).

A TCP megbízható “balesetek”, azaz átviteli hibák esetén, amelyek a pelyhes hardverből, a hálózati torlódásokból, az okostelefonos emberekből származnak, akik kijönnek az adott bázisállomás hatótávolságából. és más nem rosszindulatú események. Azonban egy rossz szándékú egyén (a “támadó”), akinek valamilyen hozzáférése van a szállítóeszközhöz, elolvashatja az összes továbbított adatot és / vagy szándékosan megváltoztathatja azokat, és a TCP nem véd ez ellen. SSL.

Az SSL feltételezi , hogy TCP-szerű protokollon keresztül működik, amely megbízható adatfolyamot nyújt; Az SSL nem valósítja meg az elveszett csomagok és hasonló dolgok újbóli kibocsátását. A támadó állítólag hatalmában áll, hogy elkerülhetetlen módon teljesen megzavarja a kommunikációt (például levághatja a kábeleket), így az SSL feladata:

  • észlel változásokat (a támadónak nem kell képesnek lennie az adatok némán megváltoztatására);
  • biztosítsa az adatok titkosságát (a a támadónak nem szabad ismereteket szereznie a kicserélt adatokról).

Az SSL ezeket a célokat nagy (de nem abszolút) mértékben teljesíti.

Records

Az SSL rétegzett és az alsó réteg a rekord protokoll . Az SSL alagútban küldött adatokat rekordokra osztják fel. A vezetéken (az alapul szolgáló TCP foglalaton vagy TCP-szerű adathordozón) keresztül a rekord így néz ki:

HH V1:V2 L1:L2 adatok

ahol:

  • HH egyetlen bájt, amely jelzi a rekordban szereplő adatok típusát.Négy típus van meghatározva: change_cipher_spec (20), alert (21), kézfogás (22) és application_data ( 23).
  • V1: V2 a protokoll verziója, két bájt felett. Az összes jelenleg definiált verzió esetében a V1 értéke 0x03, míg a V2 értéke 0x00 az SSLv3, 0x01 a TLS 1.0, 0x02 a TLS 1.1 esetén és 0x03 a TLS 1.2 esetén.
  • L1: L2 a data hossza bájtokban (a nagy endián konvenció használt: a hossza 256 * L1 + L2). A data teljes hossza nem haladhatja meg az 18432 bájtot, de a gyakorlatban még ezt az értéket sem érheti el.

Tehát egy rekordnak öt- bájt fejléc, amelyet legfeljebb 18 kB adat követ. A data szimmetrikus titkosítást és integritás-ellenőrzést végez. Ha rekordot bocsátanak ki, a feladónak és a vevőnek egyaránt meg kell állapodnia arról, hogy mely kriptográfiai algoritmusokat alkalmazzák jelenleg és mely kulcsokkal; ezt a megállapodást a következő részben ismertetett kézfogási protokollon keresztül érik el. A tömörítést, ha van ilyen, ezen a ponton is alkalmazzák.

Teljes részletességgel a rekord felépítése így működik:

  • Kezdetben van néhány bájt, amelyet át kell vinni ; ezek az alkalmazások adatai vagy más típusú bájtok. Ez a hasznos teher legfeljebb 16384 bájtból áll, de lehet, hogy kevesebb (a 0 hosszú hasznos terhelés törvényes, de kiderült, hogy az Internet Explorer 6.0 nem szereti ezt egyáltalán ) .
  • Ezután a hasznos teher tömörítésre kerül a jelenleg elfogadott tömörítési algoritmusokkal. A tömörítés állapotfüggő, és ezért a korábbi rekordok tartalmától függhet. A gyakorlatban a tömörítés vagy “null” (nincs tömörítés), vagy “Deflate” ( RFC 3749 ), az utóbbi jelenleg udvariasan, de határozottan mutatja a kijáratot ajtót a webes környezetben, a legutóbbi BŰNCSELEKMÉNY támadás miatt . A tömörítés célja az adatok rövidítése, de bizonyos kedvezőtlen helyzetekben szükségszerűen kissé bővítenie kell azokat (a galamblyuk elv miatt). Az SSL legfeljebb 1024 bájtos bővítést tesz lehetővé. Természetesen a null tömörítés soha nem bővül (de soha nem is rövidül); A deflate legfeljebb 10 bájttal bővül, ha a megvalósítás megfelelő.
  • A tömörített hasznos terhet ezután megvédik a módosításoktól és titkosítják. Ha a jelenlegi titkosítási és integritási algoritmusok nullák, akkor ez a lépés nem működik. Ellenkező esetben egy MAC kerül hozzá, majd néhány kitöltés (a titkosítási algoritmustól függően), és az eredmény titkosításra kerül. Ezek a lépések ismét némi kiterjesztést indukálnak, amelyet az SSL szabvány 1024 extra bájtra korlátoz (a tömörítési lépés maximális kiterjesztésével kombinálva ezzel elérkezünk az 18432 bájthoz, amelyhez hozzá kell adnunk az 5 bájtos fejlécet).

A MAC általában HMAC a szokásos hash funkciók egyikével (főleg MD5, SHA-1 vagy SHA-256). (az SSLv3 esetében ez nem az “igazi” HMAC, hanem valami nagyon hasonló, és legjobb tudomásunk szerint olyan biztonságos, mint a HMAC). A titkosítás vagy egy blokkos titkosítást használ CBC módban , vagy az RC4 adatfolyam titkosítást. Megjegyezzük, hogy elméletileg másfajta módok vagy algoritmusok is alkalmazhatók, például ezen remek üzemmódok egyike, amelyek kombinálják a titkosítást és az integritás ellenőrzését; ehhez még is van némi RFC . A gyakorlatban azonban a telepített implementációk még nem tudnak ezekről, ezért ismerik a HMAC-ot és a CBC-t. Alapvető fontosságú, hogy a MAC először kiszámításra kerül és az adatokhoz legyen csatolva, és az eredmény titkosításra kerül. Ez MAC-titkosítás, és valójában nem túl jó ötlet . A MAC kiszámítása a (tömörített) hasznos teher és egy sorszám összefűzésével történik, így egy szorgalmas támadó nem cserélhet rekordokat.

Kézfogás

A kézfogás egy olyan protokoll, amelyet a rekordprotokollon belül játszanak le. Célja a rekordokhoz használandó algoritmusok és kulcsok meghatározása. üzenetekből áll. Minden kézfogási üzenet négy bájtos fejléccel kezdődik, egy bájt írja le az üzenet típusát, majd három bájt az üzenet hosszára (big-endian konvenció). Az egymást követő kézfogási üzeneteket ezután a “kézfogás” típusú címkével ellátott rekordokkal küldjük (az egyes rekordok fejlécének első bájtja 22-es értékű).

Vegye figyelembe a rétegeket: a kézfogás üzeneteit négy- bájt fejlécet, majd rekordként küldjük el, és minden rekordnak is megvan a saját fejléce. Ezenkívül ugyanazon a rekordon belül több kézfogási üzenetet lehet elküldeni, és egy adott kézfogás üzenetet fel lehet osztani több rekordra.A kézfogás üzeneteit létrehozó modul szempontjából a “rekordok” csak egy adatfolyam, amelyre bájtok küldhetők; nem vesz tudomást az adott adatfolyam rekordokra történő felosztásáról.

Teljes kézfogás

Kezdetben az ügyfél és a kiszolgáló “megegyezik” a null titkosításban MAC és null tömörítés nélkül. Ez azt jelenti, hogy az általuk először küldött rekordot tiszta szövegként és védelem nélkül küldjük.

A kézfogás első üzenete egy ClientHello. Ez az az üzenet, amellyel az ügyfél kijelenti, hogy valamilyen SSL-t kíván létrehozni. Vegye figyelembe, hogy az “ügyfél” szimbolikus szerep; jelentése: “az a párt, amelyik először szól”. Így történik, hogy a HTTPS kontextusban, amely HTTP-belül-SSL-a TCP-n belül, mindhárom rétegben szerepel az “ügyfél” és a “kiszolgáló” fogalom, és mindannyian egyetértenek (a TCP-kliens egyben az SSL-kliens és a HTTP kliens), de ez egyfajta egybeesés.

A ClientHello üzenet a következőket tartalmazza:

  • a maximális protokoll verzió, amelyet az ügyfél támogatni kíván;
  • az “ügyfél véletlenszerű” (32 bájt, ebből 28 állítólag kriptográfiailag erős számgenerátorral jön létre);
  • a ” session ID “(abban az esetben, ha az ügyfél rövidített kézfogással akarja folytatni a munkamenetet, lásd alább);
  • az ügyfél által preferált” titkosító csomagok “listája, amelyekről az ügyfél tud;
  • az ügyfél által ismert, az ügyfél által preferált tömörítési algoritmusok listája;
  • néhány választható kiterjesztés.

A rejtjelcsomag egy 16 bites szimbolikus azonosító egy kriptográfia-készlethez c algoritmusok. Például a TLS_RSA_WITH_AES_128_CBC_SHA rejtjelkészlet értéke 0x002F, ami azt jelenti, hogy “a rekordok HMAC / SHA-1 és AES titkosítást használnak 128 bites kulccsal, és a kulcscsere titkosítással történik véletlenszerű kulcs a kiszolgáló RSA nyilvános kulcsával.

A szerver a ClientHello -re ServerHello amely a következőket tartalmazza:

  • az ügyfél és a szerver által használt protokoll verziója;
  • a “szerver random” (32 bájt, 28 véletlen byte-ok);
  • a kapcsolat munkamenet-azonosítója;
  • a használni kívánt titkosító csomag;
  • a használni kívánt tömörítési algoritmus;
  • opcionálisan néhány kiterjesztés.

A teljes kézfogás így néz ki:

 Client Server ClientHello --------> ServerHello Certificate* ServerKeyExchange* CertificateRequest* <-------- ServerHelloDone Certificate* ClientKeyExchange CertificateVerify* [ChangeCipherSpec] Finished --------> [ChangeCipherSpec] <-------- Finished Application Data <-------> Application Data 

(Ez a séma szégyentelenül másolták az RFC-ből.)

Látjuk a ClientHello és ServerHello fájlokat. Ezután a szerver elküldi néhány más üzenet, amelyek a titkosító csomagtól és néhány más paramététől függenek rs:

  • Tanúsítvány: a szerver tanúsítványa, amely tartalmazza a nyilvános kulcsát. Bővebben erről alább. Ezt az üzenetet szinte mindig elküldjük, kivéve, ha a rejtjelkészlet tanúsítvány nélküli kézfogást ír elő.
  • ServerKeyExchange: néhány extra érték a kulcscseréhez, ha a tanúsítványban szereplő nem elegendő. Különösen a “DHE” titkosítócsomagok használnak egy efemer Diffie-Hellman kulcscserét, amelyhez ez az üzenet szükséges.
  • CertificateRequest: egy üzenet, amelyben azt kéri, hogy az ügyfél szintén azonosítsa magát egy saját tanúsítvánnyal. Ez az üzenet tartalmazza a megbízhatósági horgonyok (más néven “gyökértanúsítványok”) listáját, amelyeket a szerver az ügyféltanúsítvány érvényesítéséhez fog használni.
  • ServerHelloDone: egy marker üzenet (hossza nulla), amely azt mondja, hogy a szerver kész, és az ügyfélnek most beszélnie kell.

Ezután az ügyfélnek válaszolnia kell a következővel:

  • Tanúsítvány: az ügyféltanúsítvány, ha a szerver kért egyet. Finom variációk vannak a verziók között (SSLv3 esetén az ügyfélnek el kell hagynia ezt az üzenetet, ha nincs tanúsítványa; TLS 1.0+ esetén ugyanabban a helyzetben Certificate üzenet a tanúsítványok üres listájával).
  • ClientKeyExchange: a tényleges kulcscsere kliens része (pl. a kiszolgáló RSA kulcsával titkosított néhány véletlenszerű érték).
  • CertificateVerify: a digitális aláírás az ügyfél által kiszámított összes korábbi kézfogási üzenetre. Ezt az üzenetet akkor küldjük el, amikor a szerver ügyféltanúsítványt kért, és az ügyfél eleget tett. Az ügyfél így bizonyítja a szervernek, hogy valóban “birtokolja” a nyilvános kulcsot, amelyet az elküldött tanúsítvány kódol.

Ezután az ügyfél elküld egy ChangeCipherSpec üzenet, amely nem kézfogás: saját rekordtípusú, ezért saját rekordban küldi el.Tartalma tisztán szimbolikus (az 1. érték egyetlen bájtja). Ez az üzenet azt a pontot jelöli, amikor az ügyfél átvált az újonnan megtárgyalt rejtjelkészletre és kulcsokra. Ezután az ügyfél későbbi rekordjai titkosításra kerülnek.

A Befejezett üzenet egy kriptográfiai ellenőrző összeg kiszámítva az összes korábbi kézfogási üzenet felett (mind az ügyféltől, mind a szervertől). Mivel a ChangeCipherSpec után bocsátják ki, az integritás-ellenőrzés és a titkosítás is lefedi. Amikor a szerver megkapja az üzenetet, és ellenőrzi annak tartalmát, bebizonyítja, hogy valóban végig ugyanazzal az ügyféllel beszélt. Ez az üzenet megvédi a kézfogást a módosításoktól (a támadó nem tudja módosítani a kézfogás üzeneteit, és továbbra is megkapja a Finished üzenetet).

A szerver végül a sajátjával válaszol ChangeCipherSpec majd Finished. Ekkor a kézfogás befejeződik, és az ügyfél és a kiszolgáló kicserélheti az alkalmazás adatait (az ilyenként címkézett titkosított rekordokban).

Ne feledje: az ügyfél javasolja , de a szerver választ . A titkosító csomag a szerver kezében van. Az udvarias kiszolgálóknak állítólag követniük kell az ügyfél preferenciáit (ha lehetséges), de megtehetik másként is, és egyesek valóban (pl. A BEAST elleni védelem részeként).

Rövidített kézfogás

A teljes kézfogás során a szerver “munkamenet-azonosítót” (azaz legfeljebb 32 bájtos csokrot) küld az ügyfélnek. Később az ügyfél visszatérhet és elküldheti ugyanazt a munkamenet-azonosítót a ClientHello részeként. Ez azt jelenti, hogy az ügyfél továbbra is emlékszik a rejtjelkészletre és a kulcsokra az előző kézfogásból, és szeretné újra felhasználni ezeket a paramétereket. Ha a kiszolgáló is emlékszik a rejtjelkészletre és a kulcsokra, akkor az adott munkamenet-azonosítót átmásolja a ServerHello mezőbe, majd követi a rövidített kézfogás :

 Client Server ClientHello --------> ServerHello [ChangeCipherSpec] <-------- Finished [ChangeCipherSpec] Finished --------> Application Data <-------> Application Data 

A rövidített kézfogás rövidebb: kevesebb üzenet, nem aszimmetrikus rejtjelezési üzlet, és ami a legfontosabb: csökkent késleltetés . A böngészők és a szerverek sokat tesznek. Egy tipikus webböngésző teljes kézfogással nyit meg egy SSL-kapcsolatot, majd rövidített kézfogásokat hajt végre ugyanazon szerver összes többi kapcsolatához: a párhuzamosan megnyíló többi kapcsolathoz, valamint a későbbi kapcsolatokhoz ugyanahhoz a szerverhez. Valójában a tipikus webszerverek 15 másodperc inaktivitás után bezárják a kapcsolatokat, de sokkal hosszabb ideig (esetleg órákig vagy akár napokig) emlékeznek a session ekre (a rejtjelcsomagra és a kulcsokra).

Kulcscsere

Az SSL számos kulcscsere-algoritmust használhat. Ezt a rejtjelkészlet határozza meg; minden kulcscsere algoritmus működik bizonyos típusú szerver nyilvános kulccsal. A leggyakoribb kulcscsere-algoritmusok a következők:

  • RSA: A kiszolgáló kulcsa RSA típusú. Az ügyfél véletlenszerű értéket generál (a ” pre-master titok “48 bájtból, ebből 46 véletlenszerű), és a szerver nyilvános kulcsával titkosítja. Nincs ServerKeyExchange.
  • DHE_RSA: a kiszolgáló kulcsa RSA típusú, de csak aláírás. A tényleges kulcscsere Diffie-Hellman-t használ. A szerver egy ServerKeyExchange üzenetet küld, amely tartalmazza a DH paramétereket (modulus, generátor) és egy újonnan létrehozott nyilvános DH kulcsot, ráadásul a szerver aláírja ezt az üzenetet. Az ügyfél egy ClientKeyExchange üzenettel válaszol, amely egy újonnan létrehozott nyilvános nyilvános kulcsot is tartalmaz. “.
  • DHE_DSS: like DHE_RSA, de a szerver rendelkezik DSS kulccsal (a” DSS “is ismert mint “DSA” ). A DSS csak aláírás-algoritmus.

A ritkábban használt kulcscsere-algoritmusok a következők:

  • DH: a szerver kulcsa Diffie-Hellman típusú (beszélünk egy tanúsítványról , amely tartalmaz egy DH gomb). Ez korábban közigazgatásilag “népszerű” volt (az Egyesült Államok szövetségi kormánya előírta használatát), amikor az RSA szabadalom még mindig aktív volt (ez az előző évszázadban volt). A bürokratikus erőfeszítések ellenére soha nem volt olyan széles körben telepítve, mint az RSA.
  • DH_anon: mint a DHE lakosztályok, de a szerver aláírása nélkül. Ez tanúsítvány nélküli titkosító csomag. Konstrukciója szerint kiszolgáltatott a Közép-ember támadásoknak , így egyáltalán nagyon ritkán engedélyezett.
  • PSK: előre megosztott kulcs titkosítócsomagok. A csak szimmetrikus kulcscsere, előre meghatározott közös titokra építve.
  • SRP: a SRP protokoll alkalmazása, amely Jelszóval hitelesített kulcscsere protokoll. A kliens és a szerver hitelesíti egymást egy megosztott titok vonatkozásában, amely lehet alacsony entrópiaú jelszó (míg a PSK nagy entrópiaú megosztott titkot igényel). Nagyon ügyes. Még nem támogatott széles körben.
  • Ephemer RSA kulcs: például DHE, de újonnan létrehozott RSA kulcspárral. Mivel az RSA kulcsok előállítása drága, ez nem egy népszerű lehetőség, és csak az “export” titkosító csomagok részeként került megadásra, amelyek megfeleltek a 2000 előtti amerikai rejtjelezési exportszabályoknak (azaz legfeljebb 512 bit RSA kulcsok). Manapság ezt senki sem teszi.
  • A DH* algoritmusok változatai elliptikus görbékkel . Nagyon divatos. A nak a jövőben általánossá kell válnia.

Tanúsítványok és hitelesítés

A digitális tanúsítványok az aszimmetrikus kulcsok edényei. A kulcselosztás megoldására szolgálnak. Az ügyfél ugyanis a kiszolgáló nyilvános kulcsát akarja használni. A támadó megpróbálja elérni, hogy az ügyfél használja a támadó s nyilvános kulcsot. Tehát az ügyfélnek meg kell tudnia bizonyosodni arról, hogy a megfelelő kulcsot használja-e.

Az SSL állítólag a X.509 fájlt használja. Ez a tanúsítványok szabványa. Minden tanúsítványt aláír egy tanúsító hatóság . Az ötlet az, hogy a kliens eredendően ismeri egy maroknyi CA nyilvános kulcsait (ezek a “bizalmi horgonyok” vagy a “gyökértanúsítványok”). Ezekkel a kulcsokkal az ügyfél ellenőrizheti a CA által kiszámított aláírást a szervernek kiadott tanúsítványon keresztül. Ez a folyamat rekurzívan meghosszabbítható: a hitelesítésszolgáltató kiadhat egy tanúsítványt egy másik hitelesítésszolgáltató számára (azaz aláírja a tanúsítvány szerkezetét, amely tartalmazza a másik hitelesítésszolgáltató nevét és kulcsát). A tanúsítványlánc gyökér-CA-val kezdődik és a kiszolgáló tanúsítványával végződik, köztük közbenső CA-tanúsítvánnyal, mindegyik tanúsítványt az előző tanúsítványban kódolt nyilvános kulcshoz viszonyítva írják alá, elképzelhetetlenül tanúsítványlánc .

Tehát az ügyfélnek a következőket kell tennie:

  • Szerezzen be egy tanúsítványláncot, amely a szerver tanúsítványával végződik. A szerverről érkező Certificate üzenetnek pontosan egy ilyen láncot kell tartalmaznia.
  • Validálja a láncot, vagyis ellenőrizze az összes aláírások és nevek, valamint a különféle X.509 bitek. Ezenkívül az ügyfélnek ellenőriznie kell a lánc összes tanúsítványának visszavonási állapotát , amely összetett és nehéz (a webböngészők most ezt csinálják, többé-kevésbé, de egy újabb fejlemény).
  • Ellenőrizze, hogy a tervezett kiszolgáló neve valóban be van-e írva a szerver tanúsítványába. Mivel az ügyfél nem csak érvényesített nyilvános kulcsot akar használni, emellett egy adott szerver nyilvános kulcsát is szeretné használni. Lásd az RFC 2818 részleteket arról, hogy ez hogyan történik HTTPS kontextusban. .

Az X.509 tanúsítvánnyal rendelkező tanúsítási modellt gyakran kritizálták, nem igazán technikai okokból, hanem inkább politikai-gazdasági okokból. Néhány játékos kezébe koncentrálja az érvényesítési hatalmat. , akik nem feltétlenül jó szándékúak, vagy legalábbis nem mindig kompetensek . Most és újra más rendszerekre vonatkozó javaslatokat tesznek közzé (pl. Konvergencia vagy

DNSSEC ), de egyik sem kapott széles körű elfogadást (még).

A tanúsítvány alapú kliens hitelesítés esetén teljes egészében a szerver dolga dönteni mit kell kezdeni egy ügyféltanúsítvánnyal (és mit kell kezdeni azzal az ügyféllel is, aki elutasította a tanúsítvány küldését). A Windows / IIS / Active Directory világban az ügyféltanúsítványnak tartalmaznia kell egy fióknevet “Felhasználói név névként” (a tanúsítvány Subject Alt Name kiterjesztésében kódolva); a szerver megkeresi az Active Directory szerveren.

Ismét kézfogás

Mivel a kézfogás csak néhány üzenet, amelyet rekordként küldenek a jelenlegi titkosítási / tömörítési megállapodásokkal, elméletileg semmi sem akadályozza meg az SSL-klienst és a kiszolgálót abban, hogy a második kézfogást egy létrehozott SSL-kapcsolaton belül elvégezze. És valóban támogatott, és ez a gyakorlatban is megtörténik.

A kliens vagy a szerver bármikor kezdeményezhet új kézfogást (a szerver küldhet egy HelloRequest üzenet a kiváltására; az ügyfél csak egy ClientHello üzenetet küld. Tipikus helyzet a következő:

  • A HTTPS szerver úgy van konfigurálva, hogy meghallgassa az SSL kéréseket.
  • Egy ügyfél csatlakozik, és kézfogást hajt végre.
  • Miután a kézfogás megtörtént, az ügyfél elküldi „alkalmazási adatait”, amely egy HTTP kérésből áll. Ebben a pontban (és csak ezen a ponton) a szerver megtanulja a cél elérési útját. Addig az URL-t, amelyet az ügyfél el akar érni, a kiszolgáló nem ismerte (a kiszolgálót esetleg a iv id segítségével értesítették a célkiszolgáló nevéről = “3456c508ac”> Kiszolgálónév jelzése SSL kiterjesztés, de ez nem tartalmazza az útvonalat.
  • Az útvonal láttán a szerver megtudhatja, hogy ez egy részre vonatkozik adatainak csak állítólag csak tanúsítványokkal hitelesített kliensek férhetnek hozzá. De a szerver nem kért kliens tanúsítványt a kézfogásban (különösen azért, mert a nem is olyan régebbi böngészők furcsa felugró ablakokat jelenítettek meg, amikor tanúsítványt kértek, különösen, ha nem rendelkeznek ilyennel, ezért a szerver tartózkodik a kérdéstől tanúsítvány, ha nem volt megalapozott oka azt hinni, hogy az ügyfél rendelkezik ilyennel, és tudja, hogyan kell használni.
  • Ezért a szerver új kézfogást indít el, ezúttal tanúsítványt kér.

Van egy érdekes gyengeség az imént leírt helyzetben; keresse meg az RFC 5746 megoldást. Fogalmi szempontból az SSL csak “előre” módon továbbítja a biztonsági jellemzőket. Új kézfogáskor bármi, amit az ügyfélről tudni lehet előtt , az új kézfogás továbbra is érvényes után (pl. Ha az ügyfél jó felhasználónév + jelszót küldött az alagútban ), de nem fordítva. A fenti helyzetben az első HTTP-kérelemre, amelyet az új kézfogás előtt kaptak, nem terjed ki a második kézfogás tanúsítványalapú hitelesítése, és azt a támadó választotta volna! Sajnos néhány webszerver csak azt feltételezte, hogy a kliens hitelesítése a második kézfogástól kiterjedt a második kézfogás előtt elküldöttekre is, és ez csúnya trükköket engedett meg a támadótól. Az RFC 5746 megpróbálja ezt kijavítani.

Figyelmeztetések

Figyelmeztetés üzenetek csak figyelmeztető és hibaüzenetek. Ezek meglehetősen érdektelenek, kivéve, ha felboríthatják őket egyes támadások miatt (lásd később).

Van egy fontos riasztási üzenet, close_notify: ez egy olyan üzenet, amelyet az ügyfél vagy a szerver küld, amikor meg akarja szüntetni a kapcsolatot. Amikor ezt az üzenetet megkapta , a szervernek vagy az ügyfélnek egy close_notify -vel is válaszolnia kell, majd lezártnak kell tekintenie az alagutat (de a munkamenet továbbra is érvényes, és hátsó rövidített kézfogással újra felhasználható). Érdekes rész, hogy ezeket a riasztási üzeneteket, mint minden más rekordot, titkosítás és MAC védi. Így a kapcsolat lezárását a kriptográfiai ernyő fedi.

Ez fontos a (régi) HTTP kontextusában, ahol a szerver bizonyos adatokat kifejezett “tartalomhossz” nélkül küldhet: az adatok a szállítási folyam végéig terjednek. Az SSLv2-vel ellátott régi HTTP (amelynek nem volt meg a close_notify), lehetővé tette a támadó számára, hogy kényszerítse a kapcsolatot (a TCP szintjén), amelyet az ügyfél normál bezáráshoz vett volna; így a támadó csonkíthatja az adatokat anélkül, hogy elkapnák. Ez az egyik probléma az SSLv2-vel (vitathatatlanul a legrosszabb), és az SSLv3 javítja. Ne feledje, hogy a “modern” HTTP “Tartalom-hosszúság” fejléceket és / vagy darabolt kódolást használ, amely nem sérülékeny az ilyen csonkolásra, még akkor sem, ha az SSL réteg megengedi. Mégis jó tudni, hogy az SSL védelmet nyújt a bezárási eseményeknél.

Támadások

A Stack Exchange válaszhossza korlátozott, ezért az SSL elleni egyes támadások leírása másik válasz lesz (ezen kívül van néhány palacsintám) főzni). Maradj velünk.

Megjegyzések

  • Az SSLv3 immár elavult a biztonsági szivárgások miatt. POODLE támadás.
  • @ThomasPornin ez a legjobb magyarázat, amit ‘ találtam az interneten, köszönöm! Bármilyen esélyt kaphatunk arra, hogy frissítse az új TLS 1.3 kézfogáshoz? 🙂

Válasz

Utána az SSL hosszadalmas bemutatása a előző válaszban , engedjük át a szórakoztató dolgokat, nevezetesen:

Támadások az SSL-re

Sok támadást hajtottak végre az SSL ellen, némelyik a megvalósítási hibákra épült, mások az igazi protokollgyengeségekre.

Nem szabad megfeledkezni arról, hogy bár az SSL az egyik leginkább támadott protokoll (mivel nagyon nagy jelentőségű: az SSL-hez való sikeres alkalmazás egy kutatási cikk absztraktjában nagyon szép nek tűnik), Az SSL egyben a legtöbb javított protokoll is.Pontosan azért tekinthető robusztusnak, mert a szállítási protokollok megtámadásának minden ismert módját kipróbálták az SSL-en, és az SSL-t adott esetben javították.

Verzió visszaállítás

Az SSLv3 kezdeti napjaiban az SSLv2 még mindig széles körben használt volt, és ezért az ügyfelek gyakran SSLv2-kompatibilis >

üzenetek, amelyek csupán azt jelezték, hogy az SSLv3 is támogatott; a szerver ekkor megfogadja a tippet, és SSLv3 + dialektussal válaszol (a részletekért lásd az RFC 2246 E. függelékét). Mivel az SSLv2-nek voltak gyengeségei, a támadónak az volt az érdeke, hogy gondoskodjon arról, hogy egy kliens és egy szerver – mindkettő ismeri az SSLv3-t – mégis beszéljen egymással az SSLv2 használatával. Ezt hívjuk version rollback attack nak. A koncepció formálisan kiterjed a későbbi verziókra is.

A visszagörgetési kísérletek észleléséhez Kludge-eket adtak hozzá. Az SSLv2 visszaállításához az SSLv3 + -ot ismerő ügyfélnek speciális kitöltést kell alkalmaznia az RSA titkosítási lépéshez (az SSLv2 csak RSA alapú kulcscserét támogat): PKCS 1 , a titkosítandó adatokat állítólag számos véletlen bájttal kell kitölteni; egy SSLv3-tudatú kliensnek akkor állítólag az utolsó nyolc kitöltési bájt mindegyikét a 0x03 fix értékre kell állítania. A szerver ezután ellenőrzi ezeket a bájtokat; ha a nyolc 0x03 megtalálható, akkor valószínűleg megpróbál egy visszagörgetést, és a kiszolgáló elutasítja a kísérletet (a csak SSLv2-alapú kliensnek csak 255 -8 valószínűsége, hogy puszta hiányából ilyen kitöltési bájtokat használ. szerencsét, így a hamis pozitív eredmények elhanyagolható arányban fordulnak elő.

Az SSL / TLS régi verziójának visszaváltása esetén, de nem régebbi, mint az SSLv3, egy másik kludge került hozzáadásra: a pre-master titokban a 48 bájtból, amelyeket az ügyfél a kiszolgáló RSA kulcsával titkosít, az első két bájt nem véletlenszerű, hanem meg kell egyeznie a “maximálisan támogatott protokoll verzióval”, amelyet az ügyfél a üzenet. Sajnos néhány ügyfél tévedett, és ez a kludge csak egy RSA-alapú kulcscserével működik, így a visszagörgetés elleni védelem ott nagyon korlátozott. Szerencsére az SSLv3 + rendelkezik egy másik, sokkal hatékonyabb védelemmel visszagörgetés, vagyis a kézfogás üzeneteinek összevonása a Finished üzenetek felépítésekor. Ez a pro védelmet nyújt a visszagurulások ellen, hacsak a “régi verzió” nem lenne annyira alaposan gyenge, hogy a támadó a kézfogás vége előtt teljesen megszakíthatja az egész titkosítást. Ez még nem történt meg (az SSLv3 még mindig meglehetősen robusztus).

Gyenge Cipher Suites

A szabványos titkosító csomagok némelyike szándékosan gyenge. Vannak:

  • néhány titkosító programcsomag titkosítás nélkül, csak az integritás ellenőrzése, pl. TLS_RSA_WITH_NULL_SHA;
  • néhány 40 bites titkosítású titkosítócsomag, például TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 (titkosítócsomagok, amelyek megfelelnek a a szigorú amerikai exportszabályok a múlt századból – ezeket a szabályokat többnyire a Bill Clinton-korszak végén feloldották);
  • néhány 56 bites titkosítású titkosítócsomag, például TLS_RSA_WITH_DES_CBC_SHA. Az 56 bites DES meglévő technológiával megtörhető, de ez még mindig kissé nehéz egy amatőr számára (még egy unatkozó hallgatónak is, aki néhány száz egyetemi géphez fér hozzá) ), ezért hajlamos vagyok az 56 bites DES-t “közepes erősségűnek” minősíteni.

Ez megnyitja az utat a verzió visszagörgetési támadásainak egy változata felé, amelyben a támadó arra kényszeríti az ügyfelet és a szervert, hogy megállapodjanak gyenge rejtjelkészleten, az az elképzelés, hogy a támadó módosítsa az ügyfél által bejelentett titkosítócsomagok listáját. Ez akkor használható a támadó számára, ha a kiválasztott titkosítócsomag annyira gyenge, hogy meg tudja bontani a látszólag helyes Finished üzenet. Valójában az SSLv3 + -ban használt MAC (még akkor is, ha MD5-n alapul) elég robusztus ahhoz, hogy ezt megakadályozza. Tehát itt nem kell aggódni. Véleményem szerint itt valódi gyengeség amikor egy kliens vagy szerver egyáltalán elfogadja a gyenge titkosító csomag használatát.

Alapértelmezés szerint a modern webböngészők nem engedélyezik ilyen gyenge titkosító csomagok használatát.

Privát kulcs lopása

Ha egy SSL kapcsolat RSA kulcscserét használ, és egy támadó megőrzi a nyilvántartás másolatát, majd később (esetleg hónapokkal később, esetleg az eldobott merevlemezeken vagy szalagokon található összes biztonsági másolat ellenőrzésével) megszerzi a privát kulcs másolatát, majd kibogozhatja a kézfogás és az adatok visszafejtése.

Tökéletes továbbítási titok arról szól, hogy ezt később “ellensúlyozzuk”. A DHE rejtjelkészletek használatával kapja meg. DHE rejtjelkészlet esetén a kézfogás feloldásához használható tényleges magánkulcs az elmúló Diffie-Hellman kulcs, nem pedig a szerver RSA (vagy DSS) titkos kulcsa.Ideiglenes jellegű, csak a RAM-ban létezett, és soha nem írták a merevlemezre; mint ilyen, sokkal ellenállóbbnak kell lennie a hátsó lopásokkal szemben.

Tehát a tanulság: általában próbáljon meg DHE rejtjelkészletet használni, ha lehetséges. Ne felejtse el a biztonsági másolatokat készíteni, és ne engedje, hogy a magánkulcsa kiszivárogjon, de legalább a DHE-készletek kissé kevésbé okoznak ilyen szivárgást, különösen, ha a kulcs élettartamának lejárta után következik be (azaz a megfelelő tanúsítvány nem érvényesebb).

Tanúsítványbaj

Az egész tanúsítványüzlet fájó hely az SSL-ben.

Technikailag az SSL teljesen független az X.509-től. A tanúsítványláncokat átlátszatlan foltokként cserélik. Egy bizonyos ponton az ügyfélnek a kiszolgáló nyilvános kulcsát kell használnia, de az ügyfél szabadon “megismerheti” azt a kulcsot, amelyet jónak lát. Egyes esetekben, amikor az SSL használható, az ügyfél már ismeri a szervert nyilvános kulcsa (a kódban kemény kódolású), és csak figyelmen kívül hagyja a szerver által küldött tanúsítványt. Mindazonáltal a HTTPS gyakori esete esetén az ügyfél a X.509 ( olvassa el a józan esze rovására; figyelmeztettek benneteket.

Ez számos támadási vektort eredményez, például:

  • Az érvényesítés magában foglalja annak ellenőrzését a tanúsítványok továbbra is érvényesek az aktuális dátumon. Honnan tudja az ügyfélgép az aktuális dátumot? A belső órájával és esetleg azáltal, hogy NTP szerverekkel beszél ( egy egészen védtelen módon!). Az ügyfél több perccel, órával, nappal, akár évekkel is kikapcsolhat (láttam), és bizonyos mértékig egy erős támadó kényszerítheti NTP-üzenetek fikázásával. Ez lehetővé tenné a támadónak elavult, évekkel ezelőtt visszavont tanúsítványokat kell használnia. Figyeljen meg egy szórakoztató tényt: az SSL “véletlenszerű kliens” és “kiszolgáló véletlenszerű” 28 véletlen bájtot és a helyi dátumot és időt (több mint 4 bájt) Az idő az időalapú támadásokkal szembeni megoldás része volt. Nincs tudomásom olyan megvalósításról, amely valóban ellenőrzi.

  • 2003-ig kb. Az Internet Explorer / Windows tanúsítvány-érvényesítés nem valósította meg az “Basic Constraints” kiterjesztést. megfelelően. A nettó hatás az volt, hogy bárki, aki rendelkezik 100 € tanúsítvánnyal, CA-ként működhet, és “tanúsítványokat” állíthat ki önkényesen választott névvel és kulcsokkal.

  • X A .509 tartalmaz egy visszavonás nevű károsodás-visszatartó funkciót: ez egy olyan kitiltott tanúsítványok listájának közzétételéről szól, amelyek kriptográfia szempontjából jól néznek ki, de nem szabad megbízni bennük (pl. Ellopták a magánkulcsukat, vagy hibás név). A visszavonás csak addig működik, amíg az érintett felek (azaz a böngészők) elfogadják a mamut visszavonási listák letöltését (amelyek több megabájt hosszúak lehetnek!), Vagy kapcsolatba léphetnek az OCSP szerverekkel . A modern böngészők most ezt csinálják, de kissé vonakodva, és sokan mégis elfogadják a csatlakozást, ha nem tudnák időben megszerezni a visszavonási állapotra vonatkozó információkat (mert az emberi felhasználó nem türelmes). Az általános helyzet javul az évek során, de meglehetősen lassan.

  • Néhány root CA elkövetett néhány hibát a múltban (pl. Comodo és DigiNotar). Ennek eredményeként hamis tanúsítványokat bocsátottak ki (a név www.microsoft.com, de a magánkulcs egyáltalán nincs a Microsoft kezében …). Ezeket a baklövéseket felfedezték, és a tanúsítványokat visszavonták, de mégis felvet néhány kényelmetlen kérdést (pl. Vannak-e más CA-k, akiknek voltak ilyen problémáik, de nem fedték fel őket, vagy ami még rosszabb, soha nem vették észre őket?).

Az X.509 az algoritmusok, technológiák, specifikációk és bizottságok nagyon összetett összeállítása, és nagyon nehéz helyrehozni. Ha megpróbálja dekódolni az X.509 tanúsítványokat “kézzel” egy olyan védtelen programozási nyelven, mint a C, akkor egyszerűen meg lehet szerezni a puffertúlcsordulást.

Bleichenbacher támadások

Daniel Bleichenbacher 1998-ban szép támadást talált az RSA ellen. Amikor egy adatot RSA-val titkosít (mint az SSL ClientKeyExchange üzenetnél történik), a titkosítandó adatokat párnázni kell annak érdekében, hogy hogy az RSA modulussal azonos hosszúságú bájtsorozatot készítsen. A kitöltés többnyire véletlen byte-okból áll, de van egy kis felépítés (nevezetesen a kitöltés után az első két bájtnak 0x00 0x02-nek kell lennie.)

A visszafejtéskor (akkor a szerveren) a kitöltést meg kell megtalálhatók és eltávolíthatók. Így történik, hogy abban az időben, amikor a szerver visszafejtette, de érvénytelen kitöltést kapott (a 0x00 0x02 bájt nem volt meg), akkor riasztási üzenettel jelentette (az SSL specifikáció szerint), míg egy érvényes kitöltés a kiszolgáló a látszólag visszafejtett értéket használva tartja a kézfogást.

Ez a fajta dolog padding oracle néven ismert. Lehetővé teszi a támadó számára, hogy tetszőleges bájtsorozatot küldjön, mintha egy titkosított elő-master titok lenne, és megtudhatja, hogy a sorozat visszafejtése érvényes kitöltést eredményez-e vagy sem. Ez csupán 1 bites információ, de elegendő a privát kulcs néhány millió kéréssel történő visszaállításához (ravaszul kidolgozott “titkosított” karakterláncokkal).

Megkerülő megoldás: amikor a visszafejtés érvénytelen lesz kitöltéssel a szerver továbbra is használ egy véletlenszerű elő-master titkot. A későbbiekben a kézfogás meghiúsul, a Finished üzenetekkel. Az SSL összes jelenlegi megvalósítása ezt teszi.

A párnázó Oracle visszavág

Egy másik terület, ahol párnázó orákulum található, a vegyék figyelembe a CBC titkosítást és a HMAC-ot. A titkosítandó adatok előbb MAC-osak, majd az eredmények titkosításra kerülnek. CBC-titkosítással a titkosítandó adatok hosszának meg kell felelnie a blokk méretének (8 bájt 3DES esetén 16 bájt az AES-hez). Tehát néhány kitöltést alkalmaznak, némi felépítéssel.

Abban az időben (a támadást Vaudenay találta meg 2002-ben), amikor egy SSL implementáció feldolgozta a vételt A d rekord különálló riasztási üzeneteket adott vissza a következő két feltételhez:

  • A visszafejtés után nem található érvényes kitöltési struktúra. érvényes kitöltést találtak, de azután a MAC-t ellenőrizték, és nem egyezett.

Ez egy kitöltő orákulum, amely felhasználható néhány titkosított adat helyreállítására. Aktív támadót igényel, de ez nem olyan nehéz. Vaudenay implementálta, és kiterjesztették arra az esetre, amikor a módosított SSL implementáció mindkét esetben ugyanazt a riasztási üzenetet adta vissza, a második esetben azonban hosszabb időre volt szükség a MAC újraszámításához (a egy időzítési támadás ).

Mivel az emberek soha nem tanulnak, az ASP.NET-ben használt SSL Microsoft implementációja még mindig nem javított 2010-től (nyolc évvel később!), amikor Rizzo és Duong újból végrehajtották a Vaudenay támadást, és bemutatót készítettek, amely helyreállította a HTTP cookie-kat.

Lásd ez az oldal néhány mutatóhoz. Meg kell jegyeznünk, hogy ha az SSL encrypt-then-MAC -et használt volna, akkor az ilyen problémákat elkerülhették volna (a hibás rekordokat MAC-szinten elutasították volna, mielőtt még a visszafejtést is figyelembe véve).

BEAST

A BEAST támadás ismét Duong és Rizzo, és megint egy régebbi támadás (Philip Rogaway 2002-ben) feldolgozása. Az ötlet megszerzéséhez fontolja meg a CBC elemet. Ebben a működési módban minden adatblokkot először XOR-ba teszünk az előző blokk titkosításának eredményeként; és ez “az XOR eredménye , amely titkosítva van. Ez a blokkok” véletlenszerűsítése “és az ECB módban előforduló szivárgások elkerülése érdekében történik. Mivel az első blokk nem rendelkezik “előző” blokknak tartalmaznia kell egy inicializálási vektort (IV), amely az előző blokk szerepét tölti be az első blokknál.

Kiderült, hogy ha a támadó képes kezelni a titkosítandó adatok részét , és meg tudja jósolni a használni kívánt IV-t is, akkor a titkosító gépet egy újabb visszafejtéssé alakíthatja. oracle-t, és felhasználhatja néhány más titkosított adat helyreállítására (amelyeket a támadó nem választ). Az SSLv3 és a TLS 1.0 verziókban azonban a támadó megjósolhatja egy rekord IV-jét: ez az utolsó blokk Az előző rekord! Tehát a támadónak képesnek kell lennie bizonyos adatok elküldésére az adatfolyamban a céladatok “tolása” érdekében, egy olyan ponton, ahol a megvalósítás felépítette és elküldte az előző rekordot (általában amikor 16 kB értékű adat összegyűlt), de nem kezdte meg a következő elkészítését.

A TLS 1.1+ védett ez ellen, mert a TLS 1.1-ben (és az azt követő verziókban) rekordonként véletlenszerű IV-t használnak. Az SSLv3 és a TLS 1.0 esetében megkerülő megoldás a nulla hosszúságú rekordok elküldése: vagyis a nulla hosszú hasznos terhelésű rekordok – de MAC-tal, valamint kitöltéssel és titkosítással -, és a MAC-t egy titkos kulcsból és a szekvencia fölé számítják ki. szám, tehát ez egy véletlenszám-generátor szerepét tölti be. Sajnos az IE 6.0 elfojtja a nulla hosszúságú rekordokat. Más stratégiák 1 / n-1 felosztást tartalmaznak (egy n bájtos rekordot két rekordként küldenek, az egyiknek egyetlen bájtja van, a másiknak a fennmaradó n-1 ).

Egy másik megoldás egy nem CBC titkosítócsomag használatának kényszerítése, ha lehetséges – a szerver RC4 alapú titkosítócsomagot választ, ha van ilyen a titkosítócsomagok listájában, amelyet a még akkor is, ha az ügyfél CBC-alapú titkosítócsomagot szeretett volna. Ez az eszköz meg tudja mondani, hogy egy adott szerver nyilvánvalóan így viselkedik-e.(Megjegyzés: A BEAST egy támadás az kliens hez, de az RC4 titkosítócsomag kiválasztásával a szerver megvédheti a gondatlan klienst.)

Lásd: ezen az oldalon néhány mutató. Míg a TLS 1.1 2006-ból származik, a BEAST támadás a böngésző szállítóit kényszerítheti a frissítésre.

CRIME

Ami a hollywoodi franchise-t illeti, Duong és Rizzo 2012-ben publikálta a folytatás folytatását. A BŰNCSELEKMÉNY egy olyan szivárgást használ ki, amelyről évekkel ezelőtt elméletet írtak le, de csak a közelmúltban publikált demonstrációjukon szemléletesen mutatták be. A CRIME a tömörítést használja ki, ugyanabban a beállításban, mint a BEAST támadás (a támadó saját maga is küldhet adatokat SSL-kapcsolaton keresztül, ahol érdekes céladatokat, például cookie-t is küld). Nagyjából elmondható, hogy a támadó az adataiba egy potenciális értéket ad a célláncra, és ha egyezik, akkor a tömörítés az eredményül kapott rekordokat rövidebbé teszi. Lásd ezt a kérdést (pre-kognitív) elemzéshez.

A BŰNÖZÉS elkerülhető, ha egyáltalán nem használunk TLS-szintű tömörítést, ami mit csinálnak most a böngészők. Az Internet Explorer és az IIS soha nem valósította meg a TLS-szintű tömörítést (egyszer csak a hanyagság mentette meg a napot); A Firefox és a Chrome implementálta és inaktiválta ezt a nyarat (Duong és Rizzo figyelmeztették őket, akik meglehetősen felelősek tevékenységükben).

A BŰNÖZÉS megmutatja, miért írtam, a SSL-magyarázatok :

Az SSL ezeket a célokat nagy (de nem abszolút) mértékben teljesíti.

A titkosítás valóban kiszivárogtatja a titkosított adatok hosszát . Nincs ismert jó megoldás ez ellen. És a hossz önmagában sok mindent elárulhat. Például, ha egy hálózati monitorral megfigyelünk egy SSL-kapcsolatot, akkor észrevehetjük az “extra kézfogásokat” a folyamban (mivel az egyes rekordok első bájtja azonosítja a rekordban szereplő adatok típusát, és nincsenek titkosítva); a rekordok hosszai val elég könnyen meg lehet állapítani, hogy az ügyfél megadta-e a tanúsítványt, vagy sem.

uszkár

( szerkesztés: ez a szakasz hozzá lett adva 2014-10-15)

A “Poodle” támadás az SSL 3.0-ra jellemző hibát használja ki a CBC-alapú titkosító csomagokkal. Az SSL 3.0 gyakran figyelmen kívül hagyott szolgáltatására támaszkodik: a legtöbb bájtot figyelmen kívül hagyják. A TLS 1.0-ban a kitöltést (a bájtokat egy rekordban adták hozzá, hogy a hossz kompatibilis legyen a CBC titkosítással, amely csak a teljes blokkokat dolgozza fel); az összes bájtnak meghatározott értékkel kell rendelkeznie, és a címzett ezt ellenőrzi. Az SSL 3.0-ban a kitöltési bájt tartalmát figyelmen kívül hagyják, ami lehetővé teszi a támadó számára, hogy olyan módosításokat hajtson végre, amelyek többnyire észrevétlenek. A módosítás csak a nem alkalmazható adatokat érinti, de a BEAST-hoz homályosan hasonló módon visszafejtő orákulumként használható.

További részletek ebben olvashatók válasz .

A jövő

Az emberek soha nem tanulnak. Nagyon sok nyomás nehezedik arra, hogy remek bővítményeket adjon az SSL-hez sok olyan ok miatt, amelyek az elején mindig jól néznek ki, de extra problémákat okozhatnak.

Fontolja meg például a SSL FalseStart . Főleg arról van szó, hogy az ügyfél azonnal elküldi az alkalmazás adatait, miután elküldte Finished üzenetét (teljes kézfogással), várakozás nélkül a Finished üzenet a szerverről. Ez csökkenti a látenciát, ami jó és jó szándékú. Ez azonban megváltoztatja a biztonsági helyzetet: mielőtt megkapta a Finished üzenetet a szervertől, az utóbbit csak implicit módon hitelesíti (az ügyfélnek még nincs bizonyítéka arra, hogy a tervezett szerver valóban részt vett volna a mind; csak azt tudja, hogy bármit is küld, csak a tervezett szerver olvashatja el). Ennek hatásai lehetnek; például egy támadó addig emeletig utánozhatja a szervert, és kényszerítheti például az ügyfelet egy CBC-alapú titkosítócsomag vagy TLS-tömörítés használatára. Ezért, ha egy kliens a FalseStart programot hajtja végre, akkor csökken a BEAST és a CRIME elleni védekezési intézkedések hatékonysága, amit egyébként a szerver kényszeríthet.

(A Google letiltotta FalseStart idén tavasszal, nyilvánvalóan néhány szerverrel való kompatibilitási problémák miatt. Egyébként a “30% -os késés csökkentése” furcsának tűnt, mert a FalseStart csak a teljes kézfogásokra, nem pedig a rövidített kézfogásokra gyakorolna némi hatást, ezért nem teszem ” nem hiszek ezekben az állítólagos előnyökben; legalábbis nem ekkora mértékben.)

Hozzászólások

  • Mennyi erőfeszítést tett annak érdekében, hogy jó információt nyújtson a ez az oldal valóban őrült és rendkívül csodálatra méltó. Nagyon nagyra értékelik.
  • Lásd még: tools.ietf.org / html / rfc7457

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük