Haavoittuvuus, joka mahdollistaa VPN-tunnelien kautta muodostettujen TCP-yhteyksien kaappaamisen

Julkaistu hyökkäystekniikka (CVE-2019-14899), joka mahdollistaa pakettien huijauksen, muokkaamisen tai korvaamisen VPN-tunneleiden kautta välitetyissä TCP-yhteyksissä. Ongelma koskee Linuxia, FreeBSD:tä, OpenBSD:tä, Androidia, macOS:ää, iOS:ää ja muita Unixin kaltaisia ​​järjestelmiä. Linux tukee IPv4:n rp_filter (käänteisen polun suodatus) -mekanismia, jonka käynnistäminen "tiukka"-tilassa neutraloi tämän ongelman.

Menetelmä sallii pakettien korvaamisen salatun tunnelin sisällä kulkevien TCP-yhteyksien tasolla, mutta ei salli kiilautumista yhteyksiin, jotka käyttävät ylimääräisiä salauskerroksia (esim. TLS, HTTPS, SSH). VPN:ssä käytetyillä salausalgoritmeilla ei ole väliä, koska väärennetyt paketit tulevat ulkoisesta rajapinnasta ja ydin käsittelee ne paketteina VPN-rajapinnasta. Hyökkäyksen todennäköisin kohde on häiritä salaamattomia HTTP-yhteyksiä, mutta ei poissuljettu ja hyökkäyksen käyttäminen DNS-vastausten manipuloimiseen.

Onnistunut pakettihuijaus on osoitettu tunneleille, jotka on luotu käyttämällä OpenVPN:tä, WireGuardia ja IKEv2/IPSec:tä. Tor ei ole herkkä ongelmalle, koska se käyttää SOCKSia välittämään liikennettä ja on sidottu takaisinkytkentäliittymään. IPv4:ssä hyökkäys on mahdollinen, jos rp_filter on asetettu Loose-tilaan (sysctl net.ipv4.conf.all.rp_filter = 2). Aluksi useimmat järjestelmät käyttivät "tiukkaa"-tilaa, mutta alkaen systemd 240, julkaistiin viime joulukuussa, oletuskäyttötilaksi muutettiin "Löysä", ja tämä muutos näkyi monien Linux-jakelujen oletusasetuksissa.

rp_filter -mekanismi sovellettu pakettipolkujen lisävarmentamiseen lähdeosoitteen huijauksen estämiseksi. Kun arvo on 0, lähdeosoitteen tarkistusta ei suoriteta ja mikä tahansa paketti voidaan välittää verkkoliitäntöjen välillä ilman rajoituksia. Tila 1 "tiukka" sisältää jokaisen ulkopuolelta tulevan paketin reititystaulukon mukaisuuden tarkistamisen, ja jos verkkoliitäntä, jonka kautta paketti vastaanotettiin, ei liity optimaaliseen vastauksen toimitusreittiin, paketti hylätään. Tila 2 "Löysä" rentouttaa tarkistusta, jotta kuormantasaajat tai epäsymmetrinen reititys voivat toimia silloin
Vastausreitti voi kulkea muun verkkorajapinnan kuin sen kautta, jonka kautta saapuva paketti saapui.

Loose-tilassa saapuva paketti tarkistetaan reititystaulukkoa vastaan, mutta sen katsotaan olevan kelvollinen, jos lähdeosoite on tavoitettavissa minkä tahansa käytettävissä olevan verkkoliitännän kautta. Ehdotettu hyökkäys perustuu siihen, että hyökkääjä voi lähettää paketin, jonka lähdeosoite vastaa VPN-rajapintaa, ja huolimatta siitä, että tämä paketti tulee järjestelmään ulkoisen verkkorajapinnan eikä VPN:n kautta, rp_filter “Löysä”-tilassa tällaista pakettia ei hylätä.

Hyökkäyksen suorittamiseksi hyökkääjän on ohjattava yhdyskäytävää, jonka kautta käyttäjä pääsee verkkoon (esimerkiksi MITM-organisaation kautta, kun uhri muodostaa yhteyden hyökkääjän ohjaamaan langattomaan tukiasemaan tai reitittimen hakkerointi). Hallitsemalla yhdyskäytävää, jonka kautta käyttäjä on yhteydessä verkkoon, hyökkääjä voi lähettää vääriä paketteja, jotka havaitaan VPN-verkkorajapinnan yhteydessä, mutta vastaukset reititetään tunnelin kautta.

