rünnaku tehnika (CVE-2019-14899), mis võimaldab asendada, muuta või sisestada pakette TCP-ühendustes, mida edastatakse VPN-tunnelite kaudu. Probleem mõjutab Linuxi, FreeBSD, OpenBSD, Androidi, macOS-i, iOS-i ja teisi Unix-taolisi süsteeme. Linux toetab rp_filter’i (reverse path filtering) mehhanismi IPv4 jaoks, mille sätmine 'Strict' režiimi neutraliseerib selle probleemi.
Meetod võimaldab pakettide asendamist TCP-ühenduste tasandil, mis läbivad krüpteeritud tunnelit, kuid ei võimalda siseneda ühendustesse, mis kasutavad täiendavaid krüpteerimiskihte (näiteks TLS, HTTPS, SSH). VPN-is kasutatavad krüpteerimisalgoritmid ei oma tähtsust, kuna vale paketid sisenevad välistelt liidestelt ja töötlev kernel neid kui VPN-liidese pakette. Rünnaku tõenäolisem siht on sekkumine dekrüpteeritud HTTP-ühendustesse, aga ja rünnaku kasutamine DNS-vastuste manipuleerimiseks.
Edukas pakettide asendamine on demonstreeritud tunnelite puhul, mis on loodud OpenVPN-i, WireGuard-i ja IKEv2/IPSec-i abil. Tor ei ole probleemile vastuvõtlik, kuna see kasutab SOCKS-i liikluse edastamiseks ja ühenduse sidumist loopback-liidesega. IPv4 puhul on rünnak võimalik, kui rp_filter muudetakse 'Loose' režiimi (sysctl net.ipv4.conf.all.rp_filter = 2). Enamikus süsteemides oli algselt kasutusel 'Strict' režiim, kuid alates , mis ilmus eelmisel kuul, on vaikimisi režiim asendatud 'Loose'-ga ja see muudatus on kajastunud paljude Linuxi distributsioonide vaikeseadetest.
rp_filter mehhanism pakettide edasiviimise teede täiendava kontrollimise jaoks, et vältida allika aadressi valeidentiteeti. Kui väärtus on seadistatud 0, siis allika aadressi kontrollimist ei tehta ja igasuguseid pakette saab piiramata edastada võrgu liideste vahel. Režiim 1 'Strict' lubab igat sisse tulevat paketti kontrollida marsruudi tabeliga, ja kui võrgu liides, mille kaudu pakett sai, ei ole seotud parima vastuse saatmise marsruudiga, siis pakett lükatakse tagasi. Režiim 2 'Loose' leevendab kontrolli, et lubada töö tegemist koormuse tasakaalustajate või asümmeetrilise marsruutimise korral, kus
vastuse marsruut võib kulgeda mitte läbi selle võrgu liidese, mille kaudu sisse tulnud pakett saabus.
Loose-režiimi korral kontrollitakse sissetulevat paketti marsruuditabeli järgi, kuid see loetakse lubatavaks, kui allika aadress on kergesti ligipääsetav läbi mõne olemasoleva võrgu liidese. Soovitatud rünnak põhineb eeldusel, et ründaja suudab saata paketi vale allika aadressiga, mis vastab VPN-liidesele, ning hoolimata sellest, et see pakett siseneb süsteemi läbi välise võrgu liidese, mitte VPN-i kaudu, ei kõrvaldata sellist paketti Loose-režiimis rp_filter.
Rünnaku sooritamiseks peab kurjategija kontrollima väärtuse, mille kaudu kasutaja internetti pääseb (näiteks läbi MITM-organisatsiooni, kui ohver on ühendatud ründaja kontrollitava traadita juurdepääsupunktiga või läbi ). Kontrollides väärtust, mille kaudu kasutaja on võrku ühendatud, saab ründaja saata vale pakette, mis tajutakse VPN-võrgu kontekstis, kuid vastused suunatakse läbi tunnel.
Vale pakettide voolu genereerimise teel, milles sisestatakse VPN-i liidese IP-aadress, proovivad nad mõjutada kliendi seadistatud ühendust, kuid nende pakettide mõju saab jälgida ainult passiivse analüüsi kaudu krüpteeritud liikluse voogude üle, mis on seotud tunneliga. Rünnaku viimiseks on vajalik teada, milline IP-aadress on määratud VPN-serveri poolt tunneliliidesele, ning tuvastada, et tunnelis on aktiivne ühendus konkreetse hostiga.
VPN-i virtuaalse võrgu liidese IP-aadressi määramiseks saadetakse ohvri süsteemile järjestikuseid SYN-ACK pakette, katsetades kõiki virtuaalsete aadresside vahemike järjestikku (esmajärjekorras testitakse aadresse, mida VPN-i vaikeseadistused kasutavad, näiteks OpenVPN-is kasutatakse alamvõrku 10.8.0.0/24). Aadressi olemasolu saab kindlaks teha vastuse saamise põhjal RST-lipuga.
Sama moodi määratakse kliendi poolel ühenduse olemasolu kindlaks teatud saidiga ja pordiga — portide numbreid proovides saadetakse kasutaja poole SYN-pakett, milles allika aadressiks on saidi IP ja sihtaadressiks virtuaalne VPN IP. Serveri pordi saab ennustada (80 HTTP jaoks), kuid kliendi poole pordi numbrit saab välja arvutada, analüüsides erinevate numbrite mõju ACK-vastuste intensiivsusele koos RST-flegiga paketi puudumisega.
Selle etappi ründaja teab kõiki nelja ühenduse elementi (allika IP aadress/port ja siht-IP aadress/port), kuid et genereerida vale pakett, mille süsteem sihtmärgiks võtab, peab ründaja määrama TCP-ühenduse järjestuse ja kinnituse numbrid (seq ja ack). Nende parameetrite määramisel saadab ründaja pidevalt vale RST-pakette, proovides erinevaid järjestuse numbreid, kuni ta saab kätte vastava ACK-paketi, mille saabumine näitab, et number mahub TCP aknasse.
Seejärel täpsustab ründaja oma määrangut, saates pakette sama numbriga ja jälgides ACK-vastuste saabumist, mille järel ta valib praeguse järjestuse täpse numbri. Ülesanne on keeruline, kuna vastused saadetakse krüpteeritud tunnelis ja nende olemasolu analüüsitakse püütud andmestructis ainult kaudsete meetoditega. Fakt, et klient saadab VPN-serveritele suunatud ACK-paketti, määratakse kindlaks krüpteeritud vastuste suuruse ja viivituse põhjal, mis korreleerub vale pakettide saatmisega. Näiteks OpenVPN jaoks võimaldab krüpteeritud pakett, mille suurus on 79, täpselt kindlaks teha, et sees on ACK-kinnitus.
Enne kui ründamise kaitse lisatakse operatsioonisüsteemi tuuma, on ajutise meetodina probleemide blokeerimiseks kasutada paketifiltrit „preroute“ ahelas, et blokeerida pakettide läbimine, mille sihtaadressiks on tunnelisse suunatud virtuaalne IP-aadress.
iptables -t raw -I PREROUTING ! -i wg0 -d 10.182.12.8 -m addrtype ! —src-type LOCAL -j DROP
või nftables'i puhul
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’
IPv4 aadresside tunnelite kasutamise kaitseks piisab rp_filter viimisest "Strict" režiimi ("sysctl net.ipv4.conf.all.rp_filter = 1"). VPN-poolt saab järjestuse numbrit blokeerida, lisades krüpteeritud pakettidele täiendavat täidist, mis muudab kõikide paketide suuruse ühtlaseks.
Allikas: opennet.ru
