Handshake, ki se konča z napako, se zdi kot napad, dokler ne pogledate sporočila, in največkrat je to aritmetika: ni skupnega predloga, poteklo potrdilo ali paket, ki ni nikoli prispel. Napad downgrade je nekaj določnega: nasprotnik potiska oba konca k šibkejšemu vedenju, kot bi ga izbrala, in pušča drugačne dokaze. Če vsak neuspeh obravnavate kot zlonamernost, iščete žrtev, ki morda ne obstaja, če pa pravi downgrade obravnavate kot konfiguracijsko napako, šibkejši rezultat ostane na mestu. Ti dve napaki staneta različno in le eno je poceni popraviti.

Kaj napad downgrade pravzaprav spremeni

Cilj ni zlomiti šifro in ne uganiti ključa. Cilj je vplivati na pogajanja, da se obe strani ustavita na starejši različici ali šibkejšem algoritmu, ki ga napadalec zmore, ali da ena stran verjame, da druga podpira samo to.

Spremeni se dogovor, ne avtentikacija. Če lahko napadalec spremeni ponudbo, ne da bi bil odkrit, lahko strani še vedno dokončata handshake in se še vedno avtenticirata, vendar s parametri, ki jih napadalec preferira. Zato je zanimivo vprašanje, ali je samo pogajanje pokrito z zaščito celovitosti.

Zakaj mora biti samo pogajanje avtenticirano

TLS 1.3 to zaščito naredi eksplicitno. Odjemalec, ki je ponudil novejšo različico, lahko zazna strežnik, ki se je tiho umaknil, ker naključna vrednost strežnika nosi fiksen vzorec, ko se pogaja za 1.2 ali nižje, in odjemalec mora ob tem prekiniti. Celoten prepis je pokrit tudi z zaključnimi sporočili, zato sprememba kjer koli v pogajanju spodleti pozneje, namesto da bi tiho šla skozi.

Starejše različice protokola so imele šibkejše zgodbe, in prav zato so pomembna pravila vračanja. Končna točka TLS 1.0 v isti konfiguraciji ni napad downgrade; je dovoljen izid, ki ste ga izbrali dovoliti. Razlika je, ali je šibkejši rezultat prišel iz zaščitene odločitve ali iz nezaščitene poti, na katero je lahko vplival posrednik. Ko to tako formulirate, se večina incidentov prevede v vprašanje konfiguracije.

IKEv2 se obnaša drugače, a sloni na isti ideji. Predlog se prenaša v izmenjavi, ki pozneje avtenticira obe strani, zato vmesna naprava, ki prepisuje algoritme, avtentikacijo zlomi, namesto da bi jo usmerjala. Krmilni kanal OpenVPN zaščiti svoja pogajanja s TLS in nato ta kanal uporabi za dogovor o šifrah podatkovnega kanala, zato je zanimiva vrstica dnevnika krmilnega kanala.

Nastavljena združljivost ni napad

Skrbnik lahko namerno dovoli starejše izbire, da podpre dokumentiranega odjemalca, in ta odločitev je vidna v konfiguraciji. Napadalec take konfiguracije ne more ustvariti; lahko le izkoristi pot, ki mu omogoča vpliv na ponudbo.

Nevaren popravek je tisti, ki odstrani dokaz razlike. Omogočanje vseh starih možnosti, izklop preverjanja potrdil ali sprejemanje katere koli šifre, da napaka izgine, razširi, s čim bo končna točka soglašala, in odstrani preverjanja, ki bi poročala o šibkejšem rezultatu.

Če morate obdržati eno staro možnost, navedite razlog in odjemalca v komentarju konfiguracije, nato pa možnost omejite na profil, ki jo potrebuje. Izjema združljivosti, omejena na en poslušalec, je revizijsko sledljiva; tista, uporabljena globalno, je le šibkejša privzeta vrednost, za katero se nihče ne spomni, da jo je izbral.

Preberite neuspeh, preden poimenujete vzrok

Pred vsako spremembo shranite točen niz napake, različici odjemalca in strežnika ter čas. Nato razvrstite: se strani nista strinjali o predlogu, je pot paketov spodletela ali je ena stran zavrnila parameter, ki ga je nekoč sprejemala?

Neujemanje predloga običajno poimenuje problematične različice ali algoritme in spodleti vsakič na isti točki. Težava z usmerjanjem ali MTU se ustavi ali poteče, in pogosto se spreminja glede na omrežje. Poteklo potrdilo da napako preverjanja, ne pogajanj.

Nič od tega ni dokaz napadalca. Pripisati zlonamerni vzrok ob prvem neuspehu je napaka, ker skrije deterministično napako, ki bo jutri spet spodletela.

Potrdite, kaj je bilo dejansko izbrano

Po vsakem popravku preberite dogovorjeni rezultat, namesto da zaupate, da je povezava stekla. Povezava, ki uspe, ker je bilo preverjanje odstranjeno, je izid, ki ste se mu hoteli izogniti. Naslednja dva ukaza prikažeta izbrano različico in šifro za končno točko s TLS ter vrstico krmilnega kanala iz dnevnika strežnika OpenVPN.

openssl s_client -connect 198.51.100.30:443 -servername vpn.example.net -brief </dev/null
grep -iE 'Control Channel|Data Channel' /var/log/openvpn.log | tail -5

Primerjajte rezultat s konfiguracijo, ki ste jo nameravali, ne s tem, kar se zdaj povezuje. Če je izbrana različica starejša od dovoljenega minimuma, sta profil ali seznam vračanja mesto za pogled, in odgovor je popraviti ta seznam, ne razglasiti napada in obnoviti vse okoli.

Sorodni članki