Luomalla kuvitteellisia paketteja, joissa VPN-rajapinnan IP-osoite on korvattu, yritetään vaikuttaa asiakkaan muodostamaan yhteyteen, mutta näiden pakettien vaikutus voidaan havaita vain siihen liittyvän salatun liikennevirran passiivisen analyysin avulla. tunnelin toiminnan kanssa. Hyökkäyksen suorittamiseksi sinun on selvitettävä VPN-palvelimen määrittämän tunnelin verkkorajapinnan IP-osoite ja määritettävä myös, että yhteys tiettyyn isäntään on tällä hetkellä aktiivinen tunnelin kautta.

VPN-virtuaaliverkkorajapinnan IP:n määrittämiseksi uhrijärjestelmään lähetetään SYN-ACK-paketteja, jotka luettelevat peräkkäin koko virtuaaliosoitealueen (ensinkin VPN:ssä käytetyt osoitteet luetellaan oletusarvoisesti, esim. OpenVPN käyttää 10.8.0.0/24-aliverkkoa). Osoitteen olemassaolo voidaan arvioida RST-lipulla varustetun vastauksen vastaanottamisen perusteella.

Samalla tavalla määritetään yhteyden olemassaolo tiettyyn paikkaan ja portin numero asiakaspuolella - porttinumeroita lajittelemalla lähetetään käyttäjälle lähdeosoitteeksi SYN-paketti, jossa sivuston IP korvataan ja kohdeosoite on virtuaalinen IP VPN. Palvelimen portti voidaan ennustaa (80 HTTP:lle), ja asiakaspuolen portin numero voidaan laskea raa'alla voimalla, analysoimalla eri numeroille ACK-vastausten intensiteetin muutos yhdessä paketin puuttumisen kanssa RST:n kanssa. lippu.

Tässä vaiheessa hyökkääjä tietää kaikki neljä yhteyden elementtiä (lähde IP-osoitteet/portti ja kohde IP-osoite/portti), mutta luodakseen kuvitteellisen paketin, jonka uhrijärjestelmä hyväksyy, hyökkääjän on määritettävä TCP-sekvenssi ja kuittausnumerot (seq ja ack) - yhteydet. Näiden parametrien määrittämiseksi hyökkääjä lähettää jatkuvasti väärennettyjä RST-paketteja yrittäen eri järjestysnumeroita, kunnes hän havaitsee ACK-vastauspaketin, jonka saapuminen osoittaa, että numero osuu TCP-ikkunaan.

Seuraavaksi hyökkääjä selvittää määritelmän oikeellisuutta lähettämällä samanumeroisia paketteja ja tarkkailemalla ACK-vastausten saapumista, minkä jälkeen hän valitsee nykyisen sekvenssin tarkan numeron. Tehtävää vaikeuttaa se, että vastaukset lähetetään salatun tunnelin sisällä ja niiden läsnäoloa siepatussa liikennevirrassa voidaan analysoida vain epäsuorilla menetelmillä. Se, lähettääkö asiakas VPN-palvelimelle osoitetun ACK-paketin, määräytyy salattujen vastausten koon ja latenssin perusteella, jotka korreloivat väärennettyjen pakettien lähettämisen kanssa. Esimerkiksi OpenVPN:ssä salatun paketin koon 79 avulla voit arvioida tarkasti, että sisällä on ACK.

Kunnes hyökkäyssuojaus lisätään käyttöjärjestelmän ytimeen väliaikaisena tapana estää ongelma suositeltava käyttämällä pakettisuodatinta "preroute"-ketjussa, estä sellaisten pakettien kulku, joissa tunnelin virtuaalinen IP-osoite on määritetty kohdeosoitteeksi.

iptables -t raw -I PREROUTING ! -i wg0 -d 10.182.12.8 -m addrtype ! --src-type LOCAL -j DROP

tai nftablesille

nft add table ip raw
nft add chain ip raw prerouting ‘{ type filter hook prerouting priority 0; }'
nft add rule ip raw prerouting ‘iifname != “wg0” ip daddr 10.182.12.8 fib saddr type != local drop’

Suojaa itseäsi käyttäessäsi tunneleita IPv4-osoitteilla asettamalla rp_filter "tiukka"-tilaan ("sysctl net.ipv4.conf.all.rp_filter = 1"). VPN-puolella järjestysnumeron tunnistusmenetelmä voidaan estää lisäämällä ylimääräisiä täyttöjä salattuihin paketteihin, jolloin kaikki paketit ovat samankokoisia.

Lähde: opennet.ru

Lisää kommentti