پینگ مرگ! FreeBSD باگ خراب در ابزار شبکه PlatoBlockchain Data Intelligence را برطرف می کند. جستجوی عمودی Ai.

پینگ مرگ! FreeBSD باگ crashtastic در ابزار شبکه را رفع می کند

یکی از اولین ابزارهای شبکه سطح پایین که هر کاربر کامپیوتری در مورد آن می آموزد، ارجمند است ping ابزار

این فرمان که برگرفته از جلوه صوتی همنام از هر صحنه فیلم جنگی قدیمی شامل زیردریایی ها است، یک پژواک استعاری است (ببینید ما در آنجا چه کار کردیم؟) از نسخه زیر آب رادار معروف به SONAR.

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

جالب است، با توجه به اینکه احتمالاً نام اختصاری TCP/IP را شنیده اید که به عنوان یک توصیف عمومی از چسب پروتکلی که اینترنت را قدرت می بخشد، استفاده می شود. ping از نظر فنی اصلاً از TCP/IP استفاده نمی کند.

در واقع TCP/IP کوتاه شده است پروتکل کنترل انتقال از طریق پروتکل اینترنت، و به مکانیزم نسبتاً سطح بالایی برای ارسال داده از طریق اینترنت اشاره دارد به گونه ای که خود شبکه بسیاری از موارد "آیا واقعاً به درستی کار کرد؟" را وارد می کند. تلاش برای شما

به عنوان مثال، در اتصالات TCP، هر تکه داده ای که ارسال می کنید تضمین می شود که دست نخورده به انتهای دیگر می رسد یا باعث ایجاد خطا می شود، بنابراین می دانید که آنها آن را انجام نداده اند.

علاوه بر این، حتی اگر تکه‌های داده مختلف در نهایت مسیرهای مختلفی را در اینترنت طی کنند (مثلاً به دلیل تعادل بار، قطع موقت یا سایر خطاهای قابل بازیابی)، و حتی اگر رسیدن برخی از تکه‌ها بیشتر از سایرین طول بکشد، داده‌های TCP به درستی بافر می‌شوند. بالا و در انتهای دیگر به ترتیب درست ارائه شده است.

پینگ متفاوت است

La ping با این حال، دستور معمولاً برای تأیید اینکه آیا رایانه‌ای که به آن علاقه دارید اصلاً آنلاین است یا نه، استفاده می‌شود، به خصوص اگر آن نوع اتصالات TCP سطح بالایی را که شما انتظار دارید، مانند دریافت ایمیل یا اجازه ورود به سیستم SSH را نمی‌پذیرد.

این به سرعت به شما کمک می کند تا تعیین کنید که آیا قطعی احتمال دارد به دلیل قطع شدن شبکه یا خود سرور باشد یا به دلیل عدم راه اندازی صحیح سرویس هایی که روی آن سرور اجرا می شوند.

به عنوان یک نتیجه، ping از پروتکل بسیار پایین تری نسبت به TCP استفاده می کند.

در واقع، ping حتی از UDP پسر عموی معمولی تر TCP، مخفف، استفاده نمی کند پروتوکل دیتاگرام کاربر، که راهی برای انتقال تکه های داده است که سریع و آسان است، اما عموماً به عنوان send-and-hope (یا اگر شما یک نوع بدبین هستید، به عنوان spray-and-pray) نامیده می شود.

خود UDP به شما اطلاع نمی‌دهد که آیا داده‌های شما به انتهای دیگر رسیده است یا خیر، و حتی اگر دست نخورده به دست بیاید، UDP ترتیب ارسال بسته‌های شما را در ابتدا پیگیری نمی‌کند، بنابراین نمی‌تواند آنها را دوباره مرتب کند. سر دیگر اگر آنها خارج از توالی به آنجا برسند.

Ping، برای آنچه ارزش دارد، از یک پروتکل با سطح بسیار پایین استفاده می کند، که به طور ویژه برای اهداف عیب یابی و پیکربندی مجدد شبکه طراحی شده است، به نام ICMP یا پروتکل پیام کنترل اینترنت.

