Уразлівасць, якая дазваляе ўкліньвацца ў TCP-злучэнні, якія здзяйсняюцца праз VPN-тунэлі

Апублікавана тэхніка атакі (CVE-2019-14899), якая дазваляе падмяніць, змяніць або падставіць пакеты ў TCP-злучэнні, якія пракідваюцца праз VPN-тунэлі. Праблема закранае Linux, FreeBSD, OpenBSD, Android, macOS, iOS і іншыя Unix-падобныя сістэмы. Linux падтрымлівае механізм rp_filter (reverse path filtering) для IPv4, уключэнне якога ў рэжым "Strict" нейтралізуе дадзеную праблему.

Метад дазваляе ажыццявіць падстаноўку пакетаў на ўзроўні TCP-злучэнняў, якія праходзяць усярэдзіне шыфраванага тунэля, але не дазваляе ўкліньвацца ў злучэнні, якія ўжываюць дадатковыя пласты шыфравання (напрыклад, TLS, HTTPS, SSH). Ужывальныя ў VPN алгарытмы шыфравання не маюць значэнні, бо падробленыя пакеты паступаюць з вонкавага інтэрфейсу, а апрацоўваюцца ядром як пакеты з VPN-інтэрфейсу. Найбольш верагоднай мэтай атакі з'яўляецца ўмяшанне ў незашыфраваныя злучэнні HTTP, але не выключаецца і выкарыстанне нападу для маніпуляцыі з адказамі DNS.

Паспяховая падмена пакетаў прадэманстравана для тунэляў, якiя ствараюцца пры дапамозе OpenVPN, WireGuard і IKEv2/IPSec.Tor праблеме не схільны, так як выкарыстоўвае SOCKS для пракіду трафіку і прывязку да loopback-інтэрфейсу. Для IPv4 атака магчыма ў выпадку пераводу rp_filter у рэжым «Loose» (sysctl net.ipv4.conf.all.rp_filter = 2). Першапачаткова ў большасці сістэм ужываўся рэжым "Strict", але пачынальна з Systemd 240, выпушчанага ў снежні мінулага гады, рэжым працы па змаўчанні быў заменены на "Loose" і дадзеная змена адбілася ў наладах па змаўчанні шматлікіх дыстрыбутываў Linux.

Механізм rp_filter ўжываецца для дадатковай праверкі шляхоў праходжання пакетаў для прадухілення спуфінгу адрасы крыніцы. Пры ўсталёўцы ў значэнне 0 праверка адраса крыніцы не робіцца і любы пакет можа без абмежаванняў перанакіроўвацца паміж сеткавымі інтэрфейсамі. Рэжым 1 "Strict" уключае праверку кожнага прыходнага звонку пакета на адпаведнасць табліцы маршрутызацыі, і калі сеткавы інтэрфейс, праз які быў атрыманы пакет, не злучаны з аптымальным маршрутам дастаўкі адказу, то пакет адкідаецца. Рэжым 2 "Loose" змякчае праверку, каб дапусціць працу пры ўжыванні балансавальнікаў нагрузкі або асіметрычнай маршрутызацыі, пры якой
маршрут адказу можа праходзіць не праз той сеткавы інтэрфейс, праз які паступіў уваходны пакет.

У рэжыме «Loose» уваходны пакет правяраецца на адпаведнасць табліцы маршрутызацыі, але лічыцца дапушчальным, калі адрас крыніцы дасягальны праз любы наяўны сеткавы інтэрфейс. Прапанаваны напад будуецца на тым, што атакавалы можа адправіць пакет з падмененым адрасам крыніцы, які адпавядае інтэрфейсу VPN, і нягледзячы на ​​тое, што дадзены пакет паступіць у сістэму праз вонкавы сеткавы інтэрфейс, а не праз VPN, у рэжыме rp_filter «Loose» такі пакет не будзе адкінуты.

Для здзяйснення нападу зламыснік павінен кантраляваць шлюз, праз які карыстач выходзіць у сетку (напрыклад, праз арганізацыю MITM, пры падлучэнні ахвяры да кантраляванай атакавалым кропкі бесправаднога доступу або праз узлом маршрутызатара). Кантралюючы шлюз, праз які падлучаны да сеткі карыстач, атакавалы можа адпраўляць фіктыўныя пакеты, якія будуць успрымацца ў кантэксце сеткавага інтэрфейсу VPN, але адказы будуць накіроўвацца праз тунэль.

