What is Fuzz Testing (Fuzzing)?

reverse_lab_logo

reverse_lab_logo

آزمون فازی چیست؟

توسط: مرتضی ذاکری

پاییز 1397

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

آزمون نرم‌افزار بخش مهمی از فرایند توسعه و ساخت یک سیستم نرم‌افزاری را تشکیل می‌دهد و فنون مختلفی برای آن وجود دارد. آزمون فازی یا فازینگ، یک فن مؤثر آزمون نرم‌افزار به‌منظور کشف زود هنگام خطاها، قبل از تبدیل شدن آنها به آسیب‌پذیری است. آزمون فازی برای آزمودن و نمایان‌سازی خرابی‌ها در نرم‌افزارهایی که ورودی‌هایی با ساختار(ها)ی پیچیده می‌پذیرند؛ از قبیل مرورگرهای وب، ویرایشگرهای متن، پخش‌کننده‌های چندرسانه‌ای و غیره، بسیار مناسب ظاهر شده است. در این فن ورودی‌هایی خاص توسط یک برنامه دیگر، یعنی با روش خودکار، تولید شده و به نرم‌افزار تحت آزمون (SUT) تزریق می‌شود. برنامه در عین حال، به امید یافتن خطا بر اثر پردازش ورودی تزریق شده، پایش می‌شود. ورودی که به برنامه داده می‌شود نقش داده (مورد) آزمون را داشته و عامل اصلی نمایان‌سازی خطا(های) احتمالی موجود در برنامه با بردن آن به یک حالت خرابی است. به‌همین علت مهم‌ترین قسمت در فرایند آزمون فازی را می‌توان تولید خودکار داده‌های آزمون دانست، به‌نحوی که بیشترین خطاها و ایرادات شناسایی گردند. ایده اولیه این آزمون همانطور که گفته شد،  بسیار ساده است. ورودی‌های ناخواسته‌ای (مخرب) تولید و به برنامه می‌دهیم. اجرای برنامه با این ورودی‌ها ممکن است آن را دچار خرابی کند و خطایی که مسبب این خرابی است با تحلیل برنامه مشخص خواهد شد. ‏هدف اصلی، انجام کلیه فرایند به‌صورت خودکار است. SUT می‌تواند هر برنامه‌ای باشد. معمولا برنامه‌های تحت شبکه، مرورگرها و برنامه‌های مبتنی بر فایل مثل واژه‌پردازها و pdfخوان‌ها با این فن مورد آزمون قرار می‌گیرند.

آزمون فازی نخستین بار توسط دکتر بارتون میلر و همکاران در دانشگاه ویسکانسین-مدیسن ایالات متحده، برای آزمون تعدادی از ابزارهای سیستم‌عامل یونیکس طراحی و اجرا شد. ایده اولیه از این مشاهده نشأت گرفت که برخی ابزارهای رایج در یونیکس وقتی توسط یک اتصال دارای اختلال خط تلفن دستیابی می‌گردند، ناگهان سقوط می‌کنند. در این پژوهش یک ابزار ساده به‌نام فاز، برای تولید رشته‌های ورودی تصادفی، که از طریق یک خط‌لوله یا شبه-پایانه قابل تزریق به SUT بودند، پیاده‌سازی شد. این فن سبب ایجاد خرابی و سقوط بیش از 24 درصد از 88 ابزار مرسوم یونیکس آزمون‌شده در طول آزمایش، گردید. از آن پس آزمون فازی برای آزمون طیف وسیعی از نرم‌افزارها و برنامه‌های سیستمی و کاربردی از جمله مرورگرهای وب، چندرسانه‌ای‌ها، کامپایلرها و غیره، به‌کار گرفته‌شد و تا امروز پژوهش‌های متعددی در زمینه بهبود و تقویت آن صورت پذیرفته‌است.

برای خودکار سازی فرایند آزمون فازی ابزاری موسوم به فازر توسعه داده می‌شود. یک فازر در کامل­ترین حالت، دارای سه پیمانه­­ ی تولیدکننده مورد آزمون، تزریق‌کننده مورد آزمون و ابزار پایش وضعیت SUT، است. البته تفکیک پیمانه­ ها به این قسم همواره برقرار نیست و برخی فازرها ممکن است همه­ ی پیمانه ­ها را نداشته باشند؛ مثلا برای پایش ممکن است از امکانات سیستم‌عاملی که SUT روی آن مقیم است، استفاده شود. معمولا دو روش مرسوم برای تولید موردهای آزمون توسط فازرها وجود دارد: روش ­های مبتنی جهش که به‌صورت تصادفی ورودی­ هایی را جهش داده و روش­ های مبتنی بر تولید که بر اساس مجموعه ­ای از قوانین ورودی را تولید می ­نمایند. اولین فازرهای ساخته‌شده رویکردی مبتنی بر جعبه سیاه داشتند. برخلاف ساده‌ و مستقل از برنامه بودن، این دسته از فازرها مانند Peach، Sulley و Radamsa توانسته‌اند خطاهای بسیاری را در برنامه‌های کاربردی کشف کنند که تا قبل از این نهفته مانده‎بود. به‌تدریج فازرها در دو رویکرد جعبه سفید و جعبه خاکستری هم مورد توجه قرار گرفتند. به موازات آن روش‌های مختلفی برای تولید خودکار داده آزمون در فازرها استفاده شد؛ به‌نحوی که می‌توان گفت آنچه یک فازر را از فازر دیگر متمایز می‌کند، روش به‌کار رفته در آن برای تولید داده آزمون است.

مراجع:

نمایه:

unexpected input

fuzz testing

fuzzing

fault

vulnerability

software under test

test data (case)

failure