معمولاً مستقیماً در هسته سیستم عامل مدیریت می شود، به طوری که بسته های ICMP/IP تقریباً مطمئن هستند که حتی اگر هیچ نرم افزار شبکه سطح بالاتری به درستی ارائه نشده باشد، ICMP شامل دو نوع پیام خاص است:

  • 0x08 را تایپ کنید. رسماً تماس گرفته شد ICMP Echo، این نوعی بسته معمولاً درخواست اکو نامیده می شود. این چیزی است که ping برنامه به منظور بررسی رایانه های فعال در شبکه ارسال می شود.
  • 0x00 را تایپ کنید. رسماً تماس گرفته شد ICMP Echo Reply، این نوع بسته است دقیقا همان چیزی که می گوید. رایانه‌ای که زنده، آنلاین است و برای مسدود کردن ترافیک ICMP Echo پیکربندی نشده است، قرار است این نوع بسته را مستقیماً به رایانه‌ای که آن را درخواست کرده است، ارسال کند.

مثل این:

$ ping -c 3 -p 4E414B45445345435552495459 nakedsecurity.sophos.com
الگو: 0x4e414b45445345435552495459
PING news-sophos.go-vip.net (192.0.66.227) 56 (84) بایت داده.
64 بایت از 192.0.66.227 (192.0.66.227): icmp_seq=1 ttl=53 time=84.0 ms
64 بایت از 192.0.66.227 (192.0.66.227): icmp_seq=2 ttl=53 time=85.1 ms
64 بایت از 192.0.66.227 (192.0.66.227): icmp_seq=3 ttl=53 time=84.8 ms

--- آمار پینگ news-sophos.go-vip.net ---
3 بسته ارسال شده، 3 بسته، 0% از دست دادن بسته، زمان 2004 میلی ثانیه
rtt min/avg/max/mdev = 84.025/84.644/85.062/0.446 ms

برای دیدن یک ping در عمل در سطح کمی پایین‌تر، از کد Lua که می‌توانید در انتهای مقاله بیابید برای ساختن یک بسته ICMP Echo از خودمان و خواندن پاسخی که در صورت وجود وجود دارد استفاده می‌کنیم:

$ sudo luax ping.lua nakedsecurity.sophos.com
ارسال درخواست ICMP ECHO به 192.0.66.227 -->
00000000 08 00 03 02 bb 5a 6f 1d 50 69 6e 67 52 65 71 75 |.....Zo.PingRequ|
00000010 65 73 74 4d 65 73 73 61 67 65 20 42 42 35 41 36 |estMessage BB5A6|
00000020 46 31 44 |F1D |
برگشتم-->
00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.|
00000010 XX XX XX XX 00 00 0b 02 bb 5a 6f 1d 50 69 6e 67 |.........Zo.Ping|
00000020 52 65 71 75 65 73 74 4d 65 73 73 61 67 65 20 42 |RequestMessage B|
00000030 42 35 41 36 46 31 44 |B5A6F1D |

اتفاقا ما نیاز به استفاده داشتیم sudo در بالا برای اجرای اسکریپت خود با امتیازات superuser، زیرا ما چیزی را ایجاد کردیم که به عنوان a شناخته می شود سوکت IP خام - قالبی که می تواند در هر قالبی که ما دوست داریم ساخته شود، از جمله TCP، UDP و، در صورت نیاز، ICMP.

در بسیاری از سیستم های لینوکس/یونیکس، ping فرمان ارائه شده توسط توزیع شما بدون اینکه به صراحت به آنها امتیاز داده شود کار می کند، معمولاً به این دلیل که با قابلیت های امنیتی خاص یا با آن نصب شده است. setuid مجموعه پرچم، به این معنی که با استفاده از یک حساب کاربری متفاوت از کاربری که آن را اجرا کرده است شروع می شود.

طراحی خوب ping البته برنامه‌ها پس از باز کردن سوکت خام مورد نیاز خود، به‌طور خودکار امتیازات اضافی خود را کنار می‌گذارند.

ما این کد حذف امتیاز را از اسکریپت نمونه خود حذف کردیم تا اختصار داشته باشیم. می توانید استفاده کنید posix.unistd.setpid() پس از ایجاد سوکت، اما قبل از ارسال یا دریافت هر گونه داده، به یک حساب کاربری غیرمجاز تغییر دهید.

