tgoop.com/terminal_stuff/2941
Create:
Last Update:
Last Update:
بیاید اول یکم مرور کنیم که Fuzzing چیه. فرض کنید یک فانکشنای نوشتید که چهار تا عدد از تایپ integer رو به عنوان پارامتر دریافت میکنه. فرض کنید تابعتون چیزی شبیه به اینه :
fun foo(int x, int y, int z, int t) {
// bunch of statements
if ( (x^t+1)^3 + (2.3*y)^2.3 - 0.8*(z^4) == 0) { // call the condition as 'f'
Bug();
}
// bunch of statements
}
همونطور که ملاحظه میکنید، توی برنامهما یک point ای وجود داره که اگر reachable باشه به باگ میخوریم. حالا سوالی که وجود داره اینه که بفهمیم آیا این امکان وجود داره که شرط f ارضا بشه یا خیر. برای اینکه به جواب سوالمون برسیم، باید یک decision procedure پیاده کنیم که به عنوان ورودی فرمول f رو ازمون بگیره، و بهمون true یا false برگردونه. یک computer scientist اولین سوالی که به ذهنش میرسه اینه که آیا این مسئله محاسبه پذیره یا خیر و اگر هست با از نظر پیچیدگی در چه کلاسی قرار داره. به طور خلاصه خدمتتون میگم که این مسئله undecidable هستش. حالا سوالی که پیش میاد اینه که چیکار کنیم؟ رهاش کنیم بره؟ خب قطعا نه. یه راهی که از دهه ۵۰ میلادی، یعنی از زمان پانچ کارت ها وجود داره اینه که بیایم شروع کنیم با یک الگوریتم Pseudo random number generating برای این ۴ تا متغیر value جنریت کنیم و چک کنیم ببینیم که آیا این فرمول تحت اون assignment ارضا میشه یا نه. اگر شد که خب میگیم بله reachable هستش و برنامه مون باگ داره. اگر نشد... خب بیاید این یه تیکه رو فعلا اسکیپ کنیم :)
حالا قضیهی Fuzzing هم ریشهاش برمیگرده به random testing اما قطعا با رندوم تستینگ فرق داره. میتونیم بگیم رندوم تستینگ سادهترین و naive ترین نوع Fuzzing هستش. تکنیکهای Fuzz testing با توسعهای که از دهه ۹۰ تا الان داشتن، ساختارمند شدند و باهوش تر عمل میکنند. یک سریهاشون از نوع generation-based یعنیتوی هر iteration ورودیها رو از اول تعیین میکنند. یک سریهاشونم mutation-based هستند و میان input ها رو modify میکنند. فاز تستینگها به شکل white و black و gray box انجام میشن. بلک باکس اینطوریه که fuzzer هیچی از ساختار برنامه نمیدونه. gray box یعنی اینکه ما نیاز داریم کمی instrumentation روی کدمون انجام بدیم و به طبع white box هم که مشخص میشه چیه.
فازری که داچمن رفته سراغش از نوع gray-box و mutation-based هستش. منتهی باهوش تره، یعنی بلده که mutation هاش رو به سمت یک سری هدف و یا coverage خاص که از پیش براش مشخص شدن هدایت کنه. اصلاحا به این نوع فازرها میگن Directed Grey-box fuzzing. این تکنیک توسعه و پیادهسازیش توسط آقای Abhik Roychoudhury و تیمش صورت گرفته. ایشون یه گروه بسیار سوپر و قوی توی دانشگاه NUS دارن که تو حوزهی Fuzzing و Automated Program Repair فعاله. بسیار توصیه میکنم اگر به این بحثا علاقهمند هستید برید و کارشون رو بخونید.
تا اینجا مقدمه بود میریم سراغ بحث اصلی.
BY نوشتههای ترمینالی

Share with your friend now:
tgoop.com/terminal_stuff/2941