Handshake koji završi greškom izgleda kao napad dok ne pogledate poruku, a najčešće je riječ o aritmetici: nema zajedničkog predloga, certifikat je istekao ili paket nikada nije stigao. Downgrade napad je konkretna stvar: protivnik gura oba kraja ka slabijem ponašanju nego što bi odabrali, i ostavlja drugačije dokaze. Ako svaki neuspjeh tretirate kao zlu namjeru, tražite žrtvu koja možda ne postoji, a ako stvarni downgrade tretirate kao grešku u konfiguraciji, slabiji rezultat ostaje na mjestu. Te dvije greške koštoju različito, a samo je jedna jeftina za ispravku.

Šta downgrade napad zapravo mijenja

Cilj nije razbiti šifru ni pogoditi ključ. Cilj je uticati na pregovore tako da se obje strane zaustave na starijoj verziji ili slabijem algoritmu s kojim se napadač može nositi, ili da jedna strana povjeruje da druga podržava samo to.

Mijenja se dogovor, ne autentikacija. Ako napadač može izmijeniti ponudu bez otkrivanja, strane i dalje mogu završiti handshake i i dalje se međusobno autentificirati, ali s parametrima koje napadač preferira. Zato je zanimljivo pitanje da li je sam pregovor pokriven zaštitom integriteta.

Zašto sam pregovor mora biti autentificiran

TLS 1.3 tu zaštitu čini eksplicitnom. Klijent koji je ponudio noviju verziju može otkriti server koji je tiho pao nazad, jer slučajna vrijednost servera nosi fiksni obrazac kada pregovara 1.2 ili niže, a klijent je dužan prekinuti kad to vidi. Cijeli transkript također je pokriven završnim porukama, pa izmjena bilo gdje u pregovoru pada kasnije, umjesto da prođe tiho.

Starije verzije protokola imale su slabije priče, i upravo zato pravila vraćanja na staro imaju težinu. Krajnja točka s TLS 1.0 u istoj konfiguraciji nije downgrade napad; to je dopušten ishod koji ste sami odlučili dopustiti. Razlika je da li je slabiji rezultat došao iz zaštićene odluke ili iz nezaštićene putanje na koju je posrednik mogao uticati. Kad to tako formulišete, većina incidenata se svodi na pitanje konfiguracije.

IKEv2 se ponaša drugačije, ali počiva na istoj ideji. Predlog se prenosi u razmjeni koja kasnije autentificira obje strane, pa middlebox koji prepisuje algoritme kvari autentikaciju umjesto da je usmjerava. Kontrolni kanal OpenVPN-a štiti svoj pregovor pomoću TLS-a i zatim taj kanal koristi za dogovor šifri podatkovnog kanala, zato je zanimljiv red upravo iz dnevnika kontrolnog kanala.

Konfigurisana kompatibilnost nije napad

Administrator može namjerno dopustiti starije izbore da podrži dokumentovanog klijenta, a ta odluka je vidljiva u konfiguraciji. Napadač ne može stvoriti takvu konfiguraciju; može samo iskoristiti putanju koja mu dopušto da utiče na ponudu.

Opasna popravka je ona koja uklanja dokaz razlike. Uključivanje svake naslijeđene opcije, isključivanje provjere certifikata ili prihvatanje bilo koje šifre da bi greška nestala širi ono na što će krajnja točka pristati, i uklanja provjere koje bi prijavile slabiji rezultat.

Ako morate zadržati jednu staru opciju, navedite razlog i klijenta u komentaru konfiguracije, pa ograničite opciju na profil kojem treba. Izuzeće za kompatibilnost ograničeno na jedan slušatelj je provjerljivo; ono primijenjeno globalno je samo slabiji zadani izbor koji se nitko ne sjeća da je odabrao.

Pročitajte neuspjeh prije nego što imenujete uzrok

Sačuvajte tačan niz greške, verzije klijenta i servera i vrijeme prije bilo kakve promjene. Zatim klasificirajte: da li su se strane razišle oko predloga, da li je putanja paketa zakazala ili je jedna strana odbila parametar koji je nekad prihvatala?

Neslaganje predloga obično imenuje problematične verzije ili algoritme i pada na istoj tački svaki put. Problem s rutiranjem ili MTU-om zastaje ili istekne, i često varira s mrežom. Istekao certifikat daje grešku provjere, a ne grešku pregovora.

Ništo od toga nije dokaz napadača. Dodjela zlonamjernog uzroka pri prvom neuspjehu je greška, jer skriva deterministički bug koji će sutra ponovo pasti.

Potvrdite što je zaista odabrano

Nakon svake ispravke pročitajte dogovoreni rezultat umjesto da vjerujete da se veza podigla. Veza koja uspije zato što je provjera uklonjena je ishod koji ste pokušavali izbjeći. Dvije komande ispod pokazuju odabranu verziju i šifru za krajnju točku s TLS-om, plus red kontrolnog kanala iz dnevnika servera 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

Uporedite rezultat s konfiguracijom koju ste namjeravali, a ne s onim što se sada povezuje. Ako je odabrana verzija starija od dopuštenog minimuma, profil ili lista vraćanja na staro su mjesto za traženje, a odgovor je popraviti tu listu, a ne proglasiti napad i obnoviti sve oko njega.

Povezani članci