بررسی پاسخ

همانطور که ممکن است در داده‌های اسکریپت بالا تشخیص دهید، عملکرد سوکت شبکه که برای بازخوانی داده‌ها از سرور پاسخ‌دهنده استفاده می‌کنیم، نه تنها داده‌های ICMP Echo Reply، بلکه IP سطح پایین (سرصفحه‌های پروتکل اینترنت) را نیز شامل می‌شود. در بسته اساسی

ما سعی نکرده ایم این داده ها را تجزیه یا پردازش کنیم، بلکه FreeBSD است ping برنامه باید این کار را انجام دهد تا بتواند پاسخ را درک کند، از جمله اینکه پیام های خطایی را که برمی گردند را معنی کند.

اگر ping به نحوی رد می‌شود، پاسخ Echo معمولاً نه تنها شامل سرصفحه‌های IP خودش (همانطور که در بالا دیده می‌شود) بلکه یک کپی مرجع از سرصفحه‌های IP و داده‌های ICMP که در درخواست خروجی اصلی ظاهر شده‌اند را نیز شامل می‌شود.

هدرهای بسته IPv4 معمولاً بسیار شبیه به آنچه در بالا می بینید، به نظر می رسند، جایی که هدر IP با آن شروع می شود 45 00 00 37... و در مجموع 20 بایت، تا بایت های نشان داده شده را شامل می شود ...XX XX XX XX، که آدرس IP لپ تاپ من است.

مثل این:

00000000 45 00 00 37 f6 af 00 00 35 01 94 7f c0 00 42 e3 |E..7....5.....B.|
00000010 XX XX XX XX |.... |

