Fuzzing چیست؟

چه چیزی مبهم است

مقدمه: Fuzzing چیست؟

در سال 2014، هکرهای چینی به سیستم های بهداشت جامعه هک شده است، یک بیمارستان زنجیره ای انتفاعی ایالات متحده، و اطلاعات 4.5 میلیون بیمار را به سرقت برد. هکرها از یک باگ به نام Heartbleed که چند ماه قبل از هک در کتابخانه رمزنگاری OpenSSL کشف شده بود، سوء استفاده کردند.

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

اینجاست که «فوز کردن» وارد می شود.

حمله فازی چیست؟

Fuzzing، Fuzz Testing یا Fuzzing Attack یک تکنیک تست نرم افزار خودکار است که برای تغذیه داده های تصادفی، غیرمنتظره یا نامعتبر (به نام fuzz) به یک برنامه استفاده می شود. این برنامه برای رفتارهای غیرمعمول یا غیرمنتظره مانند سرریز شدن بافر، خرابی، نشت حافظه، قطع شدن رشته، و نقض دسترسی خواندن/نوشتن نظارت می شود. سپس از ابزار fuzzing یا fuzzer برای کشف علت رفتار غیرعادی استفاده می شود.

Fuzzing بر این فرض استوار است که همه سیستم ها حاوی اشکالاتی هستند که منتظر کشف هستند و می توان زمان و منابع کافی برای انجام این کار در اختیار آنها قرار داد. اکثر سیستم ها دارای تجزیه کننده های بسیار خوب یا جلوگیری از اعتبارسنجی ورودی هستند مجرمان سایبری از سوء استفاده از هرگونه باگ فرضی در یک برنامه. با این حال، همانطور که در بالا ذکر کردیم، پوشش تمام موارد گوشه در طول توسعه دشوار است.

Fuzzers در برنامه هایی استفاده می شود که ورودی ساختاریافته یا دارای نوعی مرز اعتماد هستند. به عنوان مثال، برنامه‌ای که فایل‌های PDF را می‌پذیرد، برای اطمینان از اینکه فایل دارای پسوند pdf. و تجزیه‌کننده برای پردازش فایل PDF است، اعتبارسنجی دارد.

یک fuzzer موثر می تواند ورودی هایی به اندازه کافی معتبر برای عبور از این مرزها و در عین حال آنقدر نامعتبر برای ایجاد رفتار غیرمنتظره در دورتر برنامه ایجاد کند. این مهم است زیرا صرفاً قادر به رد شدن از اعتبارسنجی ها در صورت عدم ایجاد آسیب بیشتر، معنای زیادی ندارد.

Fuzzers بردارهای حمله را بسیار شبیه و از جمله مواردی مانند تزریق SQL، اسکریپت بین سایتی، سرریز بافر و حملات انکار سرویس را کشف می کنند. همه این حملات در نتیجه تغذیه داده های غیرمنتظره، نامعتبر یا تصادفی به یک سیستم هستند. 

 

انواع فوزر

Fuzzers را می توان بر اساس برخی ویژگی ها طبقه بندی کرد:

  1. به اهداف حمله کنید
  2. روش ایجاد فاز
  3. آگاهی از ساختار ورودی
  4. آگاهی از ساختار برنامه

1. به اهداف حمله کنید

این طبقه بندی بر اساس نوع پلت فرمی است که فازر برای آزمایش استفاده می شود. Fuzzer ها معمولاً با پروتکل های شبکه و برنامه های نرم افزاری استفاده می شوند. هر پلتفرم دارای نوع خاصی از ورودی است که دریافت می کند، و بنابراین به انواع مختلفی از فازرها نیاز دارد.

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

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

2. روش ایجاد فاز

