Հարձակման տեխնիկան (CVE-2019-14899), որը թույլ է տալիս փոխարինել, փոփոխել կամ տեղադրելով փաթեթներ TCP-հաշիվներում, որոնք փոխանցվում են VPN-թունելների միջով։ Նախաձեռնությունն ազդում է Linux, FreeBSD, OpenBSD, Android, macOS, iOS և այլ Unix-թերության համակարգերի վրա։ Linux աջակցում է rp_filter (հակադարձ ուղու զտման) մեխանիզմին IPv4-ի համար, իսկ դրա «Strict» ռեժիմը չեզոքացնում է այս խնդիրը։
Մեթոդը թույլ է տալիս իրականացնելու փաթեթների տեղադրումը TCP-հաշիվների մակարդակում, որոնք անցնում ենEncrypted tunnel-ի ներսում, սակայն չի թույլատրում միջամտել այն կապերի, որոնք օգտագործում են լրացուցիչ շերտեր էքսկրիպցիա (օրինակ, 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): Նախնական տարբերակները մեծամասնաբար կիրառել են «Strict» ռեժիմ, սակայն սկսած , որը թողարկվել է անցյալ տարվա դեկտեմբերին, աշխատանքի մեկինակը փոխվել է «Loose»-ի և այս փոփոխությունը անդրադարձել է բազմաթիվ Linux դիստրիբուտիվների լռելյայն կարգավորումներում։
rp_filter մեխանիզմը ավելորդ ստուգում է փաթեթների փոխանցման ուղիների համար՝ կանխելու աղբյուրի հասցեին խաբեությունը։ Եթե գինը 0-ի առկայությամբ խնդիրը չի ստուգվում, և որևէ փաթեթ կարող է անվերջ վերարտադրվել ցանցային ինտերֆեյսների միջև։ 1 «Strict» ռեժիմը ներառում է յուրաքանչյուրIncoming փաթեթի ստուգումը՝ համապատասխանելու համար ճեպի արագությանը, և եթե ցանցային ինտերֆեյսը, որով ստացվել է փաթեթ, չի կապված պատասխանելու օպտիմալ ուղուն, ապա փաթեթը մերժվում է։ 2 «Loose» ռեժիմը մեղմացնում է ստուգումը, որպեսզի թույլատրի աշխատանքը բալանսավորող սերվերների կամ ասիմետրիկ ուղեգծման դեպքում, որտեղ
պատասխանող ուղին կարող է չանցնել այն ցանցային ինտերֆեյսի միջով, որով անցել էIncoming փաթեթը։
«Loose» ռեժիմում մուտքային փաթեթը ստուգվում է երթուղման աղյուսակի համապատասխանելու համար, սակայն համարվում է օրինական, եթե աղբյուրի հասցեն հասանելի է ցանկացած առկա ցանցային ինտերֆեյսի միջոցով։ Առաջարկվող հարձակումը հիմնված է այն ամենի վրա, որ հարձակվողը կարող է ուղարկել աղբյուրի հասցեն փոխարինելով փաթեթ, որը համապատասխանում է VPN ինտերֆեյսին, եւ չնայած որ այդ փաթեթը հասնում է համակարգին դրսի ցանցային ինտերֆեյսի միջոցով, այլ ոչ թե VPN-ի միջոցով, rp_filter «Loose» ռեժիմում այդպիսի փաթեթը չի լինի տապալված։
Հարձակումը իրականացնելու համար հանցագործը պետք է վերահսկի այն шлюզը, որի միջոցով օգտատերը դուրս է գալիս ցանց՝ (օրինակ՝ MITM կազմակերպության միջոցով, երբ զոհը միանում է հարձակվողի կողմից վերահսկվող Wireless Access Point-ին կամու) Շլեզի վերահսկմամբ, որը միացված է ցանցին, հարձակվողը կարող է ուղարկել կեղծ փաթեթներ, որոնք կվերաբերվեն VPN ցանցային ինտերֆեյսի կոնտեքստում, սակայն պատասխանները կուղարկվեն туннելի միջոցով։
Կեղծ փաթեթների հոսք ստեղծելով, որտեղ տեղադրվում է VPN ինտերֆեյսի IP հասցեն, իրականացվում են փորձեր ազդելու հաճախորդի կողմից հաստատված կապի վրա, բայց այս փաթեթների ազդեցությունը կարելի է դիտել միայն կոդավորված տրաֆիկի հոսքի պասիվ վերլուծության միջոցով, որը կապված է туннելի գործունեության հետ։ Հարձակումը իրականացնելու համար անհրաժեշտ է իմանալ VPN-ի կողմից տրամադրված туннելի ցանցային ինտերֆեյսի IP հասցեն, ինչպես նաև սահմանել, որ այս պահին тунնելի միջոցով ակտիվ կապ կա որոշակի հոստի հետ։
VPN վիրտուալ ցանցային ինտերֆեյսի IP հասցեն սահմանելու համար զոհի համակարգին SYN-ACK փաթեթներ ուղարկելով իրականացվում է վիրտուալ հասցեների ամբողջ տեսականու հերթական պրենտի (առաջին հերթին զննվում են հասցեները, որոնք օգտագործվում են VPN-ով по умолчанию, օրինակ՝ OpenVPN-ում օգտագործվում է մաշկա 10.8.0.0/24): Արժեքի գոյության մասին կարելի է դատել դրական պատասխանների հիման վրա RST դրական դրոշի հետ։
Այդպիսով սահմանվում է որոշակի կայքի կոնտեքտի կապի առկայությունը, ինչպես նաեւ հաճախորդի կողմի պորտի համարը՝ հաճախորդի կողմ տեխնիկայի հետ SYN փաթեթ ուղարկելով, որտեղ որպես աղբյուրի հասցե տեղադրված է կայքի IP-ն, իսկ փաստացի հասցեն՝ վիրտուալ IP VPN-ին։ Ծառայության պորտը կարելի է կանխատեսել (80 HTTP-ի համար), իսկ հաճախորդի կողմի պորտի համարը կարելի է հաշվել ևս մեկ անգամ, վերլուծելով տարբեր թ.false-ների միջև ACK-ներգման ինտենսիվության փոփոխությունը՝ RST դրոշի փաթեթի բացակայության համընթաց։
Այս փուլում հարձակվողը գիտի լոկալ կապի բոլոր չորս տարրերը (IP հասցե/պորտ աղբյուրի և IP հասցե/պորտ նպատակակետի), սակայն ֆիքսված փաթեթ ստեղծելու համար, որը կվերաբերվի զոհի համակարգին, նրան անհրաժեշտ է որոշել TCP կապի հերթական և հաստատման համարները (seq և ack): Այս պարամետրերի որոշման համար հարձակվողը շարունակաբար ուղարկում է կեղծ RST փաթեթներ, փորձելով տարբեր հերթական համարներ, մինչև արձանագրում է ACK փաթեթի պատասխան, որի ընդունումը ցույց է տալիս, որ համարն ընկնում է TCP պատուհանում:
Հետագայում հարձակվողը ճշտում է ճիշտ ճանաչումը, ուղարկելով փաթեթներ նույն համարով և դիտելով ACK-պատասխանի ընդունումը, այնուհետև ճշգրտում է ընթացիկ հերթական համարը: Արաժեշտությունը բարդանում է նրանով, որ պատասխանները ուղարկվում են encrypted խողովակների մեջ, և նրանց առկայությունը intercepted տրաֆիկի հոսքում կարելի է վերլուծել միայն անուղղակի մեթոդներով: VPN սերվերին ուղղված ACK փաթեթի ուղարկման փաստը որոշվում է encrypted պատասխանների չափի և ուշացման հիման վրա, որոնք կոռելացված են կեղծ փաթեթների ուղարկման հետ: Օրինակ, OpenVPN-ի համար 79 չափի encrypted փաթեթը թույլ է տալիս հստակ եզրակացնել, որ ներսում կա ACK հաստատում:
Հետո, երբ հարձակմանը հակազդելու պաշտպանություն չի ավելացվել օպերացիոն համակարգի միջուկում, հարցի ժամանակավոր լուծումը փաթեթային ֆիլտրով արգելել փաթեթների անցումը, որտեղ որպես ծանոթող հասցե նշվել է թունելի վիրտուալ IP հասցեն:
iptables -t raw -I PREROUTING ! -i wg0 -d 10.182.12.8 -m addrtype ! —src-type LOCAL -j DROP
կամ nftables-ի համար
nft ավելացնել աղյուսակ ip raw
nft ավելացնել շղթա ip raw prerouting '{ type filter hook prerouting priority 0; }'
nft ավելացնել կանոն ip raw 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 կողմից հերթական համարը որոշելու մեթոդը կարող է արգելվել encrypted փաթեթներին լրացուցիչ լրացում ավելացնելով, որը բոլոր փաթեթների չափը նույնը լինելու համար:
Ընտանիք: opennet.ru