نسخه IP و طول سرصفحه: 0x45 (4 = IPv4، 5 = پنج کلمه 32 بیتی، یعنی 20 بایت
نوع سرویس و داده های تراکم: 0x00
طول کل بسته: 0x0037 (اعشار 55)
اطلاعات توالی: F6 AF 00 00
زمان برای زندگی (پرش سمت چپ): 0x35 (اعشار 53)
نوع پروتکل: 0x01 (ICMP)
جمع کنترل: 0x947F (اعشار 38015)
شماره IP رایانه ارسالی: C0 00 42 E3 (192.0.66.227 = nakedsecurity.sophos.com)
IP گیرنده (لپ تاپ من): XX XX XX XX (REDACTED = شماره IP خودم)

FreeBSD ping به نظر می رسد برنامه نویسان بر اساس آن مقدار طول سرصفحه در بایت اول، فرض می کردند که هدرهای این نوع در واقع، همیشه دقیقاً 20 بایت طول دارند. 0x45، نشان دهنده IPv4 (0x4?) با 5-DWORD (0x?5) یا هدر 20 بایتی.

با تنها 20 بایت برای نگرانی، برنامه نویسان بافرهایی با اندازه ثابت را روی پشته اختصاص دادند که در آن می توانستند یک کپی از هدرهای IP را در پاسخ نگه دارند، به علاوه هر سرصفحه IP تعبیه شده از درخواست اصلی، در صورت وجود شرایط خطایی برای رسیدگی. .

می توانید حدس بزنید که این به کجا می رود.

اولین بایت در هدر IPv4 از نظر قانونی می تواند هر مقداری از آن داشته باشد 0x45 (حداقل اندازه هدر 5 DWORD یا 20 بایت، همانطور که نشان داده شده است) تا 0x4F (نشان دهنده 15 DWORD است، زیرا 0xF 15 اعشاری یا در کل 60 بایت داده هدر است)، بنابراین به طور منظم اجازه می دهد تا 40 بایت داده هدر اضافی اختیاری شود.

این بایت‌های هدر نادر، اما قانونی را می‌توان برای «ویژگی‌های» مختلف عجیب و غریب و غیرعادی با نام‌های کنجکاو استفاده کرد. پخش انتخابی کارگردانی شده, کنترل جریان تجربی و بسته چندپخشی بالادست - چیزهایی که ما درباره آنها شنیده ایم اما هرگز آگاهانه استفاده نکرده ایم یا حتی ندیده ایم.

مراقب مجرمان سایبری باشید که شما را در معرض آزمایش قرار می دهند

همانطور که می توانید تصور کنید، با توجه به اینکه این فیلدهای اضافی تقریباً هرگز استفاده نمی شوند، ممکن است هرگز یک بسته IPv4 را با چیزی غیر از 0x45 در ابتدا و در مجموع با 20 بایت داده هدر، مگر اینکه با مجرمان سایبری روبرو شده باشید که آماده آزمایش شما هستند.

متأسفانه، نمی‌توان مانع از تقلب کردن سروری توسط مهاجم شود که حدس می‌زند آیا شما از FreeBSD استفاده می‌کنید یا خیر، و عمدا بسته‌های بزرگ ICMP/IP Echo Reply تولید می‌کند تا باعث تحریک یک سرور شود. سرریز بافر پشته درون خود ping برنامه است.

اگر تا به حال بررسی کنید که آیا سرور آنها فعال است (که حتی ممکن است انجام دهید، یا شاید به خصوص، اگر فکر می کنید مشکوک است!)، ممکن است با یک پاسخ به دام انفجاری هدف قرار بگیرید.

در بهترین حالت، شما ping برنامه خراب می شود؛ با این حال، در بدترین حالت، همانطور که مشاوره امنیتی FreeBSD سخاوتمندانه اذعان می کند، "ممکن است یک میزبان مخرب اجرای کد از راه دور را در پینگ راه اندازی کند."

خوشبختانه، همانطور که نویسندگان FreeBSD نیز هستند اشاره کن, «فرآیند پینگ در یک سندباکس حالت قابلیت روی همه نسخه‌های تحت تأثیر FreeBSD اجرا می‌شود و بنابراین در نحوه تعامل با بقیه سیستم در نقطه‌ای که ممکن است باگ رخ دهد بسیار محدود است.»

به عبارت دیگر، شما قطعا نیاز به وصله دارید، اما خطرات را می توان متوسط ​​در نظر گرفت.

به ویژه ، ping برنامه نه تنها در یک جعبه شنی قفل شده است، بلکه همانطور که در توصیه امنیتی تأیید شده است، هنگامی که به کد باگ رسید، به عنوان روت اجرا نمی شود: "چه زمانی ping اجرا می شود، سوکت خام مورد نیاز برای انجام کار خود را ایجاد می کند و سپس امتیازات بالاتر خود را لغو می کند.

همانطور که در بالا توضیح داده شد، قدرت های ابرکاربر فقط برای به دست آوردن یک سوکت IP خام از سیستم عامل مورد نیاز است، نه برای استفاده از sendto() و recvfrom() پس از آن روی آن سوکت کار می کند.

این باگ شناسه رسمی داده شده است CVE-2022-23093; در مشاوره امنیتی مستند شده است FreeBSD-SA-22:15.ping.

چه کاری انجام دهید؟

  • اگر کاربر FreeBSD هستید، به سادگی نسخه های آسیب دیده (FreeBSD 12 و FreeBSD 13) را به آخرین نسخه های خود به روز کنید، جایی که این اشکال برطرف شده است.
  • اگر برنامه نویس شبکه هستید، همیشه اطمینان حاصل کنید که سرصفحه های بسته را در نظر گرفته اید که می تواند تغییرات اندازه غیرعادی را نشان دهد. این واقعیت که شما هرگز هیچ گونه تغییری را ندیده اید، مانع از آن نمی شود که فردا با بسته ای غیرعادی و در عین حال کاملاً قانونی روبرو شوید.
  • اگر مدیر شبکه هستید، بسته های IPv4 را با هدرهای IP که 20 بایت نیستند مسدود کنید. اگر واقعاً به نظر می رسد باید به برخی از محصولات نرم افزاری اجازه دهید از گزینه های هدر IPv4 غیرعادی استفاده کنند، آن بسته های غیرمعمول را ثبت کنید تا دلیل آن را بدانید.

مراقب اونجا باش!


کد مثال برای نشان دادن ترافیک پینگ


تمبر زمان:

بیشتر از امنیت برهنه