منبع اصلی نوشتار زیر در این لینک قرار دارد

Fork bomb چیست

در سیستم عامل های یونیکسی، از فرخوانی سیستمی fork برای ایجاد یک فرایند جدید (child process) از یک فرایند دیگر (parent process) استفاده می شود. بطور مثال وقتی سیستم لینوکسی بوت (یا هر سیستم عامل یونیکسی دیگر) می شود، نخستین فرایندی که ایجاد می شود init با PID=1 است. سپس init بطور بطور مثال فرایند سرویس dhcp (در ماشین های سروری) یا فرایند سرویس ssh را ایجاد می کند که بطور مثال شناسه آن PID=1796 است. حال اگر کاربری بخواهد یک ارتباط ssh را استفاده کند، فرایند سرویس ssh با شناسه 1796 یک فرایند جدید، دقیقا مانند خود را توسط fork ایجاد می کند و یک شناسه منحصر به فرد و متفاوت با والد خودش بطور مثال PID=1806 را به آن می دهد و سپس آنرا در حافظه Load می کند.دقت کنید که وجه تمایز شناسه والد و شناسه های فرزند آن والد، در PID هایی است که سیستم به آنها اهدا می کند. فر فرایند نیاز به منابعی مانند : حافظه، پردازنده، فایل ها و غیره دارد و اگر یک فرایند تعداد بی حد و مرزی فرزند از خودش تولید کند، منابع سیستم دچار کمبود شده و باعث کند شدن یا از کار افتادن سیستم می شود و مواقعی پیش می آید که دیگر KILL کردن هم فایده ندارد و باید سیستم را دستی Restart کنیم. مفهوم Fork bomb به همین معناست که با نوشیتن کد مخربی باعث شویم یک فرایند ایجاد شده و بدون توقف نمونه هایی (فرزندانی) از خودش ایجاد کند تا اینکه سیستم از کار بی افتد. Fork bomb در تمامی سیستم های عامل (ویندوز/لینوکس/سولاریس/مکینتاش/بی اس دی ها و …) اتفاق می افتد و برای جلوگیری از آن می بایست دسترسی به منابع سیستم (منظور پردازنده است) را محدود کنیم. تصویر زیر بطور واضح مفهوم فراخوانی سیستمی  fork را نشان می دهد.

کد های زیر نمونه ای از Fork bomb نوشته شده برای پوسته Bash در سیستم عامل های مبتنی بر یونیکس (مانند لینوکس/سولاریس/بی اس دی ها و غیره) است. شاید با نگاه اول، کد زیر نامفهوم به نظر بیاید، اما کد زیر چیزی جز تعریف یک تابع در پوسته Bash نیست.

  • نام تابع : است که دستور های بدنه تابع میان دو آکولاد باز و بسته تعریف شده اند.
  • &:|: یعنی تابع بصورت بازگشتی تعریف شده است. توابع بازگشتی، توابعی هستند که خودشان را توسط نامشان، درون بدنه تعریف شان، صدا می زنند و طبق شرایطی از پیش تعریف شده (با رسیدن به آن شرایط)، خاتمه می یابند. اما در تابع بازگشتی شکل بالا، هیچ شرطی برای خاتمه وجود ندارد و به محض اجرای تابع با نام :، خود تابع درون بدنه خودش، دوباره خودش را صدا می زند (یک عمل fork) و سپس توسط | و Pipe کردن، دوباره خودش را صدا می زند. علامت & در انتهای خط : | :، یعنی این فرایند بازگشتی در Background اجرا شود. علامت ;، پایان تعریف تابع را مشخص می کند و سپس بعد از آن علامت :، تابع را فراخوانی می کند. توجه داشته باشید که، این یک تابع بودن آرگومان بوده و می دانید که در Bash (یا هر پوسته دیگر)، برای فراخوانی تابع، نام آنرا صدا می زنیم. علامت ; بصورت واضحتر بگوییم، برای جدا  کردن دو دستور استفاده می شود.

شکل زیر همان تابع بالا، ولی با نامگذاری قابل خواناتر است.

همانطور که گفته شد برای ایجاد کد مخرب Fork bomb وابسته به سیستم عامل، یا پوسته سیستم عامل مانند Bash در خط فرمان نیستیم. کد نوشته شده به زبان C در شکل زیر، در یک حلقه بی پایان (حلقه while همیشه True)، تابع فرخوان سیستمی fork را در یک توزیع لینوکسی، مکررا صدا (Call) می کند.

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



برچسب ها : , , , , , , , ,