Шляхам генерацыі струменя фіктыўных пакетаў, у якіх падстаўляецца IP-адрас інтэрфейсу VPN, ажыццяўляюцца спробы паўплываць на ўсталяванае кліентам злучэнне, але назіраць за ўплывам гэтых пакетаў можна толькі праз пасіўны аналіз за шыфраваным струменем трафіку, злучаным з працай тунэля. Для правядзення нападу неабходна пазнаць прызначаны VPN-серверам IP-адрас сеткавага інтэрфейсу тунэля, а таксама вызначыць, што ў дадзены момант праз тунэль актыўна злучэнне да вызначанага хаста.

Для вызначэння IP віртуальнага сеткавага інтэрфейсу VPN выкарыстоўваецца адпраўка на сістэму ахвяры SYN-ACK пакетаў, паслядоўна перабіраючы ўвесь дыяпазон віртуальных адрасоў (у першую чаргу перабіраюцца адрасы, выкарыстоўваныя ў VPN па змаўчанні, напрыклад у OpenVPN выкарыстоўваецца падсетка 10.8.0.0/24). Аб існаванні адраса можна меркаваць на аснове паступлення адказу са сцягам RST.

Аналагічнай выявай вызначаецца наяўнасць злучэння з вызначаным сайтам і нумар порта на боку кліента - перабіраючы нумары портаў у бок карыстача адпраўляецца SYN-пакет, у якасці адрасу крыніцы, у якім падстаўлены IP сайта, а адрасы прызначэння віртуальны IP VPN. Серверны порт можна прадбачыць (80 для HTTP), а нумар порта на боку кліента можна вылічыць пераборам, аналізуючы для розных нумароў змена інтэнсіўнасці ACK-адказаў у спалучэнні з адсутнасцю пакета са сцягам RST.

На дадзеным этапе атакавалы ведае ўсе чатыры элементы злучэння (адрасы/порт IP крыніцы і адрас/порт IP прызначэння), але для таго, каб згенераваць фіктыўны пакет, які ўспрыме сістэма ахвяры, атакавалы павінен вызначыць нумары паслядоўнасці і пацверджанні (seq і ack) TCP -злучэнні. Для вызначэння дадзеных параметраў атакавалы бесперапынна адпраўляе падробленыя RST-пакеты, перабіраючы розныя нумары паслядоўнасці, датуль, пакуль не зафіксуе зваротны ACK-пакет, паступленне якога паказвае, што нумар пападае ў акно TCP.

Далей атакавалы ўдакладняе правільнасць вызначэння адпраўкай пакетаў з тым жа нумарам і назіраючы за паступленнем ACK-адказаў, пасля чаго падбірае дакладны нумар бягучай паслядоўнасці. Задача ўскладнена тым, што адказы адпраўляюцца ўнутры шыфраванага тунэля і аналізаваць іх наяўнасць у перахапляемай патоку трафіку можна толькі ўскоснымі метадамі. Факт адпраўкі адрасаванага VPN-серверу ACK-пакета кліентам вызначаецца на аснове памеру і затрымкі шыфраваных адказаў, якія карэлююць з адпраўкай падробленых пакетаў. Напрыклад, для OpenVPN шыфраваны пакет з памерам 79 дазваляе сапраўды судзіць, што ўсярэдзіне ўтрымоўваецца ACK-пацверджанне.

Да таго, як абарона ад нападу будзе дададзеная ў ядро ​​аперацыйнай сістэмы, у якасці часавага метаду блакавання праблемы. рэкамендуецца пры дапамозе пакетнага фільтра ў ланцужку «preroute» блакаваць праходжанне пакетаў, у якіх у якасці адраса прызначэння паказаны віртуальны IP-адрас тунэля.

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

ці для nftables

nft add table ip raw
nft add chain ip raw prerouting '{ type filter hook prerouting priority 0; }'
nft add ip ruw prerouting 'iifname != "wg0" ip daddr 10.182.12.8 fib saddr type != local drop'

Для абароны пры выкарыстанні тунэляў з адрасамі IPv4 дастаткова перавесці rp_filter у рэжым "Strict" ("sysctl net.ipv4.conf.all.rp_filter = 1"). З боку VPN метад вызначэння нумара паслядоўнасці можа быць блакіраваны шляхам дадання да зашыфраваных пакетаў дадатковага запаўнення, які робіць памер усіх пакетаў аднолькавым.

Крыніца: opennet.ru

Дадаць каментар