Fuzzers همچنین می تواند بر اساس نحوه ایجاد داده ها برای فاز کردن با آنها طبقه بندی شود. از لحاظ تاریخی، fuzzer ها با تولید داده های تصادفی از ابتدا، فاز ایجاد می کردند. در ابتدا پروفسور بارتون میلر، مبتکر این تکنیک، این کار را انجام داد. این نوع فوزر a نامیده می شود فازر مبتنی بر نسل.

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

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

این رویکرد هوشمندتر از روش قبلی است و جایگشت های احتمالی را به میزان قابل توجهی محدود می کند. فوزرهایی که از این روش استفاده می کنند نامیده می شوند فوزرهای مبتنی بر جهش

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

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

3. آگاهی از ساختار ورودی

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


در صورتی که یک فازر با مدل ورودی یک برنامه ارائه شود، فوزر می‌تواند سعی کند داده‌ها را به گونه‌ای تولید کند که با مدل ورودی ارائه شده مطابقت داشته باشد. این رویکرد مقدار منابع صرف شده برای تولید داده های نامعتبر را بیشتر کاهش می دهد. چنین فوزری a نامیده می شود فوزر هوشمند.

4. آگاهی از ساختار برنامه

Fuzzers همچنین می تواند بر اساس اینکه آیا آنها از عملکرد داخلی برنامه ای که در حال فاز کردن هستند مطلع هستند یا خیر طبقه بندی می شوند و از این آگاهی برای کمک به تولید داده های فازی استفاده می کنند. هنگامی که از fuzzer ها برای آزمایش یک برنامه بدون درک ساختار داخلی آن استفاده می شود، به آن تست جعبه سیاه می گویند. 

داده‌های فازی تولید شده در طول آزمایش جعبه سیاه معمولاً تصادفی هستند، مگر اینکه فازر یک فوزر مبتنی بر جهش تکاملی باشد، جایی که با نظارت بر اثر فازی شدن و استفاده از آن، «یاد می‌گیرد» اطلاعات برای اصلاح مجموعه داده های فازی خود.

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

ابزارهای محبوب Fuzzing

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

محدودیت های Fuzzing

در حالی که Fuzzing یک تکنیک واقعاً مفید برای تست قلم است، اما بدون نقص نیست. برخی از این موارد عبارتند از:

  • مدت زمان زیادی طول می کشد تا اجرا شود.
  • خرابی ها و سایر رفتارهای غیرمنتظره ای که در طول آزمایش جعبه سیاه یک برنامه یافت می شوند، ممکن است تجزیه و تحلیل یا اشکال زدایی آن غیرممکن نباشد.
  • ایجاد الگوهای جهش برای fuzzer های هوشمند مبتنی بر جهش می تواند زمان بر باشد. گاهی اوقات، حتی ممکن است به دلیل اختصاصی یا ناشناخته بودن مدل ورودی، امکان پذیر نباشد.

 

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

نتیجه

Fuzzing یک تکنیک قدرتمند تست قلم است که می تواند برای کشف آسیب پذیری های نرم افزار استفاده شود. انواع مختلفی از فوزرها وجود دارد و فوزرهای جدید همیشه در حال توسعه هستند. در حالی که fuzzing یک ابزار فوق العاده مفید است، اما محدودیت های خود را دارد. به عنوان مثال، fuzzer ها فقط می توانند آسیب پذیری های زیادی را پیدا کنند و می توانند کاملاً منابع فشرده باشند. با این حال، اگر می خواهید این تکنیک شگفت انگیز را برای خود امتحان کنید، ما یک API رایگان DNS Fuzzer که می توانید در پلتفرم ما استفاده کنید. 

پس برای چی منتظری؟ 

از امروز شروع کن

گوگل و اسطوره ناشناس

گوگل و اسطوره ناشناس

گوگل و اسطوره ناشناس در 1 آوریل 2024، گوگل موافقت کرد که با از بین بردن میلیاردها رکورد داده جمع آوری شده از حالت ناشناس، دعوی قضایی را حل و فصل کند.

ادامه مطلب »