چگونه می توانید آسیب پذیری ها و باگ های نرم افزار خود را پیدا کنید زمانی که دقیقاً نمی دانید دنبال چه چیزی هستید؟ در این مقاله به بررسی چگونکی عملکرد Fuzz Testing یا تست فازی با هدف شناسایی آسیب پذیری های روز صفر (zero-day vulnerabilities) خواهیم پرداخت.
بررسی اجمالی
Fuzz Testing را میتوان به عنوان یک نوع آزمایش “شکستن” نرمافزار تصور کرد. به جای دنبال کردن یک مسیر مشخص و از پیش تعیین شده برای تست کردن نرمافزار، تست فازی به صورت تصادفی و با استفاده از دادههای ورودی غیرمنتظره و گاه نامعتبر، به نرمافزار حمله میکند. هدف از این کار، شناسایی نقاط ضعف و آسیبپذیریهایی است که ممکن است در شرایط عادی استفاده از نرمافزار آشکار نشوند.این اغلب یک تکنیک تست جعبه سیاه است که بدون دانش ساختار داخلی برنامه موضوع انجام میشود.
فازی کردن برنامه، یک تکنیک تست نرم افزار است که به تیم ها اجازه می دهد آسیب پذیری های امنیتی یا باگ ها را در سورس کد نرم افزار خود کشف کنند. برخلاف روش های سنتی تست نرم افزار – SAST، DAST یا IAST – تست Fuzz اساساً با ورودی های تصادفی کد را “پینگ” می کند تا آن را خراب کند و در نتیجه خطاهایی را شناسایی کند که در غیر این صورت آشکار نخواهند بود. این خطاهای کد (یا مشکلات منطق تجاری) مناطقی را نشان می دهند که احتمالاً در معرض خطر بالای تهدیدات امنیتی هستند.
هنگامی که یک خطا یا آسیب پذیری پیدا شد، یک فازی – ابزاری که علل احتمالی خراب شدن را شناسایی می کند – می تواند برای صفر کردن روی آسیب پذیری های خاص در کد منبع استفاده شود. فازی ها در کشف آسیب پذیری هایی که می توانند توسط حملاتی مانند تزریق SQL و اسکریپت بین سایتی مورد سوء استفاده قرار گیرند، مؤثرتر هستند، جایی که هکرها امنیت را برای سرقت اطلاعات یا خراب کردن یک سیستم تهدید می کنند. فازی ها در شناسایی آسیب پذیری هایی که ارتباطی با خرابی سیستم ندارند، مانند جاسوسی یا تروجان ها، کمتر مؤثر هستند.
تست فازی به دلیل کاملاً خودکار بودن و توانایی پیدا کردن نقاط ضعف مبهم یکی از بهترین گزینه ها برای شناسایی پاشنه آشیل های نرم افزار شماست.
تاریخچه تست فازی
تست فازی نیز از نظر دیگری برجسته است: در واقع داستانی در مورد نحوه کشف این مفهوم وجود دارد. در سال ۱۹۸۸، پروفسور بارتون میلر از دانشگاه ویسکانسین-مدیسون سعی داشت از طریق یک سیستم شماره گیری به یک کد دسترسی از راه دور داشته باشد، اما بازخورد از یک طوفان رعد و برق باعث خرابی برنامه می شد. این ایده که “نویز” خارجی توسط کد قابل تحمل نیست، الهام بخش میلر و دانشجوی او شد. آنها دریافتند که برنامه های یونیکس (Unix based)، مک و ویندوز به طور معمول هنگام پینگ شدن با ورودی های تصادفی غیرمنتظره خراب می شوند. میلر یکی از نویسندگان کتاب “Fuzzing for Software Security Testing and Quality Assurance” است.
دو نوع فازی کردن
دو نوع اصلی فازی کردن وجود دارد: پوشش هدایت شده و رفتاری.
فازی کردن پوشش هدایت شده بر روی کد منبع در حین اجرای برنامه تمرکز دارد و آن را با ورودی تصادفی بررسی می کند تا باگ ها را کشف کند. آزمایش های جدید دائماً در حال تولید هستند و هدف رساندن برنامه به خراب شدن است. یک خراب شدن به معنای یک مشکل بالقوه است و داده های حاصل از فرآیند تست فازی هدایت شده به یک تستر اجازه می دهد تا خرابی را تکرار کند، که هنگام تلاش برای شناسایی کد در معرض خطر مفید است.
فازی کردن رفتاری, متفاوت عمل می کند. با استفاده از مشخصات برای نشان دادن نحوه عملکرد یک برنامه، از ورودی های تصادفی برای قضاوت در مورد عملکرد واقعی برنامه استفاده می کند. تفاوت بین انتظار و واقعیت معمولاً جایی است که باگ ها یا سایر خطرات امنیتی بالقوه می توانند یافت شوند.
انواع تست های فازی
انواع مختلفی از تست فازی را میتوان برای هدف قرار دادن آسیبپذیریهای خاص استفاده کرد :
- فازی کردن پروتکل: این شامل ارسال بستههای شبکه تغییر یافته یا غیرمنتظره برای آزمایش نحوه برخورد برنامه با پروتکلهای مختلف است.
- فازی کردن فرمت فایل: این شامل اصلاح فرمتهای فایل قانونی به روشهای مختلف برای بررسی اینکه آیا برنامه میتواند آنها را به درستی مدیریت کند، میشود.
- فازی کردن برنامه: این شامل آزمایش رابط کاربری، گزینههای خط فرمان و سایر نقاط ورودی برنامه برای شناسایی آسیبپذیریها میشود.
با آزمایش سیستماتیک برنامهها با طیف گستردهای از ورودیهای غیرمنتظره، تست فازی میتواند به سازمانها کمک کند تا آسیبپذیریهای بالقوه را قبل از سوء استفاده از آنها توسط بازیگران مخرب شناسایی و برطرف کنند.
چه حملاتی را تست فازی بر سیستم تحمیل میکند ؟
یک فازی ترکیبی از حملات را بر روی موارد زیر امتحان میکند:
- اعداد (…signed/unsigned integers/float)
- کاراکترها (URLs، ورودیهای خط فرمان)
- متاداده: متن ورودی کاربر (id3 tag)
- دنبالههای دودویی خالص (pure binary sequences)
یک رویکرد رایج برای فازی کردن، تعریف لیستهایی از “مقدارهای شناخته شده خطرناک” (بردارهای فازی) برای هر نوع و تزریق یا ترکیب مجدد آنها است.
- برای اعداد صحیح: صفر، احتمالا اعداد منفی یا بسیار بزرگ
- برای کاراکترها: کاراکترها یا دستورالعملهای قابل تفسیر فرار (مثلاً برای درخواستهای SQL، نقل قولها / کامندها…)
- برای دودویی: موارد تصادفی و رندوم
با اچه ابزار هایی تست فازی انجام دهیم ؟
ابزارهای فازی متنباز
۱. Mutational Fuzzers
- American Fuzzy Lop (AFL): یک فازیکننده بسیار پرکاربرد و مؤثر که از الگوریتمهای ژنتیک برای تولید موارد آزمایشی جدید بر اساس خرابیهای قبلی استفاده میکند.
- Radamsa: یک فازیکننده ساده اما قدرتمند که ورودیهای داده تصادفی را برای آزمایش تولید میکند.
- APIFuzzer: ابزاری که به تست فازی بدون نیاز به دانش گسترده کدنویسی اجازه میدهد و آن را برای مخاطبان گستردهتری قابل دسترسی میکند.
- Jazzer: یک فازیکننده مخصوص برنامههای ماشین مجازی جاوا (JVM) که امکان آزمایش نرمافزارهای مبتنی بر جاوا را فراهم میکند.
- ForAllSecure Mayhem for API: ابزاری متمرکز بر تست فازی APIها که آسیبپذیریهایی را شناسایی میکند که میتوان از آنها برای به خطر انداختن امنیت برنامههای وب و میکروسرویسها سوء استفاده کرد.
۲. Fuzzing فریم ورک ها
- Sulley Fuzzing Framework: یک چارچوب همه کاره که پایه و اساس ساخت فازیکنندههای سفارشی را فراهم میکند و انعطافپذیری و کنترل بر فرآیند فازی کردن را ارائه میدهد.
- boofuzz: یک چارچوب فازی مبتنی بر پایتون که ایجاد و مدیریت کمپینهای فازی را ساده میکند.
- BFuzz: یک چارچوب فازی طراحی شده برای آزمایش پروتکلهای شبکه که مجموعه غنی از ویژگیها برای تجزیه و تحلیل ترافیک شبکه و تولید محمولههای فازی را ارائه میدهد.
دانشجوی مهندسی نرم افزار و علاقه مند به دواپس 🙂