آسیب‌پذیری که اجازه می‌دهد اتصالات TCP که از طریق تونل‌های VPN ایجاد می‌شوند ربوده شوند

منتشر شده یک تکنیک حمله (CVE-2019-14899) که به بسته ها اجازه جعل، اصلاح یا جایگزینی در اتصالات TCP ارسال شده از طریق تونل های VPN را می دهد. این مشکل بر لینوکس، FreeBSD، OpenBSD، Android، macOS، iOS و دیگر سیستم‌های شبه یونیکس تأثیر می‌گذارد. لینوکس از مکانیزم rp_filter (فیلتر کردن مسیر معکوس) برای IPv4 پشتیبانی می کند، روشن کردن آن در حالت "Strict" این مشکل را خنثی می کند.

این روش امکان جایگزینی بسته در سطح اتصالات TCP را می دهد که از داخل یک تونل رمزگذاری شده عبور می کنند، اما اجازه نمی دهد تا در اتصالاتی که از لایه های رمزگذاری اضافی استفاده می کنند (به عنوان مثال، TLS، HTTPS، SSH) استفاده شود. الگوریتم های رمزگذاری مورد استفاده در VPN اهمیتی ندارند، زیرا بسته های جعلی از رابط خارجی می آیند و توسط هسته به عنوان بسته هایی از رابط VPN پردازش می شوند. محتمل ترین هدف حمله، تداخل با اتصالات HTTP رمزگذاری نشده است، اما مستثنی نشده است و استفاده از حمله برای دستکاری پاسخ های DNS.

جعل بسته موفقیت آمیز برای تونل های ایجاد شده با استفاده از OpenVPN، WireGuard و IKEv2/IPSec نشان داده شده است. Tor مستعد این مشکل نیست، زیرا از SOCKS برای ارسال ترافیک استفاده می کند و به یک رابط حلقه بک متصل است. برای IPv4، اگر rp_filter روی حالت Loose تنظیم شده باشد، حمله ممکن است (sysctl net.ipv4.conf.all.rp_filter = 2). در ابتدا، بیشتر سیستم ها از حالت "سخت" استفاده می کردند، اما از آن شروع می شد systemd 240، که در دسامبر گذشته منتشر شد، حالت عملکرد پیش فرض به "Loose" تغییر یافت و این تغییر در تنظیمات پیش فرض بسیاری از توزیع های لینوکس منعکس شد.

مکانیزم rp_filter کاربردی برای تأیید بیشتر مسیرهای بسته برای جلوگیری از جعل آدرس منبع. هنگامی که روی 0 تنظیم می شود، هیچ بررسی آدرس منبع انجام نمی شود و هر بسته ای را می توان بدون محدودیت بین رابط های شبکه ارسال کرد. حالت 1 "Strict" شامل بررسی هر بسته ای است که از خارج می آید برای مطابقت با جدول مسیریابی، و اگر رابط شبکه ای که بسته از طریق آن دریافت شده است با مسیر تحویل پاسخ بهینه مرتبط نباشد، بسته کنار گذاشته می شود. حالت 2 "Loose" کنترل را آرام می کند تا به متعادل کننده های بار یا مسیریابی نامتقارن اجازه دهد زمانی که
مسیر پاسخ ممکن است از طریق یک رابط شبکه به غیر از رابطی که بسته دریافتی از طریق آن رسیده است عبور کند.

در حالت شل، یک بسته دریافتی در جدول مسیریابی بررسی می شود، اما اگر آدرس منبع از طریق هر رابط شبکه موجود قابل دسترسی باشد، معتبر تلقی می شود. حمله پیشنهادی بر این اساس است که مهاجم می تواند بسته ای را با یک آدرس منبع جعلی مربوط به رابط VPN ارسال کند و علیرغم اینکه این بسته از طریق رابط شبکه خارجی و نه از طریق VPN وارد سیستم می شود، در rp_filter حالت "Loose" چنین بسته ای دور انداخته نخواهد شد.

برای انجام یک حمله، مهاجم باید دروازه ای را که کاربر از طریق آن به شبکه دسترسی پیدا می کند، کنترل کند (به عنوان مثال، از طریق یک سازمان MITM، زمانی که قربانی به یک نقطه دسترسی بی سیم کنترل شده توسط مهاجم متصل می شود، یا از طریق هک روتر). با کنترل دروازه ای که کاربر از طریق آن به شبکه متصل می شود، مهاجم می تواند بسته های جعلی را ارسال کند که در زمینه رابط شبکه VPN درک می شوند، اما پاسخ ها از طریق تونل هدایت می شوند.

با تولید جریانی از بسته‌های ساختگی که در آن آدرس IP رابط VPN جایگزین می‌شود، تلاش می‌شود تا بر اتصال ایجاد شده توسط مشتری تأثیر بگذارد، اما تأثیر این بسته‌ها تنها از طریق تجزیه و تحلیل غیرفعال جریان ترافیک رمزگذاری‌شده مرتبط قابل مشاهده است. با بهره برداری از تونل برای انجام یک حمله، باید آدرس IP رابط شبکه تونل اختصاص داده شده توسط سرور VPN را پیدا کنید و همچنین تعیین کنید که اتصال به یک میزبان خاص در حال حاضر از طریق تونل فعال است.

برای تعیین IP رابط شبکه مجازی VPN، بسته های SYN-ACK به سیستم قربانی ارسال می شود و به طور متوالی کل محدوده آدرس های مجازی را شمارش می کند (اول از همه، آدرس های استفاده شده در VPN به طور پیش فرض شماره گذاری می شوند، به عنوان مثال، OpenVPN از زیر شبکه 10.8.0.0/24 استفاده می کند). وجود آدرس را می توان بر اساس دریافت پاسخ با پرچم RST قضاوت کرد.

به روشی مشابه، وجود اتصال به یک سایت خاص و شماره پورت در سمت مشتری تعیین می شود - با مرتب سازی شماره پورت ها، یک بسته SYN به عنوان آدرس منبع برای کاربر ارسال می شود که در آن سایت IP جایگزین شده است و آدرس مقصد یک IP مجازی مجازی است. پورت سرور را می توان پیش بینی کرد (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 DROP

یا برای nftables

nft ip جدول را به صورت خام اضافه کنید
nft add chain ip raw prerouting '{ type filter hook prerouting priority 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

اضافه کردن نظر