Sårbarhet som gör att TCP-anslutningar som görs genom VPN-tunnlar kan kapas

Publicerad en attackteknik (CVE-2019-14899) som gör att paket kan förfalskas, modifieras eller ersättas i TCP-anslutningar som vidarebefordras via VPN-tunnlar. Problemet påverkar Linux, FreeBSD, OpenBSD, Android, macOS, iOS och andra Unix-liknande system. Linux stöder mekanismen rp_filter (omvänd sökvägsfiltrering) för IPv4, att slå på den i "Strikt"-läge neutraliserar detta problem.

Metoden tillåter paketersättning på nivån för TCP-anslutningar som passerar in i en krypterad tunnel, men tillåter inte inkiling i anslutningar som använder ytterligare krypteringslager (till exempel TLS, HTTPS, SSH). Krypteringsalgoritmerna som används i VPN spelar ingen roll, eftersom de falska paketen kommer från det externa gränssnittet och bearbetas av kärnan som paket från VPN-gränssnittet. Det mest troliga målet för attacken är att störa okrypterade HTTP-anslutningar, men inte utesluten och använda en attack för att manipulera DNS-svar.

Framgångsrik paketförfalskning har demonstrerats för tunnlar skapade med OpenVPN, WireGuard och IKEv2/IPSec. Tor är inte mottaglig för problemet, eftersom den använder SOCKS för att vidarebefordra trafik och är bunden till ett loopback-gränssnitt. För IPv4 är en attack möjlig om rp_filter är inställt på "Loose"-läge (sysctl net.ipv4.conf.all.rp_filter = 2). Inledningsvis använde de flesta system läget "Strikt", men med början från systemd 240, som släpptes i december förra året, ändrades standarddriftläget till "Loose" och denna förändring återspeglades i standardinställningarna för många Linux-distributioner.

rp_filter mekanism applicerad för ytterligare verifiering av paketsökvägar för att förhindra förfalskning av källadress. När den är inställd på 0 utförs ingen källadresskontroll och alla paket kan vidarebefordras mellan nätverksgränssnitt utan begränsningar. Läge 1 "Strikt" inkluderar att kontrollera varje paket som kommer utifrån för överensstämmelse med routingtabellen, och om nätverksgränssnittet genom vilket paketet togs emot inte är associerat med den optimala svarsleveransvägen, så kasseras paketet. Läge 2 "Lös" släpper på kontrollen för att tillåta lastbalanserare eller asymmetrisk routing att fungera när
Svarsvägen kan passera genom ett annat nätverksgränssnitt än det genom vilket det inkommande paketet anlände.

I löst läge kontrolleras ett inkommande paket mot routingtabellen, men anses vara giltigt om källadressen kan nås via vilket tillgängligt nätverksgränssnitt som helst. Den föreslagna attacken är baserad på det faktum att angriparen kan skicka ett paket med en falsk källadress som motsvarar VPN-gränssnittet, och trots att detta paket kommer in i systemet via det externa nätverksgränssnittet och inte via VPN, i rp_filter “Loose”-läge ett sådant paket kommer inte att kasseras.

För att utföra en attack måste angriparen kontrollera gatewayen genom vilken användaren kommer åt nätverket (till exempel genom en MITM-organisation, när offret ansluter till en angriparkontrollerad trådlös åtkomstpunkt, eller via routerhackning). Genom att kontrollera gatewayen genom vilken en användare är ansluten till nätverket kan en angripare skicka falska paket som kommer att uppfattas i sammanhanget av VPN-nätverksgränssnittet, men svaren kommer att dirigeras genom tunneln.

Genom att generera en ström av fiktiva paket där IP-adressen för VPN-gränssnittet ersätts, görs försök att påverka anslutningen som upprättats av klienten, men påverkan av dessa paket kan endast observeras genom passiv analys av det krypterade trafikflödet som är associerat med driften av tunneln. För att utföra en attack måste du ta reda på IP-adressen för tunnelnätverkets gränssnitt som tilldelas av VPN-servern, och även fastställa att en anslutning till en specifik värd för närvarande är aktiv genom tunneln.

För att bestämma IP-adressen för det virtuella VPN-nätverkets gränssnitt skickas SYN-ACK-paket till offersystemet och räknar upp hela intervallet av virtuella adresser sekventiellt (först av allt är adresserna som används i VPN uppräknade som standard, till exempel OpenVPN använder undernätet 10.8.0.0/24). Förekomsten av en adress kan bedömas baserat på mottagandet av ett svar med RST-flaggan.

På liknande sätt bestäms närvaron av en anslutning till en viss plats och portnumret på klientsidan - genom att sortera igenom portnumren skickas ett SYN-paket till användaren, som källadress, där webbplatsens IP ersätts och destinationsadressen är en virtuell IP VPN. Serverporten kan förutsägas (80 för HTTP), och portnumret på klientsidan kan beräknas med brute force, analysera för olika nummer förändringen i intensiteten av ACK-svar i kombination med frånvaron av ett paket med RST:n flagga.

I detta skede känner angriparen till alla fyra delar av anslutningen (källa IP-adresser/port och destinations IP-adress/port), men för att generera ett fiktivt paket som offrets system kommer att acceptera måste angriparen bestämma TCP-sekvensen och bekräftelsenummer (seq och ack) - anslutningar. För att fastställa dessa parametrar skickar angriparen kontinuerligt falska RST-paket, försöker olika sekvensnummer, tills han upptäcker ett ACK-svarspaket, vars ankomst indikerar att numret faller inom TCP-fönstret.

Därefter klargör angriparen definitionens korrekthet genom att skicka paket med samma nummer och observera ankomsten av ACK-svar, varefter han väljer det exakta numret för den aktuella sekvensen. Uppgiften kompliceras av det faktum att svar skickas in i en krypterad tunnel och deras närvaro i den avlyssnade trafikströmmen kan endast analyseras med indirekta metoder. Huruvida en klient skickar ett ACK-paket adresserat till VPN-servern bestäms baserat på storleken och fördröjningen av de krypterade svaren, som korrelerar med sändningen av falska paket. Till exempel, för OpenVPN, låter en krypterad paketstorlek på 79 dig korrekt bedöma att det finns en ACK inuti.

Tills attackskydd läggs till i operativsystemets kärna som en tillfällig metod för att blockera problemet rekommenderad med hjälp av ett paketfilter i "preroute"-kedjan, blockera passagen av paket där den virtuella IP-adressen för tunneln anges som destinationsadress.

iptables -t raw -I PREROUTING ! -i wg0 -d 10.182.12.8 -m adresstyp ! --src-typ LOKAL -j DROPPA

eller för nftables

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

För att skydda dig själv när du använder tunnlar med IPv4-adresser, ställ bara in rp_filter på "Strikt" läge ("sysctl net.ipv4.conf.all.rp_filter = 1"). På VPN-sidan kan sekvensnummerdetektionsmetoden blockeras genom att lägga till extra utfyllnad till de krypterade paketen, vilket gör att alla paket blir lika stora.

Källa: opennet.ru

Lägg en kommentar