یک تکنیک حمله (CVE-2019-14899) که اجازه میدهد بستهها جعل، اصلاح یا در اتصالات TCP که از طریق تونلهای VPN مسیریابی میشوند، قرار داده شوند. این مشکل بر ... تأثیر میگذارد. Linux، فریبیاسدی، اوپنبیاسدی، Android, macOS، iOS و دیگر سیستمهای شبه یونیکس. Linux از مکانیزم rp_filter (فیلترینگ مسیر معکوس) برای IPv4 پشتیبانی میکند، که وقتی در حالت "Strict" فعال شود، این مشکل را خنثی میکند.
این روش امکان جایگزینی بسته را در سطح اتصال 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)، حمله امکانپذیر است. در ابتدا، اکثر سیستمها از حالت "Strict" استفاده میکردند، اما با شروع از که دسامبر گذشته منتشر شد، حالت پیشفرض به «Loose» تغییر یافت و این تغییر در تنظیمات پیشفرض بسیاری از توزیعها منعکس شد. Linux.
مکانیزم rp_filter برای بررسی بیشتر مسیر بسته برای جلوگیری از جعل آدرس منبع. وقتی روی ۰ تنظیم شود، بررسی آدرس منبع غیرفعال میشود و هر بستهای میتواند بدون محدودیت بین رابطهای شبکه ارسال شود. حالت ۱، "دقیق"، بررسی هر بسته خارجی ورودی را در جدول مسیریابی فعال میکند و اگر رابط شبکهای که بسته از طریق آن دریافت شده است با یک مسیر تحویل پاسخ بهینه مرتبط نباشد، بسته حذف میشود. حالت ۲، "آزاد"، بررسی را آسان میکند تا هنگام استفاده از متعادلکنندههای بار یا مسیریابی نامتقارن، امکان عملیات فراهم شود، که در آن
مسیر پاسخ ممکن است از همان رابط شبکهای که بسته ورودی از طریق آن رسیده است، عبور نکند.
در حالت "Loose"، یک بسته ورودی با جدول مسیریابی بررسی میشود، اما اگر آدرس منبع از طریق هر رابط شبکه موجود قابل دسترسی باشد، معتبر در نظر گرفته میشود. حمله پیشنهادی بر این واقعیت استوار است که یک مهاجم میتواند بستهای را با آدرس منبع جعلی مربوط به یک رابط VPN ارسال کند. حتی اگر این بسته از طریق یک رابط شبکه خارجی و نه از طریق VPN وارد سیستم شود، حالت "Loose" rp_filter چنین بستهای را دور نمیریزد.
برای انجام یک حمله، مهاجم باید دروازهای را که کاربر از طریق آن به شبکه دسترسی پیدا میکند، کنترل کند (برای مثال، از طریق یک سازمان MITM، زمانی که قربانی به یک نقطه دسترسی بیسیم تحت کنترل مهاجم متصل میشود، یا از طریق با کنترل دروازهای که کاربر از طریق آن به شبکه متصل میشود، یک مهاجم میتواند بستههای جعلی ارسال کند که در متن رابط شبکه VPN ظاهر میشوند، اما پاسخها از طریق تونل هدایت میشوند.
با تولید جریانی از بستههای جعلی که آدرس IP رابط VPN را جعل میکنند، تلاشهایی برای تأثیرگذاری بر اتصال برقرار شدهی کلاینت انجام میشود. با این حال، تأثیر این بستهها تنها از طریق تجزیه و تحلیل غیرفعال جریان ترافیک رمزگذاری شده مرتبط با تونل قابل مشاهده است. برای انجام حمله، لازم است آدرس IP رابط شبکه تونل که توسط سرور VPN اختصاص داده شده است، به دست آید و مشخص شود که اتصال به یک میزبان خاص در حال حاضر از طریق تونل فعال است.
برای تعیین IP رابط شبکه مجازی VPN، بستههای SYN-ACK به سیستم قربانی ارسال میشوند و به ترتیب از کل محدوده آدرسهای مجازی عبور میکنند (اول از همه، آدرسهایی که به طور پیشفرض در VPN استفاده میشوند، جستجو میشوند، به عنوان مثال در OpenVPN زیرشبکه 10.8.0.0/24 استفاده میشود). وجود آدرس را میتوان بر اساس دریافت پاسخ با پرچم RST قضاوت کرد.
اتصال به یک سایت خاص و شماره پورت سمت کلاینت به روشی مشابه تعیین میشوند. یک بسته SYN با امتحان کردن شماره پورتهای مختلف، با آدرس IP سایت به عنوان آدرس مبدا و آدرس IP مجازی VPN به عنوان مقصد، به کاربر ارسال میشود. پورت سرور را میتوان پیشبینی کرد (80 برای HTTP)، و شماره پورت سمت کلاینت را میتوان با brute-forcing محاسبه کرد، که تغییر در نرخ پاسخ ACK را برای شمارههای مختلف، همراه با عدم وجود بستهای با پرچم RST، تجزیه و تحلیل میکند.
در این مرحله، مهاجم هر چهار عنصر اتصال (آدرس/پورت IP منبع و آدرس/پورت IP مقصد) را میداند، اما برای تولید یک بسته جعلی که توسط سیستم قربانی پذیرفته شود، مهاجم باید توالی اتصال TCP و شمارههای تأیید (seq و ack) را تعیین کند. برای تعیین این پارامترها، مهاجم به طور مداوم بستههای RST جعلی ارسال میکند و شمارههای توالی مختلف را امتحان میکند تا زمانی که یک بسته پاسخ ACK را شناسایی کند، که رسیدن آن نشان میدهد که شماره توالی در پنجره TCP قرار میگیرد.
سپس مهاجم با ارسال بستههایی با همان شماره و مشاهده پاسخهای ACK دریافتی، صحت تشخیص را تأیید میکند و پس از آن شماره توالی دقیق توالی فعلی را تعیین میکند. این کار با این واقعیت پیچیده میشود که پاسخها درون یک تونل رمزگذاری شده ارسال میشوند و حضور آنها در جریان ترافیک رهگیری شده فقط میتواند به طور غیرمستقیم تجزیه و تحلیل شود. اینکه آیا کلاینت یک بسته ACK به آدرس سرور VPN ارسال کرده است یا خیر، بر اساس اندازه و تأخیر پاسخهای رمزگذاری شده تعیین میشود که با ارسال بستههای جعلی مرتبط است. به عنوان مثال، برای OpenVPN یک بسته رمزگذاری شده با اندازه ۷۹ به ما این امکان را میدهد که به طور دقیق قضاوت کنیم که حاوی تأیید ACK است.
تا زمانی که محافظت در برابر حمله به هسته سیستم عامل اضافه شود، به عنوان یک روش موقت برای جلوگیری از مشکل با استفاده از یک فیلتر بسته در زنجیره "preroute"، عبور بستههایی را که در آنها آدرس IP مجازی تونل به عنوان آدرس مقصد مشخص شده است، مسدود کنید.
iptables -t raw -I PREROUTING ! -i wg0 -d 10.182.12.8 -m addrtype ! --src-type LOCAL -j DROP
یا برای nftables
nft جدول ip خام را اضافه کنید
nft اضافه کردن زنجیره ip خام پیش مسیریابی '{ نوع فیلتر قلاب پیش مسیریابی اولویت 0; }'
دستور nft add rule 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، روش تعیین شماره ترتیب را میتوان با اضافه کردن padding به بستههای رمزگذاری شده مسدود کرد و اندازه همه بستهها را یکسان کرد.
منبع: opennet.ru
