Խոցելիություն, որը թույլ է տալիս առևանգել VPN թունելների միջոցով կատարված TCP կապերը

Հրատարակվել է հարձակման տեխնիկա (CVE-2019-14899), որը թույլ է տալիս փաթեթները կեղծել, փոփոխել կամ փոխարինել VPN թունելների միջոցով փոխանցվող TCP կապերում: Խնդիրն ազդում է Linux-ի, FreeBSD-ի, OpenBSD-ի, Android-ի, macOS-ի, iOS-ի և Unix-ի նման այլ համակարգերի վրա: Linux-ը IPv4-ի համար աջակցում է rp_filter (հակադարձ ուղու զտիչ) մեխանիզմին, այն «Խիստ» ռեժիմով միացնելը չեզոքացնում է այս խնդիրը:

Մեթոդը թույլ է տալիս փաթեթների փոխարինում TCP կապերի մակարդակով, որոնք անցնում են գաղտնագրված թունելի ներսում, բայց թույլ չի տալիս խրվել կապերի մեջ, որոնք օգտագործում են լրացուցիչ ծածկագրման շերտեր (օրինակ՝ TLS, HTTPS, SSH): VPN-ում օգտագործվող գաղտնագրման ալգորիթմները նշանակություն չունեն, քանի որ կեղծված փաթեթները գալիս են արտաքին ինտերֆեյսից և մշակվում են միջուկի կողմից որպես փաթեթներ VPN ինտերֆեյսից: Հարձակման ամենահավանական թիրախը չգաղտնագրված HTTP կապերին միջամտելն է, սակայն չի բացառվում և օգտագործելով հարձակում՝ DNS-ի պատասխանները շահարկելու համար:

Փաթեթների հաջող կեղծումը ցուցադրվել է OpenVPN-ի, WireGuard-ի և IKEv2/IPSec-ի միջոցով ստեղծված թունելների համար: Tor-ը ենթակա չէ խնդրին, քանի որ այն օգտագործում է SOCKS՝ երթևեկությունը փոխանցելու համար և կապված է loopback ինտերֆեյսի հետ: IPv4-ի համար հարձակումը հնարավոր է, եթե rp_filter-ը դրված է «Loose» ռեժիմի վրա (sysctl net.ipv4.conf.all.rp_filter = 2): Սկզբում համակարգերի մեծ մասն օգտագործում էր «Խիստ» ռեժիմը, բայց սկսած համակարգված 240, որը թողարկվել է անցյալ դեկտեմբերին, լռելյայն գործառնական ռեժիմը փոխվել է «Loose»-ի և այս փոփոխությունն արտացոլվել է Linux-ի բազմաթիվ բաշխումների լռելյայն կարգավորումներում։

rp_filter մեխանիզմ կիրառվում է Փաթեթների ուղիների լրացուցիչ ստուգման համար՝ սկզբնաղբյուր հասցեների կեղծումը կանխելու համար: Երբ սահմանվում է 0, աղբյուրի հասցեի ստուգում չի կատարվում, և ցանկացած փաթեթ կարող է փոխանցվել ցանցային միջերեսների միջև առանց սահմանափակումների: «Խիստ» ռեժիմ 1-ը ներառում է դրսից եկող յուրաքանչյուր փաթեթի ստուգում՝ երթուղղման աղյուսակին համապատասխանելու համար, և եթե ցանցային ինտերֆեյսը, որի միջոցով ստացվել է փաթեթը, կապված չէ պատասխանի առաքման օպտիմալ երթուղու հետ, ապա փաթեթը հանվում է: «Թուլացած» ռեժիմ 2-ը թուլացնում է ստուգումը, որպեսզի թույլ տա բեռի հավասարակշռող սարքերը կամ ասիմետրիկ երթուղին աշխատել, երբ
Արձագանքման երթուղին կարող է անցնել ցանցային ինտերֆեյսի միջով, բացի այն, որով մուտքային փաթեթը հասել է:

Loose ռեժիմում մուտքային փաթեթը ստուգվում է երթուղային աղյուսակի համեմատ, բայց համարվում է վավեր, եթե աղբյուրի հասցեն հասանելի է ցանկացած հասանելի ցանցային ինտերֆեյսի միջոցով: Առաջարկվող հարձակումը հիմնված է այն փաստի վրա, որ հարձակվողը կարող է ուղարկել փաթեթ՝ կեղծված աղբյուրի հասցեով, որը համապատասխանում է VPN ինտերֆեյսին, և չնայած այն հանգամանքին, որ այս փաթեթը համակարգ կմտնի արտաքին ցանցային ինտերֆեյսի և ոչ թե VPN-ի միջոցով, rp_filter «Չամրացված» ռեժիմը նման փաթեթը չի հեռացվի:

Հարձակումն իրականացնելու համար հարձակվողը պետք է վերահսկի այն դարպասը, որով օգտատերը մուտք է գործում ցանց (օրինակ՝ MITM կազմակերպության միջոցով, երբ զոհը միանում է հարձակվողի կողմից վերահսկվող անլար մուտքի կետին կամ երթուղիչի կոտրում) Վերահսկելով այն դարպասը, որի միջոցով օգտվողը միացված է ցանցին, հարձակվողը կարող է ուղարկել կեղծ փաթեթներ, որոնք կընկալվեն VPN ցանցի ինտերֆեյսի համատեքստում, սակայն պատասխանները կուղարկվեն թունելի միջով:

