Featured image of post فورک بمب چیست و چطور کار می‌کند؟

فورک بمب چیست و چطور کار می‌کند؟

اوایل که لینوکس نصب کرده بودم کامند هایی که توی فروم های مختلف می‌دیدم و برای من جدید بود را دوست داشتم یاد بگیرم و بدانم کار آنها چی هست، برای همین هر کامندی را که می‌دیدم در اولین فرصت داخل سیستم خودم اجرا می‌کردم. که خب کور کورانه اجرای هر کامندی اشتباهه بود. یکی از این کامند ها که اجرا کرده بودم، به اسم فورک بمب (fork bomb) شناخته می‌شود. کامند به این صورت هست

1
:(){ :|:& };:

اگر این کامند را اجرا کنید(امیدوارم تا الان نکرده باشید) تقریبا زیر یک دقیقه سیستم شما هنگ می‌کند و مجبور می‌شوید سیستم را ریبوت کنید.


توی این پست ساختار این کامند را تشریح می‌کنم و باهم کمی bash یاد می‌گیریم.

بیایید اول با مفهوم recustion آشنا بشیم، زمانی که یک قطعه کد خودش اجرا کند، recusion می‌گویم. مثلا شما یک فانکشن می‌نویسید به اسم fn و توی بدنه فانکشن فقط خود همین فانکشن را صدا می‌‌کنید، به این کار call recursion گفته می‌شود. فورک بمب دقیقا همین کار را می‌کند. به این معنی که خودش را دائم اجرا می‌کند!

به این فکر کنید که وقتی یک پراسس خودش را اجرا می‌کند ،مجدد پراسس های اجرا شده توسط اون هم دائم خودشان را اجرا می‌کنند، و دوباره هر پروسه‌ای که اجرا می‌شود بازم خودش را اجرا می‌کند و این روند تا زمانی که رم و پردازنده سیستم تحمل داشته باشد ادامه دارد.

درختی که می‌بینید را اجرای فورک بمب درنظر بگیرید، هر ستاره یک پروسه جدید است که توسط پروسه قبلی اجرا شده، و خودش هم دو پروسه جدید باز می‌کند و هر یک از پروسه ها هم همین روند را ادامه می‌دهند.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
*
├── *
   ├── *
      ├── *
         ├── *
            ├── *
            └── *
         └── *
             ├── *
             └── *    
      
      └── *
          └── *
              ├── *
                 ├── *
                 └── *
              └── *
                  ├── *
                  └── *    
   
   └── *
       ├── *
          ├── *
             ├── *
             └── *
          └── *
              ├── *
              └── *    
       
       └── *
           └── *
               ├── *
                  ├── *
                  └── *
               └── *
                   ├── *
                   └── *   

من برای اینکه سیستم‌ خودم هنگ نکند فورک بمب را روی داکر اجرا کردم و خب حتی یک ثانیه هم طول نکشید و آن کانتینر کاملا هنگ کرد.

قبل از اجرا forkbomb on docker

زمان اجرا forkbomb on docker


بیایید وارد کد بشیم، این علامت ها و کاراکتر ها چی هستند؟

اگه دقت کنید اولین کاراکتر فورک بمب، علامت : است. این علامت اسم فانکشن ما است. برخلاف قانون تعریف نام برای متغییر ها توی bash، می‌توانیم از کاراتر های یونیکد هم برای تعریف نام فانکشن استفاده کنیم، مثلا یک کاراکتر چینی یا حتی ایموجی!

1
2
3
(){ echo 'rain'; }

❤️(){ echo 'love'; }

خب در ادامه علامت های () را می‌بینیم، توی bash برای تعریف فانکشن قبل از اسم فانکشن هیچ کلمه کلیدی مثل fn, def, void و … نیاز نیست، فقط بجای آن باید بعد از اسم فانکشن پرانتز ها را بگذارید.

مثل خیلی از زبان های برنامه نویسی، بدنه فانکشن توی کرلی براکت تعریف می‌شود.

1
:(){}

پس تا اینجا ما یک فانکشن ساده با نام : تعریف کردیم.

داخل بدنه این فانکشن، اسمی که برای فانکشن قرار دادیم همان : را می‌نویسیم. با اینکار دقیقا call recursion را انجام دادیم، و باعث شدیم که برنامه خودش را توی هر اجرا مجدد اجرا کند.

1
:(){ : }

دقت کنید توی سینتکس bash حتما باید یک فاصله برای کدی که داخلی کرلی براکت می‌نویسم قرار بدیم

علامت | به اسم پایپ شناخته می‌شود، وظیفه این علامت دادن خروجی یک کامند بعنوان ورودی به یک کامند دیگر هست، حلا دقت کنید که ما خروجی اجرای : را به خودش می‌دهیم. دقیقا به این شکل

1
:(){ :|: }

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

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

& in bash

و بعد علامت ; را می‌بینیم. این علامت کامند ها را از هم جدا می‌کند. مثلا شما می‌توانید چند کامند مختلف را توی یک خط بنویسید. توی فورک بمب این علامت فانکشنی که تعریف کردین را از دستور بعدی(که اجرا کننده اون فانکشن هست)جدا می‌کند.

1
echo 'foo'; echo 'bar'; echo 'baz';

آخرین علامتی که توی فورک بمب داریم همون علامت : یا همون اسمی هست که برای فانکشن قرار دادیم. خیلی ساده توی bash برای اجرای یک فانکشن فقط اسم‌ش را می‌نویسیم.

و تمام! ما یاد گرفتیم چطور فورک بمب رو بنویسیم و دیگه نیاز نیست حفظ‌ش کنیم :)

1
:(){ :|:& };:
comments powered by Disqus
قدرت گرفته از Hugo
قالب Stack ساخته شده توسط Jimmy