Ստեղծելով հորինված փաթեթների հոսք, որտեղ փոխարինված է VPN ինտերֆեյսի IP հասցեն, փորձ է արվում ազդել հաճախորդի կողմից հաստատված կապի վրա, սակայն այդ փաթեթների ազդեցությունը կարելի է դիտարկել միայն կապված կոդավորված երթևեկության հոսքի պասիվ վերլուծության միջոցով: թունելի շահագործման հետ։ Հարձակում իրականացնելու համար դուք պետք է պարզեք VPN սերվերի կողմից նշանակված թունելային ցանցի ինտերֆեյսի IP հասցեն, ինչպես նաև որոշեք, որ կոնկրետ հոսթի հետ կապը ներկայումս ակտիվ է թունելի միջոցով:

VPN վիրտուալ ցանցի ինտերֆեյսի IP-ն որոշելու համար SYN-ACK փաթեթներն ուղարկվում են զոհի համակարգ՝ հաջորդաբար թվարկելով վիրտուալ հասցեների ողջ տիրույթը (առաջին հերթին, VPN-ում օգտագործվող հասցեները թվարկվում են լռելյայն, օրինակ՝ OpenVPN): օգտագործում է 10.8.0.0/24 ենթացանցը): Հասցեի առկայությունը կարելի է դատել RST դրոշով պատասխան ստանալու հիման վրա:

Նմանապես որոշվում է որոշակի կայքի հետ կապի առկայությունը և հաճախորդի կողմից պորտի համարը. պորտի համարները տեսակավորելով՝ օգտվողին ուղարկվում է SYN փաթեթ՝ որպես սկզբնաղբյուր հասցե, որում IP. Կայքը փոխարինված է, և նպատակակետ հասցեն վիրտուալ IP VPN է: Սերվերի պորտը կարելի է կանխատեսել (80 HTTP-ի համար), իսկ հաճախորդի կողմից պորտի համարը կարող է հաշվարկվել կոպիտ ուժի միջոցով՝ տարբեր թվերի համար վերլուծելով ACK պատասխանների ինտենսիվության փոփոխությունը՝ RST-ի հետ փաթեթի բացակայության հետ միասին։ դրոշ.

Այս փուլում հարձակվողը գիտի կապի բոլոր չորս տարրերը (աղբյուրի IP հասցեներ/նավահանգիստ և նպատակակետ IP հասցե/պորտ), բայց որպեսզի ստեղծվի ֆիկտիվ փաթեթ, որը կընդունի զոհի համակարգը, հարձակվողը պետք է որոշի TCP հաջորդականությունը և ճանաչման համարներ (seq և ack) - կապեր: Այս պարամետրերը որոշելու համար հարձակվողը շարունակաբար ուղարկում է կեղծ RST փաթեթներ՝ փորձելով տարբեր հաջորդական թվեր, մինչև նա հայտնաբերի ACK պատասխան փաթեթը, որի ժամանումը ցույց է տալիս, որ համարը ընկնում է TCP պատուհանում:

Այնուհետև հարձակվողը պարզաբանում է սահմանման ճիշտությունը՝ ուղարկելով նույն թվով փաթեթներ և դիտելով ACK պատասխանների ժամանումը, որից հետո ընտրում է ընթացիկ հաջորդականության ճշգրիտ թիվը։ Խնդիրը բարդանում է նրանով, որ պատասխաններն ուղարկվում են գաղտնագրված թունելի ներսում, և դրանց առկայությունը խափանված երթևեկության հոսքում կարող է վերլուծվել միայն անուղղակի մեթոդներով: Արդյոք հաճախորդը ուղարկում է ACK փաթեթ՝ հասցեագրված VPN սերվերին, որոշվում է գաղտնագրված պատասխանների չափի և հետաձգման հիման վրա, որոնք կապված են կեղծված փաթեթների ուղարկման հետ: Օրինակ, OpenVPN-ի համար 79 կոդավորված փաթեթի չափը թույլ է տալիս ճշգրիտ դատել, որ ներսում կա ACK:

Մինչև հարձակման պաշտպանությունը չի ավելացվի օպերացիոն համակարգի միջուկին՝ որպես խնդրի արգելափակման ժամանակավոր մեթոդ առաջարկվում է օգտագործելով փաթեթային զտիչ «նախաուղղման» շղթայում, արգելափակեք այն փաթեթների անցումը, որոնցում որպես նպատակակետ նշված է թունելի վիրտուալ IP հասցեն:

iptables -t raw -I PREROUTING ! -i wg0 -d 10.182.12.8 -m addrtype ! --src տիպի LOCAL -j ԿԱԹԻԼ

կամ nftable-ների համար

nft ավելացնել սեղանի ip հում
nft add chain ip raw prerouting '{ type filter hook prerouting priority 0; }'
nft ավելացնել կանոն ip raw prerouting 'iifname != "wg0" ip daddr 10.182.12.8 fib saddr տեսակ != լոկալ անկում'

IPv4 հասցեներով թունելներ օգտագործելիս ինքներդ ձեզ պաշտպանելու համար պարզապես rp_filter-ը դրեք «Strict» ռեժիմի («sysctl net.ipv4.conf.all.rp_filter = 1»): VPN-ի կողմից հաջորդական թվերի հայտնաբերման մեթոդը կարող է արգելափակվել՝ գաղտնագրված փաթեթներին լրացում ավելացնելով, բոլոր փաթեթները դարձնելով նույն չափը:

Source: opennet.ru

Добавить комментарий