مقاله «BertRLFuzzer: A BERT and Reinforcement Learning Based Fuzzer» یک ابزار نوآورانه برای کشف آسیب پذیریهای امنیتی در برنامههای وب معرفی میکند که براساس ترکیب مدل زبانی BERT و یادگیری تقویتی (RL – Reinforcement Learning) طراحی شده است. عملکرد BertRLFuzzer به این صورت است که با دریافت فهرستی از ورودیهای اولیه (seed inputs)، عملیات جهش (mutation) را بر روی آنها انجام میدهد بهگونهای که هم با دستور زبان (grammar) سازگار باشد و هم باعث تحریک حمله شود، تا بردارهای حمله کاندید تولید کند. بینش کلیدی BertRLFuzzer، استفاده ترکیبی از دو مفهوم یادگیری ماشین است. اولی استفاده از یادگیری نیمهنظارتشده همراه با مدلهای زبانی (مانند BERT) است که به BertRLFuzzer امکان میدهد بخشهای مرتبط گرامری برنامه هدف و الگوهای حمله را بیاموزد، بدون اینکه کاربر نیاز داشته باشد آنها را صریحاً مشخص کند. دومی استفاده از یادگیری تقویتی است که مدل BERT را بهعنوان یک عامل (agent) بهکار میگیرد تا فازر را در یادگیری مؤثر عملگرهای جهشِ همراستا با دستور زبان و تحریککننده حمله هدایت کند. حلقه بازخورد هدایتشده توسط RL به BertRLFuzzer اجازه میدهد فضای بردارهای حمله را بهطور خودکار جستجو کند و ضعفهای برنامه هدف را بدون نیاز به ساخت داده برچسبخورده آموزشی، بهرهبرداری (exploit) نماید. افزون بر این، این دو ویژگی در کنار هم باعث میشوند BertRLFuzzer قابل توسعه باشد؛ یعنی کاربر میتواند BertRLFuzzer را بهصورت خودکار (بدون اصلاح صریح فازر یا ارائه دستور زبان) برای انواع مختلف برنامههای هدف و بردارهای حمله توسعه دهد.
محققان به منظور سنجش اثربخشی BertRLFuzzer، آن را در برابر مجموعاً ۱۳ فازر جعبه سیاه و جعبه سفید آزمایش و بررسی کردهاند: ۷ فازر جعبه سیاه مبتنی بر یادگیری ماشین (DeepSQLi, DeepFuzz, DQN fuzzer، نسخههای اصلاحشده DeepXSS, DeepFix, GRU-PPO, Multi-head DQN)، ۳ فازر سازگار با گرامر (BIOFuzz, SQLMap, baseline mutator)، یک فازر جعبه سفید ( Ardilla)، یک تغییردهنده تصادفی و یک فازر تصادفی، بر روی مجموعهای از ۹ وبسایت هدف آزمایش شده است. محققان شاهد بهبود قابل توجهی از نظر زمان تا اولین حمله (۵۴٪ کمتر از نزدیکترین ابزار رقابتی)، زمان برای یافتن تمام آسیبپذیریها (۴۰–۶۰٪ کمتر از نزدیکترین ابزار رقابتی)، و نرخ حمله (۴.۴٪ بردار حمله تولیدشده بیشتر نسبت به نزدیکترین ابزار رقابتی) بودهاند. نتایج آزمایشهای آنها حاکی از آن است که ترکیب مدل BERT و یادگیری مبتنی بر RL، میتواند BertRLFuzzer را به یک فازر مؤثر، تطبیقپذیر، آسان برای استفاده، خودکار و قابل توسعه تبدیل کند.
۱. مقدمه (Introduction)
در چند دهه اخیر، رشد چشمگیری در تعداد و پیچیدگی برنامههای تحت وب مشاهده شده است که در کنار آن، میزان و تنوع آسیب پذیریهای امنیتی نیز بهطور قابلتوجهی افزایش یافته است، از جمله حملات شناختهشدهای نظیر SQL Injection، XSS و CSRF. پژوهشگران در واکنش به این چالش، مجموعهای از ابزارهای فازینگ پیشرفته را توسعه دادهاند که بسته به روش تحلیل، از فازرهای مبتنی بر جهش تصادفی (مانند AFL گوگل)، تا فازرهای جعبهسیاه سازگار با دستور زبان (black box grammar-preserving fuzzers) [1] و حتی فازرهای جعبهسفید مبتنی بر حلکننده SMTها (SMT solver-based white box fuzzers – مانند Ardilla) را دربرمیگیرند.
یک مسئله رایج برای توسعهدهندگان این است که فازِرها اغلب باید از دستور زبان ورودی (input grammar) آگاه باشند، بهویژه هنگام فازینگ برنامههایی که دستور زبان ورودیشان پیچیده است. تعریف صریح دستور زبان و بهروزرسانی آن برای هر کلاس جدید از آسیب پذیری، وقتگیر و مستعد خطا میباشد. علاوه بر این، ابزارهای فازر کنونی به سختی میتوانند بدون ایجاد تغییر دستی به انواع جدید آسیب پذیریها گسترش یابند. بهعبارتدیگر، طراحی فازرهای فعلی معمولاً خودکار و قابلگسترش نیست و نیاز به مداخله انسانی دارد.
توسعه فازِرهای آگاه از دستور زبان (grammar-aware fuzzers)، فرآیندی زمانبر و پرخطا میباشد؛ زیرا توسعهدهندگان فازِر باید صریحاً دستور زبان ورودیِ برنامه هدف را فراهم کنند و خودِ فازِر را بر اساس آن تغییر یا توسعه دهند. این مسئله زمانی که بخواهند فازِر را برای برنامههای مختلف مجددا هدفگیری کنند، بسیار دشوار خواهد بود.
مشکل دیگری که وجود دارد این است که حتی اگر برای یک برنامه مشخص، فازِرِ آگاه از دستور زبان در اختیار داشته باشیم، ممکن است هرگاه کلاسهای جدیدی از آسیب پذیریها کشف شوند، نیاز به تغییر فازِر نیز پدید آید. برای مثال، فازِری که برای کشف آسیب پذیری SQL Injection (تزریق SQL) در یک برنامه وب طراحی شده باشد، در تشخیص آسیبپذیریهای XSS کارآمد نخواهد بود. به عبارت سادهتر، فازِرهای امروزی بهراحتی قابل توسعه بهمنظور پشتیبانی گرامر-محور از کلاسهای جدیدِ برنامهها و آسیب پذیریها نیستند. به بیان ساده تر ساده، فازرهای امروزی بهگونهای طراحی نشدهاند که بتوان آنها را بهراحتی و به شکل آگاه از دستور زبان (grammar-aware) برای کلاسهای جدیدی از برنامهها و آسیبپذیریها گسترش داد.
۱.۱ بیان مسئله (Problem Statement)
بهطور دقیقتر، مسئلهای که در این مقاله به آن پرداخته شده است، ایجاد یک فازر برای برنامههای وب است که بهعنوان ورودی، یک برنامه هدف و مجموعهای از بذرهای ورودیهای اولیه (seed inputs) را دریافت میکند و بهعنوان خروجی یک عملگر جهش (mutation operator) تولید مینماید که این ورودیها را به بردار حمله برای برنامه مشخص تبدیل میکند — بهصورتی که قابل توسعه، منطبق با دستور زبان (grammar-adherent) و کاملاً خودکار باشد. در واقع فازر میبایست ویژگیهای زیر را داشته باشد:
- نخست، سیستم باید قابل توسعه باشد؛ یعنی کاربر بتواند آن را با حداقل تلاش انسانی و یا بدون تلاش (مثلاً از طریق یادگیری از دادهها) برای انواع مختلف بردارهای حمله و برنامههای هدف توسعه دهد.
- دوم، باید مطابق با گرامر باشد؛ یعنی رشتههای خروجی تولیدشده توسط فازر باید با دقت بالا مطابق گرامر ورودی برنامه هدف باشند، بدون اینکه از کاربر خواسته شود گرامر ورودی برنامه هدف را ارائه دهد.
- سوم، فازر باید کاملاً خودکار باشد؛ یعنی عملیات جهش جدید را بدون ارائه دادهء برچسبگذاری شده و بدون اینکه انسان کد فازر را تغییر دهد، بیاموزد یا تولید کند (توجه: بهتعریف، فازرهای نگارششده توسط انسان که مطابق گرامر هستند، بهطور خودکار عملیات جهش جدید را نمیآموزند).
- چهارم، فازر باید کارا و مؤثر باشد؛ یعنی زمان تا اولین حمله باید کم باشد (کارایی) و نرخ حمله نسبت به ابزارهای پیشرفته دیگر بالاتر باشد (اثربخشی).
۱.۲ یادگیری ماشین برای فازینگ (Machine Learning for Fuzzing)
در سالهای اخیر، شاهد روند رو به رشدی از تقویت تکنیکهای فازینگ سنتی برنامههای وب با روشهای یادگیری ماشین ML بودهایم که طیف وسیعی از روشهای آموزش ML را در بر میگیرد — از یادگیری نظارتشده (Liu, Li, and Chen 2020) تا روشهای یادگیری تقویتی (RL) (Böttinger, Godefroid, and Singh 2018). فازرهای مبتنی بر ML نسبت به فازرهای غیر ML چند مزیت مهم دارند. برای مثال، روشهای فازینگ مبتنی بر RL سازگار هستند، یعنی میتوان آنها را بهسادگی تنظیم کرد تا انواع مختلفی از بردارهای حمله را کاوش کنند و خود را با گونههای متفاوتی از برنامههای هدف وفق دهند (Scott et al. 2021). مزیت دیگر این است که فازرهای مبتنی بر ML میتوانند الگوهای پیچیده بردارهای حمله را بیاموزند که ممکن است برای انسان سختتشخیص باشند و دشوار باشد آنها را بهصورت ثابت در فازر غیر ML کدنویسی کرد. از سوی دیگر، فازرهای مبتنی بر ML که بر یادگیری نظارتشده تکیه دارند معایبی نیز دارند؛ مثلاً ممکن است برای شناسایی دقیق الگوهایی که قابلیت تبدیلشدن به عملگرهای جهش را دارند، به مجموعهٔ بزرگی از دادههای آموزشی برچسبخورده از بردارهای حمله نیاز داشته باشند. در نهایت، مشکل سنتیِ سازگار ساختن عملگرهای جهش با گرامر، همچنان در مورد فازرهای جهش مبتنی بر ML ارائهشده تاکنون وجود دارد. بسته به نوع برنامه هدف و پیچیدگی گرامرهای ورودی آنها، تعیین چنین گرامرهایی میتواند پرهزینه، مستعد خطا و زمانبر باشد. ترجیح این است که فازرها از روی دادهها که شامل گرامر برنامه هدف و الگوهای بردار حملهای که احتمال موفقیتشان بیشتر است، بیاموزند.
۱.۳ مروری کوتاه بر BertRLFuzzer (Brief Overview of BertRLFuzzer)
پژوهشگران به منظور پاسخ به این چالشها، BertRLFuzzer را معرفی کردند، یک فازر مبتنی بر BERT (مخفف «نمایش رمزگذار دوجهتی از تبدیلکنندهها»، بخشی از ابزارهای قدرتمند پردازش زبان طبیعی مانند ChatGPT (OpenAI 2023)) و فازر مبتنی بر (RL). برخلاف فازرهای سنتی مبتنی بر ML و غیر ML ،BertRLFuzzer تمامی ویژگیهای ذکرشده را داراست؛ یعنی این ابزار خودکار، قابل توسعه، منطبق با گرامر است و همانطور که نتایج آزمایشهای پژوهشگران نشان میدهند، کارا و مؤثر نیز میباشد.
۱.۳.۱ ورودی و خروجی BertRLFuzzer (Input and Output of BertRLFuzzer):
ابزار BertRLFuzzer ، یک برنامه قربانی و لیستی از ورودیهای seed با پایبندی به گرامر را از یک مولد seed به عنوان ورودی دریافت میکند این ورودیها نمونههایی از یک کلاس شناختهشده از آسیبپذیریها هستند) و بهعنوان خروجی یک بردار حمله جدید ارائه میدهد که هدف آن آشکار کردن آسیب پذیریهای امنیتی قبلاً ناشناخته در برنامه هدف است.
۱.۳.۲ چرا از مدل BERT استفاده کنیم (Why use a BERT Model)؟
همانطور که پیشتر اشاره شد، شناساندن گرامر به فازرها بهصورت سنتی فرآیندی پرهزینه و نیازمند نیروی کار بوده است، بهویژه هنگام هدفگیری مجدد فازرها برای برنامهها و الگوهای بردار حمله مختلف. خوشبختانه، ظهور مدلهای زبانی (LM) در سالهای اخیر فرصت بسیار خوبی برای حل این مسئله چند دههای در اختیار ما قرار داده است. دلیل این امر این است که ثابت شده مدلهای زبانی بدون نیاز به مشخصکردن صریح گرامرها، ظرفیت شگفتآوری برای یادگیری گرامر زبانهای برنامهنویسی — تنها از روی بخشهایی از کد — دارند. بر اساس این مشاهدات، بینش کلیدی در کار ما این است که یک فازر تقویتشده با مدل زبانی میتواند بهصورت خودکار گرامرِ (قابلتوجهِ) برنامه هدف و بردارهای حمله را از دادهها (یعنی مجموعهای از بردارهای حمله یا ورودیهای اولیه که مطابق دستور زبان هستند) بیاموزد. این رویکرد، پتانسیل رفع یکی از مشکلات عمدهای را دارد که توسعهدهندگان فازر طی دههها با آن مواجه بودهاند.
۱.۳.۳ چرا از یادگیری تقویتی (RL) در فازینگ استفاده کنیم؟ (Why use RL in Fuzzing)
توجه داشته باشید که صرفاً یادگیری گرامر برنامهء هدف (قربانی)، کافی نیست چرا که ممکن است هیچ آسیبپذیریِ جدیدی را در آن برنامه آشکار نکند. در مقابل، فازر باید ورودیهای اولیه را بهگونهای جهش دهد که احتمالاً آسیبپذیریهای تازهای را در برنامه هدف آشکار سازد. این یک مسئله دشوار جستوجو در فضای نمایی بزرگی از ورودیهای برنامه هدف است. به عنوان مثال، یک رویکرد سادهانگارانه، اصلاح ورودی اولیه به شیوهای مطابق با دستور زبان، با تمام ترکیبات ممکن از یک الگوی بردار حمله است؛ اما چنین رویکردی دچار انفجار ترکیبی میشود.
یک رویکرد بهتر، استفاده از تکنیکهای جستجوی اکتشافی، مانند ادبیات یادگیری تقویتی RL است که هدف آن، تمرکز مؤثر بر آسیب پذیریهای برنامه قربانی است. به طور خلاصه، مزیت یک تکنیک یادگیری تقویتی RL که به درستی طراحی شده باشد این است که اغلب میتواند یک الگوی بردار حمله را که مختص یک برنامه قربانی مشخص است، کشف کرده و یاد بگیرد و این کار را به طور کارآمد و کاملاً خودکار انجام دهد. بر اساس این اصل کلی، BertRLFuzzer دارای یک عامل حالتدار RL است که یک عملگر جهش (یعنی دنبالهای از عملیات که یک ورودی مناسب و مطابق گرامر را دریافت کرده و آن را برای برنامه هدف به یک بردار حمله تبدیل میکند) را یاد میگیرد. از آنجایی که این یادگیری از طریق بازخورد از برنامه قربانی مشخص (که ممکن است حاوی پاککنندههای عبارات منظم برای محافظت از برنامه باشد) رخ میدهد، BERTRLFUSZER قادر است نقاط ضعف موجود در برنامه مذکور را، در صورت وجود، پیدا کند. عملگرهای جهشی که از طریق یادگیری تقویتیRLدر BERTRLFuzzer آموخته میشوند، آن را قادر میسازند تا به طور خودکار فضایی از بردارهای حمله را به روشی اکتشافی و مختص به برنامه قربانی، بدون هیچ گونه دخالت انسانی، کاوش کند و BERTRLFuzzer را به صورت خودکار اجرا کند.
۱.۳.۴ ادغام BERT و یادگیری تقویتی (RL) در BertRLFuzzer (Putting BERT and RL Together in BertRLFuzzer)
در BertRLFuzzer، یک مدل BERT از پیش آموزش دیده (آموزش دیده روی ورودیهای اولیه برنامه هدف، و بدینترتیب قادر به یادگیری دستور زبان آن برنامه و الگوهای حمله) به عنوان عامل در یک حلقه یادگیری تقویتی (RL) که با برنامه هدف در تعامل است، عمل میکند. این حلقه RL به نوبه خود به BertRLFuzzer امکان میدهد تا دقیقاً آن گونه جهشها را پیدا کند که احتمالاً بهطور زیادی میتوانند آسیبپذیریهای امنیتی در برنامه هدف را افشا کنند.
قابلیتِ مدلهای BERT در یادگیری نمایشِ گرامرها همچنین این امکان را به BertRLFuzzer میدهد که بهسادگی قابلتوسعه باشد؛ یعنی با مجموعهدادهای مناسب از ورودیهای اولیه بدون برچسب، کاربر میتواند مدل BERT را دوباره آموزش دهد تا یک کلاس جدید از عملگرهای جهش برای یک برنامه هدف مشخص تولید کند. سپس حلقه RL این مدل از پیشآموزشدیده BERT را با استفاده از برنامه هدف، عملگرهای جهش و مکانیزم پاداش بهصورت دقیقتر تنظیم میکند تا با جستجو در فضای ورودیها، یک کلاس جدید از بردارهای حمله را برای آن برنامه تولید نماید. نکته جذاب این رویکرد آن است که کاربر نیازی به رمزگذاری یا تعریف صریح گرامر الگوهای حمله ندارد — تمام این امور بهصورت خودکار با بهکارگیری مدل BERT و یک حلقه RL طراحیشده مناسب انجام میشود.
استفاده از یادگیری تقویتی برای شبیهسازی رفتار یک مهاجم تطبیقی اکنون بهطور گستردهای پذیرفته شده است. با این حال، تا جایی که ما میدانیم، بهکارگیری مدل BERT به عنوان یک عامل در حلقه RL داخل یک فازر نوآورانه است. این انتخاب تضمین میکند که عامل RL فازر ما بر اساس نحو و معناهای آموخته شده — درست مانند یک هکر — قضاوتهای مناسبی انجام دهد (و در نتیجه فضای جستوجو را تقلیل دهد)، بهجای آنکه جهشهای تصادفی پیشنهاد کند که ممکن است تضمینکننده سازگاری رشتههای خروجی با گرامر نباشند.
پژوهشگران به منظور ارزیابی صحیح شایستگی علمی ایدههای خود، یک مقایسه تجربی گسترده و کامل از BERTRLFUSZER با ۱۳ فازر دیگر مبتنی بر جعبه سیاه، جعبه سفید، مبتنیبر ML (یا ML-based) و غیر‑ML (یا non-ML) بر روی یک معیار گزینشی از ۹ برنامه وب قربانی که اندازه آنها از چند صد تا ۱۶ هزار خط کد متغیر است، انجام دادند. آنها از طریق سوالات تحقیقاتی خود، نشان دادند که BERTRLFUSZER تمام ویژگیهای مورد نیاز از یک فازر مبتنی بر یادگیری ماشینی مدرن، مؤثر، کارآمد، مطابق با دستور زبان، قابل توسعه و خودکار را دارا میباشد.
مشارکتها
- پژوهشگران BertRLFuzzer را معرفی کردند؛ یک فازر جدید برای برنامههای وب مبتنی بر BERT و یادگیری تقویتی که ویژگیهای زیر را داراست: خودکار (عملگرهای جهش را بدون کمک انسانی میآموزد)، قابلتوسعه (قابل بسط به کلاسهای جدیدی از آسیبپذیریها و برنامههای هدف)، منطبق با گرامر (بردارهای حمله خروجی با دقت بالا مطابق دستور زبان برنامههای هدف هستند)، مؤثر (توانایی کشف تعداد بیشتری از آسیبپذیریهای امنیتی نسبت به ابزارهای پیشرفته رقیب) و کارا (زمان تا اولین حمله کم است). پژوهشگران مدعی هستند در زمان نگارش مقاله، هیچ فازر مبتنی بر یادگیری ماشین دیگری از معماری BERT و الگوریتم مبتنی بر RL برای حل مسئله فوقالذکر استفاده نمیکند.
- پژوهشگران یک ارزیابی تجربی گسترده از BertRLFuzzer را به انجام رساندند و آن را در برابر مجموعاً ۱۳ فازر جعبه سیاه و جعبه سفید مقایسه کردند: ۷ فازر جعبه سیاه مبتنی بر یادگیری ماشین (DeepSQLi، DeepFuzz، فازر DQN، نسخههای اصلاح شده DeepXSS، DeepFix، GRU-PPO، DQN)، ۳ فازر پایبند به گرامر (BIOFuzz، SQLMap، تغییردهنده خط پایه)، یک فازر جعبه سفید Ardilla، یک تغییردهنده تصادفی پایه و یک فازر تصادفی پایه. آنها اثربخشی و کارایی BertRLFuzzer را روی یک بنچمارک شامل ۹ وبسایت هدف تا سقف ۱۶ هزار خط کد اعتبارسنجی کردند. در مجموعهای از وبسایتهای بنچمارک دنیای واقعی، بهبود قابل توجهی از نظر زمان اولین حمله (۵۴٪ کمتر از نزدیکترین ابزار رقیب)، زمان یافتن همه آسیبپذیریها (۴۰-۶۰٪ کمتر از نزدیکترین ابزار رقیب) و نرخ آسیبپذیریهای یافت شده (۴.۴٪ بیشتر از نزدیکترین ابزار رقیب) در انواع وبسایتهای معیار دنیای واقعی مشاهده گردید.
۲. پیشزمینه (BACKGROUND)
مدلهای مبدل و BERT (Transformers and BERT Models): مدلهای مبتنی بر مبدل از اجزای کلیدی در مدلهای بسیار موفق پردازش زبان طبیعی (NLP) بهشمار میروند، مانند GPT-3 (Brown et al. 2020)، ChatGPT (OpenAI 2023) و PALM از گوگل (Chowdhery et al. 2022). در سالهای اخیر، این مدلها با موفقیت در حوزه زبانهای برنامهنویسی رسمی نیز بهکار گرفته شدهاند، از جمله در زمینه ترجمه کد (code translation)، سنتز کد (code synthesis)، درک کد و تحلیل معنایی آن (code understanding). مدلهای BERT (مخفف Bidirectional Encoder Representations from Transformers) بر پایه معماری مبدل ساخته شدهاند. مدلهای BERT رشتههای متنی را که از یک الفبای محدود تشکیل شدهاند بهعنوان ورودی دریافت کرده و آنها را به یک نمایش برداریشده تبدیل میکنند (به منظور دریافت جزئیات بیشتر، خواننده میتواند به مقاله Bommasani و همکاران (Bommasani et al. 2021) برای مرور جامعی از مدلهای BERT مراجعه کند، و همچنین به منابع اصلی Devlin et al. (2018) و Liu et al. (2019b) رجوع نماید).
یادگیری تقویتی (Reinforcement Learning – RL): در حوزه یادگیری تقویتی و الگوریتم بهینهسازی سیاست مجاور (Proximal Policy Optimization – PPO) منابع گستردهای وجود دارد، و برای مطالعه بیشتر میتوان به کتاب Sutton و Barto (2018) مراجعه کرد. شبکه Q عمیق (DQN) یک الگوریتم یادگیری تقویتی وضعیتمند است که از شبکههای عصبی عمیق برای تقریب تابع مقدار Q یعنی پاداش بلندمدت مورد انتظار بهینه استفاده میکند و امکان تخمین اقدام بهینه برای انجام در یک حالت معین را فراهم میکند. PPO روشهای مبتنی بر ارزش و مبتنی بر سیاست را برای بهینهسازی سیاستها با استفاده از یک رویکرد بهینهسازی منطقه اعتماد برای بهروزرسانی آنها به سمت اقدامات بهتر، ترکیب میکند. Multi-Arm Bandit (MAB) یک الگوریتم یادگیری تقویتی بدون حالت است که شامل ایجاد تعادل بین کاوش گزینههای مختلف (بازوها) با بهرهبرداری از گزینههای شناخته شده و با پاداش بالا به منظور به حداکثر رساندن پاداش تجمعی در طول زمان است.
فازینگ نرمافزار (Software Fuzzing): فازینگ نرمافزار یکی از حوزههای گسترده، تأثیرگذار و فعال در مهندسی نرمافزار است. این حوزه نقش مهمی در کشف آسیبپذیریهای امنیتی، آزمایش استحکام نرمافزار و بهبود کیفیت کد ایفا میکند. برای آشنایی جامعتر با پیشرفتهای اخیر و طبقهبندی روشهای مختلف فازینگ، خواننده میتواند به مرور جامع Manes و همکاران (2018) مراجعه کند. اصطلاحات و مفاهیمی که در این مقاله برای فازینگ بهکار رفتهاند، همگی مطابق با استانداردهای رایج در این حوزه هستند.
فازینگ منطبق با دستور زبان، الگوهای حمله، برنامه هدف (Grammar-adhering Fuzzing, Attack Patterns, Victim Appli-
cation): در این مقاله اصطلاحات جدید زیر را معرفی میکنیم. عبارت فازر منطبق با دستور زبان به برنامهای کامپیوتری اشاره دارد که رشتهای را بهعنوان ورودی گرفته و رشتهای را تولید میکند که با گرامر برنامه هدف با دقت بالا انطباق دارد. توجه کنید که این تعریف غیرِاستاندارد است و هم فازرهای سنتیِ نوشتهشده توسط انسان که خطا ندارند و دستور زبان را حفظ میکنند را دربر میگیرد و هم فازرهای مبتنیبر ML را که ممکن است با دقت بالا نمایش مناسبی از دستور زبان برنامه هدف را بیاموزند. عبارت عملگر جهش منطبق با دستور زبان به برنامهای اطلاق میشود که رشته ورودی را بهگونهای تغییر میدهد که خروجی با دقت بالا مطابق گرامر برنامه هدف باشد. عبارت الگوی حمله به زیر رشتههایی از یک بردار حمله اشاره دارد (مثلاً الگوهای تاتولوژی در SQLi). ما از عبارت برنامه هدف یا برنامه تحت آزمون به عنوان مترادف application-under-test نیز استفاده میکنیم.
۳. یک مورد استفاده جذاب از BERTRLFUSZER (A COMPELLING USE CASE OF
BERTRLFUZZER)
یک مورد استفاده بسیار قوی از ابزار BertRLFuzzer مربوط به توسعهدهندگان برنامههای قربانی (برای مثال، برنامههای وب) است که ورودیهای آنها دارای گرامرهای پیچیده هستند و از سنیتایزرهایی (sanitizers) استفاده میکنند که ممکن است آسیبپذیریهای ناشناخته داشته باشند. در چنین شرایطی، توسعه یا به روزرسانی فازرهای جهشمحورِ مبتنی بر گرامر که بهصورت دستی نوشته میشوند، میتواند بسیار پرهزینه باشد.
علاوه بر این، ممکن است توسعهدهندگان مجموعهای از ورودیهای نمونه برای یک دسته خاص از آسیبپذیریها را در اختیار داشته باشند، اما این مجموعه آزمایشی معمولاً جامع نیست؛ در نتیجه، ممکن است نمونههای جالب و متفاوتی از بردارهای حمله وجود داشته باشند که سنیتایزرها (sanitizers) و/یا خود برنامه در برابر آنها مقاومتی ندارند و توسعهدهندگان از آنها بیاطلاع بمانند.
در سالهای اخیر، فازرهای جهشمحورِ سازگار با دستور زبان متعددی برای انواع مختلفِ برنامههای هدف و دستههای گوناگونِ آسیبپذیریهای امنیتی توسعه یافتهاند. با این حال، چنین ابزارهایی هر بار که یک کلاس جدید از آسیب پذیریهای امنیتی کشف شود یا هنگامی که برای یک کلاسِ پیشتر دیدهنشده از برنامههای هدف بازاستفاده شوند، نیاز به بازبرنامهریزی توسط انسان دارند. علاوه بر این، برنامههای هدف ممکن است توسط سنیتایزرهای (sanitizers) خطاپذیر محافظت شوند که میتوانند به توسعهدهندگان وب احساس کاذب امنیت منتقل کنند. پیدا کردن ضعفها در اینگونه سنیتایزرها (sanitizers) اهمیت ویژهای دارد، خصوصا اگر هدف ما بهبود امنیت کلیِ اکوسیستم وب باشد. فازرهای دستنویس باید بر اساس شناخت نقاط ضعفِ یک سنیتایزرِ (sanitizers) مشخص تعدیل شوند؛ و هرگاه توسعهدهندگان آن سنیتایزرها (sanitizers) را تغییر دهند، ممکن است آسیب پذیریهای جدیدی پدید آید که دوباره نیازمند اصلاحِ فازرهای دستی است. همه این فرآیندها میتواند بسیار زمانبر و پرهزینه باشد.
یکی از راههای حل مسئلهای که بالاتر توصیف شد، استفاده از یک فازر جهشمحورِ سازگار با گرامر است که خودکار و قابلگسترش (تطبیقی) باشد تا بتواند بهطور خودکار با کلاسهای جدیدِ آسیب پذیری، برنامههای هدفِ جدید و سنیتایزرهای تازه سازگار شود. همچنین بسیار مهم است که این فازر خودکار باشد؛ یعنی بتواند بدون نیاز به دخالت انسانی، یک نمایش/برداشتِ مفید از گرامرِ برنامههای هدف و الگوهای حمله بیاموزد — بدون اینکه انسان مجبور باشد گرامرها یا تشخیصدهندههای الگو (مثلاً عبارات منظم) را صریحاً تعیین کند.
ابزار BertRLFuzzer تمام قابلیتهای لازم برای سناریوی فوق را فراهم میکند (جزییات معماری را مشاهده کنید— شکل ۲). BertRLFuzzer برای یک ترکیبِ مشخصِ برنامه قربانی/سنیتایزر (sanitizers)، یک نمایشِ مفید از دستور زبان را میآموزد (مرهون کاربرد مدلهای BERT) و بدین ترتیب عملگرهای جهشسازِ پایبند به دستور زبان تولید میکند — که به نوبه خود تضمین میکند بردارهای حمله تولیدشده نیز با دستور زبان سازگاری داشته باشند. حلقه یادگیری تقویتی (RL) این امکان را به ابزار میدهد که نقاط ضعف برنامه قربانی را واکاوی کرده و به صورت اکتشافی و کارآمد در میان انفجار ترکیبیِ گونههای ممکنِ یک کلاس از بردارهای حمله جستوجو کند تا نمونههایی را بیابد که احتمال موفقیت بالاتری دارند. ترکیبِ مدل BERT و حلقه RL فرایند را به طور کامل خودکار میسازد. ابزار BERTRLFUSZER نهتنها به تغییراتِ ممکنِ یک کلاس خاص از بردارهای حمله مینگرد، بلکه بهسادگی میتواند — با داشتن مجموعه مناسبی از ورودیهای اولیه برای یادگیری — برای سایر کلاسهای آسیب پذیریهای امنیتی نیز سازگار و توسعه باشد.
۳.۱ مثالی از یک حمله (Example of an Attack)
برای روشنتر شدن مطلب، مثال ساده شکل ۱ را در نظر بگیرید. یک وبسایتِ هدف برای وجود آسیب پذیری SQLi مورد بررسی قرار گرفته است. آن وبسایت دارای یک سنیتایزر تعریفشده توسط انسان است که ورودی کاربر را در برابر الگوی تاتولوژی — جایی که دو عدد برای برابری بررسی میشوند — رد میکند. BERTRLFUSZER بیخبر از این پاکسازی یا سنیتایزر در برنامه وب، یک بردار حمله کاندیدا تولید میکند: ’ OR 1 = 1 ; — ، پس از تغییر یک ورودیِ اولیه مشخص، این بردار به محیطِ آزمایشی ارسال میشود. همانطور که انتظار میرود، سنیتایزر آن ورودی را رد میکند و عامل یادگیری تقویتی (RL agent) بهخاطر انتخاب آن عملگر جهش، جریمه دریافت میکند. در گام بعدی، عامل RL یک عملگر جهش متفاوت را امتحان میکند: عبارت 1 = 1 را با ’a’ = ’a’ جایگزین میکند و بردار حمله جدید و سازگار با گرامر را تولید مینماید: ’ OR ’a’ = ’a’ ; — ، این بار، رشته ورودی توانایی عبور از سنیتایزر را دارد و حمله با موفقیت اجرا میشود. قابل ذکر است که BertRLFuzzer هرگز روی ورودیِ اولیه – ’ OR ’a’ = ’a’ ; — آموزش داده نشده بود — این ابزار عبارتِ ’a’ = ’a’ را با استفاده از یک ورودیِ اولیه متفاوت یاد گرفته بود:
(IF (’a’ = ’a’) THEN dbms_lock.sleep(5); ELSE dbms_lock.sleep(0); END IF; END;)
و سپس آن را برای ساختن یک حمله تاتولوژی بهطور سازگار تطبیق داد. به عبارت دیگر، BertRLFuzzer حتی زمانی که ورودیهای اولیه تنها بخشی از گرامر ورودی را پوشش دهند، باز هم عملکرد خوبی دارد. در مثال بالا، ورودیِ اولیه الگوی حمله تاتولوژیِ مبتنی بر رشتهها (مثلاً –;’ OR ’a’ = ’a’) را ندارد و تنها الگوی تاتولوژیِ مبتنی بر اعداد (مثلاً –; OR 1 = 1’) را شامل میشود. با این حال، همانطور که در شکل ۱ نشان داده شد، مدل باز هم قادر است یک حمله تاتولوژی مبتنی بر رشته را بسازد. حلقه RL به مدل اجازه میدهد تا عملیاتهای جهش متفاوت را کاوش کند، و انتخاب ’a’ = ’a’ را انجام میدهد زیرا این توکن در واژنامه مدل BERT موجود است. مزیتِ جستجوی خودکار در فضای الگوهای حمله — در مقایسه با ایجاد تغییر دستی بردارهای حمله توسط انسان — این است که چنین فرایندی شناساییِ نقاط ضعف بالقوهای را آسانتر میکند که یک توسعهدهنده معمولی ممکن است آنها را نادیده بگیرد.
۴. BertRLFuzzer
در این بخش، مروری بر رفتار ورودی-خروجی و جزئیات عملکرد داخلی ابزار BertRLFuzzer ارائه شده است (برای مشاهده جزئیات معماری به شکل ۲ مراجعه کنید).
۴.۱ ورودی و خروجی BertRLFuzzer (Input and Output of BertRLFuzzer)
با فرض داشتن یک برنامه هدف (A) و مجموعهای (S) از ورودیهای اولیه (seed inputs)، BertRLFuzzer برای برنامه هدف (A) یک عملگر جهش که «به دستور زبان پایبند» است و همچنین یک بردار حمله متناظر (یعنی همان عملگر، یک ورودی اولیه را به یک بردار حمله تبدیل میکند) تولید میکند. ممکن است یک ورودی اولیه واحد توسط چندین عملگر جهش مختلف که BertRLFuzzer تولید میکنند، چند بار دستخوش جهش گردد تا در نهایت بهعنوان یک بردار حمله شناسایی شود.
فهرست ورودیهای بذر (seed inputs): کاربر فهرستی از ورودیهای اولیه را فراهم میکند که این ورودیها باید با دستور زبان مربوطه مطابقت داشته و نمونههایی از یک کلاس شناختهشده از بردارهای حمله باشند (نمونههایی که بهراحتی در منابع عمومی یافت میشوند). ورودیهای اولیه باید نماینده واژگان و گرامرِ آن کلاس از بردارهای حمله باشند — بهعنوان نمونه، اگر مدل هیچگاه حملهای با الگوی UNION را ندیده باشد، نمیتواند خودبهخود یک حمله مبتنی بر UNION تولید کند. الگوهای رایج حمله به عنوان دادههای پیشآموزشی برای مدل BERT و نیز به عنوان ورودی بذر (seed inputs) برای BertRLFuzzer بهکار میروند. هدف این است که ابزار بتواند نمایش معناداری از گرامر ورودی و الگوهای حمله بیاموزد و سپس بهطور خودکار بردارهای حمله مناسب و مختص برنامه هدف تولید کند.
برنامه هدف (Victim Application): برنامه تحت وبی که در حال آزمون میباشد و قرار است برای وجود آسیب پذیریهای امنیتی بررسی گردد. توجه شود که تکنیک یادگیری تقویتیِ بهکار گرفتهشده در BertRLFuzzer به آن امکان میدهد بردارهای حملهای تولید کند که بهصورت ویژه برای یک برنامه یا سنیتایزر (sanitizer) خاص مناسب باشند.
بردار حمله (Attack vector): برای یک برنامه هدف مشخص، بردار حمله به هر رشته ورودی گفته میشود که ممکن است بتواند از آسیب پذیریهای امنیتی آن برنامه سوءاستفاده کند.
۴.۲ جزئیات معماری BertRLFuzzer
پیشپردازش (Preprocessing): در این مرحله، ابتدا فهرست ورودیهای بذر (seed inputs) با استفاده از یک توکنساز یا tokenizer استاندارد NLTK (Group 2022a) به صورت مناسب توکنبندی میشود. n-gramهای پرکاربرد نیز به فهرست واژگان افزوده میشوند. در نهایت نام جداول و ستونهای SQL با توکنهای تعمیمیافته (generalized tokens) جایگزین میگردند تا از آموزش پیشینِ پر سروصدا جلوگیری شود.
فیلتر بذرهای باندیت چنداهرمی (Multi-armed Bandit – MAB Seed Filter): در این گام از یک عامل MAB با نمونهبرداری تامسون (Thomson sampling) برای انتخاب یک ورودی اولیه از بین ورودیهای پیشپردازش شده استفاده میشود. این عامل RL که مستقل از حلقه اصلی RL در BertRLFuzzer است، کمک میکند ابزار در کمینههای محلی گیر نکند — مشکلی که عمومِ فازینگ با آن مواجه است. در طول آموزش، عامل MAB میآموزد کدام ورودی اولیه احتمال تولید بردار حمله موفق بیشتری دارد.
Actor–Critic Proximal Policy Optimization (PPO): ورودی اولیه منتخب به عامل Actor–Critic PPO در BertRLFuzzer تحویل داده میشود. بهعنوان بلوک ساختاری، عامل Actor–Critic از یک مدل BERT از پیشآموزشدیده استفاده میکند. این مدل BERT توسط مؤلفه RL تنظیم دقیق میشود تا عملگرهای جهش مناسب را طبقهبندی کند.
مدل BERT رشته ورودی توکن شده را به یک نمایش برداری رمزگذاری میکند. میتوان اکشن های عامل را بهصورت یک جفت زیر-عمل تقسیم کرد:
- انتخاب موقعیت در فهرست توکنشده که باید جهش کند (حذف/درج/جایگزینی).
- انتخاب توکن مناسب که باید در آن موقعیت جایگزین شود.
عامل RL، اکشن ها را از توزیعهای احتمالاتی نمونهبرداری میکند. این اکشن به یک جهش دهنده داده میشوند تا یک بردار حمله کاندید تولید شود و به محیط آزمون ارسال گردد. بسته به موفقیت یا عدم موفقیت بردار حمله، به عامل RL پاداش یا مجازات تعلق خواهد گرفت. پارامترهای عامل PPO میزان یادگیری، نرخ تخفیف، و… مطابق با مقاله مبنا تنظیم شده است. با تکرار این چرخه و آموزش مستمر، BERTRLFuzzer عملگرهای جهش مؤثری را برای برنامه مورد آزمون میآموزد و بهبود میبخشد.
۴.۳ محیط آزمایش (Testing Environment)
پژوهشگران چندین محیط وب مختلف ایجاد میکنیم که شامل صفحات وبی هستند که به انواع مختلف حملات SQLi و XSS آسیب پذیرند. بیشتر صفحات وب همچنین شامل بررسیهای اعتبارسنجی ورودی و سنیتایزرها (مثلاً با استفاده از عبارات منظم) هستند. این صفحات وب بهعنوان محیطی برای آموزش الگوریتم BertRLFuzzer ما عمل میکنند.
با استفاده از خزندۀ سفارشی خود، صفحات وب را پارس کرده و نقاط تزریق (برای مثال، فیلدهای ورودی کاربر) را استخراج میکنیم. یک کتابخانه آداپتور نیز پیادهسازی شده تا رشته کاندیدای حمله را به محیط آزمایشی ارسال کند. این کتابخانه همچنین مسئول ارسال بازخورد به عامل است — از قبیل اینکه آیا آخرین ورودی آزمایشی منجر به یک حملۀ موفق یا ناموفق شد و آیا رشته ارسالی قابل پارس بوده است یا خیر. برای آشکارسازی آسیب پذیریها و تأیید وجود آنها، از روشهای استانداردِ محققان پیشین (مانند DeepSQLi (Liu, Li, and Chen 2020) و Ardilla (Kieyzun et al. 2009)) استفاده شده و نتایج با بازبینی دستیِ کد تصدیق گشته است.
۴.۴ جزئیات پاداش و جریمه (Details of Reward and Penalty)
عاملهای BERT و MAB در BertRLFuzzer در صورت وقوع یک حمله موفقِ SQLi یا XSS از محیط، یک سیگنال پاداش گسسته دریافت میکنند. با این حال این پاداش نادر (sparse) است و اگر تنها به این بازخورد باینری تکیه کنیم، یادگیریِ الگوریتم زمانبر خواهد بود. بنابراین برای موارد ناموفق، جریمههای متفاوت (گسسته) معرفی شده است. پس از اینکه موتور فازینگ، رشته جهشیافتهء جدید را تولید میکند، آن رشته را به یک پارسر (تجزیهگر) میدهد تا بررسی کند آیا عبارت حاصل شده، خوبساخت (well-formed) است یا خیر. اگر نباشد، به عامل بابت آخرین اقداماتش جریمهای تعلق میگیرد. علاوه بر این، برای رسیدن به یک رشته موفق در کمترین تعداد گامِ جهش، اگر رشته پارسر را پاس کند اما آداپتور اعلام کند که حمله موفق نبوده، جریمه کوچکی اعمال میکنیم. در نهایت، برای تشویق کشف خطاهای منحصربهفردتر، جریمهای برای تولید رشتهای که قبلاً مشاهده شده نیز وضع کردیم (قابل ذکر است که میتوانستیم از پارسرهایی استفاده کنیم که خودِ برنامههای قربانی الزاماً دارند — همان کاری که اغلب توسعهدهندگانِ برنامه و کاربران BertRLFuzzer احتمالاً انجام میدهند. تنها دلیلی که ما یک تجزیهگر (Parser) نوشتیم این بود که نخواستیم برنامه قربانی را تغییر دهیم و به اینترتیب خطاهای جدیدی معرفی کنیم یا آن را بهنحوی خراب کنیم.)
۴.۵ جمعبندی: نحوه عملکرد BertRLFuzzer
در ابتدا، تولیدکننده ورودیهای بذر BERTRLFUSZER، نمونهها را از فهرستی از ورودیهای بذر (که نمونههایی از یک کلاسِ شناخته شده آسیبپذیری هستند) تولید میکند؛ این نمونهها پیشپردازش و توکنایزه میشوند. عامل MAB یک ورودی اولیه را از فهرست فیلتر و انتخاب کرده و آن را به عامل PPO از نوع BERT Actor–Critic که از قبل آموزشدیده شده میفرستد. عامل PPO یک عملگر جهشِ پایبند به گرامر پیشبینی میکند که سپس برای ساخت یک بردار حمله کاندیدا بهکار میرود. این بردار کاندیدا به وبسایتِ هدف در محیطِ آزمایشی ارسال میشود و سیگنال پاداش/جریمه را به عاملهای RL برمیگرداند. زمانِ موفقیت وقتی است که بردار حمله مدعی توانایی راهاندازی حمله روی برنامه هدف را بهطور واقعی داشته باشد. در صورت دریافت پاداش (یا جریمه)، عاملهای RL توزیع احتمال را تعدیل میکنند تا آن عملگر جهش را برای آن حالت ترجیح دهند (یا رد کنند). بردار کاندیدای که قبلاً جهش یافته بود اکنون بهعنوان ورودی برای عامل PPO استفاده میشود تا عملگرهای جهش جدیدی را پیشبینی کند. این حلقه چندین بار تکرار میشود، سپس رشته ورودی فعلی کنار گذاشته شده و یک ورودی جدید از عامل MAB انتخاب میگردد. فرایند فازینگ وقتی متوقف میشود که زمان تعیینشده (timeout) یا تعداد دورهای (epoch) مطلوب سپری شود.
۵. تنظیمات آزمایش (EXPERIMENT SETUP)
۵.۱ فازرهای رقبا (Competing Fuzzers)
پژوهشگران، BertRLFuzzer را با مجموعاً ۱۳ فازر جعبهسیاه (Black box fuzzers) و جعبهسفید (White box fuzzers) شامل فازرهای مبتنی بر ML و غیرِ ML مورد بررسی و قیاس قرار دارند. فازرهای جهشمحورِ جعبهسیاه مبتنی بر یادگیری ماشین که در این آزمایشها استفاده شدهاند عبارتاند از:
- DeepSQLi – (Liu, Li, and Chen 2020): ورودیهای کاربر (یا یک مورد آزمایشی) را به یک مورد آزمایشی جدید تبدیل میکند که از نظر معنایی مرتبط و بهدلیل تواناییِ یادگیری «دانشِ معنایی» نهفته در حملات SQLi بالقوه پیچیدهتر است. یک شبکه تبدیلکننده توالی-به-توالی روی یک مجموعهداده آموزشی دستنویس و پایبند به گرامر آموزش داده میشود تا عملیاتهای جهش را بازتولید کند و بردارهای حمله مؤثرتری که احتمالاً حمله را برمیانگیزند، تولید نماید.
- DeepFuzz (تعدیل شده) – (Liu et al. 2019a): یک شبکه عصبی بازگشتی (RNN) است که توسط پژوهشگران برای پشتیبانی از حملات SQLi و XSS با استفاده از Deep Q-Network (DQN) اصلاح شده است. این مدل عملگرِ جهش را پیشبینی میکند، یعنی یک دنباله عملیات که یک ورودیِ بنبستِ پیرویکننده از دستور زبان را گرفته و آن را برای یک برنامه قربانی مشخص به یک بردار حمله تبدیل مینماید.
- فازر DQN – (Zhou et al. 2021; Erdodi, Sommervoll, and Zennaro 2021: یک مدل Q-Network عمیق (Deep Q-Network) که عملگرهای جهش را پیشبینی میکند و این عملگرها برای الگوهای خاصِ حمله طراحیشدهاند.
- DeepXSS (اصلاحشده) – (Fang و همکاران، ۲۰۱۸): برای طبقهبندی XSS با استفاده از شبکههای حافظه کوتاهمدت طولانی (LSTM) طراحی شده است. پژوهشگران آن را اصلاح کردند تا از فازینگ با استفاده از DQN برای پیشبینی عملگر جهش با استفاده مجدد از شبکههای LSTM موجود پشتیبانی کند.
- DeepFix (اصلاحشده) (گوپتا و همکاران، ۲۰۱۷): ابزار DeepFix اصلاح شده است تا از کامپوننت GRU آن بهعنوان یک فازر برای هر دو نوع حمله SQLi و XSS استفاده شود؛ در این نسخه اصلاح شده، از DQN برای پیشبینی عملگرِ جهش استفاده میشود.
- فازر GRU-PPO: یک عامل یادگیری تقویتی (RL) مبتنی بر واحد بازگشتی دروازهای (GRU) همراه با الگوریتم Proximal Policy Optimization (PPO) طراحی و پیادهسازی شد تا عملگرِ جهش (mutation operator) را پیشبینی کند.
- فازر Multi-head DQN: یک عامل DQN مبتنی بر مکانیزم خودتوجهیِ چندسر (Multi-head self-attention) ایجاد شده است تا عملگر جهش (mutation operator) را پیشبینی کند.
فازرهای مختلفِ دستنویسِ سازگار با دستور زبان که در آنها گرامرِ برنامههای قربانی به صورت صریح و توسط انسان تعریف شده است و در آزمایشهای ما مورد استفاده قرار گرفتهاند، عبارتاند از:
- BIOFuzz – (Thomé, Gorla, and Zeller 2014): ابزاری مبتنی بر جستوجو که موارد آزمایشی را با استفاده از توابع متناسب مبتنی بر گرامرهای مستقل از متن (context-free grammar) تولید میکند.
- SQLMap – (Group 2022b): از نحو (Syntax) از پیش تعریف شده برای تولیدِ مواردِ آزمایشی استفاده میکند و هیچگونه مؤلفه یادگیری فعال (active learning) ندارد.
- Baseline Grammar Mutator: یک مولد مبتنی بر گرامر همراه با یک جهشگر (mutator) مبتنی بر همان دستور زبان است که توسط یکی از نویسندگان این مقاله طراحی و پیادهسازی شده است.
علاوه بر این، مقایسهای نیز با یک فازر جعبه سفید محبوب به نام Ardilla انجام شده است که از اجرای نمادین برای یافتن آسیبپذیریهای SQLi و XSS در برنامههای PHP/MySQL استفاده میکند. در نهایت، پژوهشگران دو فازر پایه (baseline) ایجاد کردند: یک جهشگر تصادفی پایه که از یک مولد مبتنی بر گرامرِ نوشتهشده توسط انسان با جهشهای تصادفی بهره میبرد، و یک فازر تصادفی پایه که ورودیهای رشتهایِ تصادفی تولید میکند.
۵.۲ معیارها و محیط محاسباتی (Benchmarks and Computational Environment)
برای انجام یک مقایسه منصفانه با DeepSQLi و SQLmap، از همان چهار بنچمارکی استفاده کردیم که توسط نویسندگان آنها بهکار گرفته شده است [30]. به همین ترتیب، برای مقایسه با BIOFuzz و Ardilla نیز از همان چهار بنچمارکی استفاده کردیم که در مقالات نویسندگان این ابزارها معرفی شدهاند [26, 45]. برای کسب اطلاعات بیشتر درباره این بنچمارکها، به مقالات مربوطه مراجعه کنید.
علاوه بر این، یک برنامه وب سفارشی مبتنی بر PHP با پایگاه داده MySQL و همچنین چند برنامه وب کوچک مبتنی بر فریمورک Flask با موتور پایگاه داده SQLite ایجاد کردیم که دارای آسیبپذیریهای تزریق SQL (SQL Injection – SQLi) و اسکریپتنویسی بینسایتی (Cross-Site Scripting – XSS) هستند.
این بنچمارک شامل انواع مختلفی از باگها است و همچنین از فیلترهای پاکسازی مبتنی بر عبارات باقاعده (Regex Sanitizers) استفاده میکند؛ قابلیتی که در بسیاری از بنچمارکهای دیگر وجود ندارد. فرآیند آموزش مدلها روی سیستمی با مشخصات پردازنده Intel Core i7 نسل هشتم با فرکانس 3.20 گیگاهرتز، 32 گیگابایت حافظه RAM و سیستمعامل 64 بیتی Ubuntu 18 Desktop به منظور حذف هرگونه سوگیری (Bias)، تمامی ابزارهای مبتنی بر یادگیری ماشین با ورودی بذر (Seed Input) یکسان، مدت زمان آموزش یکسان و بر روی سختافزار یکسان اجرا و ارزیابی شدند.
۵.۳ معیارهای ارزیابی (Metrics)
معیارهای مورد استفاده در این پژوهش، پیشتر نیز بهطور گسترده در این حوزه بهکار گرفته شدهاند [6، 26، 30، 45] و بهعنوان شاخصهای مهمی برای کشف آسیبپذیریهای برنامههای کاربردی وب و ارزیابی اثربخشی فازرها محسوب میشوند. ابزارهای مورد بررسی بر اساس معیارهای زیر ارزیابی شدند:
• زمان تا اولین حمله (Time to First Attack): مدتزمان بر حسب ثانیه تا تولید نخستین بردار حمله (Attack Vector) که یک آسیبپذیری را آشکار میکند.
• فیلدهای منحصربهفرد (Unique Fields): تعداد فیلدهای منحصربهفرد وبسایت که ابزار در آنها موفق به کشف آسیبپذیری شده است.
• آسیبپذیریهای کشف شده (Vulnerabilities Found): تعداد دستههای متمایز خطاهای شناساییشده؛ برای مثال، جفتهای منحصربهفردی از پارامترهای ورودی و دستورات SQL در حملات SQL Injection. بردارهای حمله شامل دستورات INSERT، UNION یا UPDATE بهعنوان دستههای مجزا شمارش میشوند.
• جریمه تجزیهکننده (Parser Penalties): نسبت تعداد رشتههای کاندید که توسط تجزیهکننده (Parser) رد شدهاند به کل رشتههای کاندید تولیدشده.
• نرخ حمله یا نرخ خطا (Attack Rate / Error Rate): نسبت تعداد رشتههای کاندید که منجر به یک حمله موفق شدهاند به کل رشتههای کاندید تولیدشده.
• زمان (Time): زمان واقعی پردازنده (CPU Wall Clock Time) بر حسب ثانیه که برای کشف تمامی آسیبپذیریها صرف شده است.
۶. ارزیابی (EVALUATION)
ارزیابی تجربی ما از BertRLFuzzer با هدف پاسخگویی به پرسشهای پژوهشی زیر انجام شده است:
RQ1 (اثربخشی و کارایی BertRLFuzzer در مقایسه با فازرهای پیشرفته موجود): BertRLFuzzer در مقایسه با سایر فازرهای مبتنی بر یادگیری ماشین و غیرمبتنی بر یادگیری ماشین، از نظر معیارهایی مانند زمان تا اولین حمله (Time to First Attack)، فیلدهای منحصربهفرد (Unique Fields)، آسیبپذیریهای کشفشده (Vulnerabilities Found)، جریمه تجزیهکننده (Parser Penalties) و سایر معیارهای ارزیابی، چه عملکردی دارد؟
RQ2 (مطالعات حذف مؤلفهها – Ablation Studies): حذف یا اضافهکردن مؤلفههای مختلف BertRLFuzzer چه تأثیری بر عملکرد این ابزار دارد؟
RQ3 (قابلیت تعمیم BertRLFuzzer به دستههای مختلف حملات و برنامههای هدف): BertRLFuzzer تا چه میزان قابلیت تعمیم به انواع دیگر حملات و برنامههای کاربردی هدف (Victim Applications) را دارد؟
6.1 پرسش پژوهشی اول (RQ1): اثربخشی و کارایی در مقایسه با فازرهای پیشرفته موجود (Efficacy/Efficiency against
State-of-the-art Fuzzers)
ما ابزار خود را با فازرهای مختلف مبتنی بر یادگیری ماشین و غیرمبتنی بر یادگیری ماشین مقایسه کردیم. تمامی این ابزارها بر روی ۹ برنامه کاربردی وب اجرا شدند و برای هر ابزار یک محدودیت زمانی کلی ۳۰ دقیقه در نظر گرفته شد. بهمنظور جلوگیری از سوگیری در نتایج، تمامی ابزارهای مبتنی بر یادگیری ماشین با ورودی بذر (Seed) یکسان، مدتزمان آموزش یکسان و بر روی سختافزار یکسان مورد ارزیابی قرار گرفتند. همچنین، برای امکانپذیر شدن مقایسهای منصفانه میان تمامی ابزارهای موجود، لازم بود برخی از این ابزارها را مطابق توضیحات ارائهشده در بخش ۵ اصلاح کنیم. ابزارها بر اساس معیارهای زمان تا اولین حمله (Time to First Attack)، فیلدهای منحصربهفرد (Unique Fields)، تعداد آسیبپذیریهای کشفشده (Number of Vulnerabilities Found) و جریمه تجزیهکننده (Parser Penalties) ارزیابی شدند.
نتایج نشان میدهد که BertRLFuzzer از نظر زمان تا اولین حمله (Time to First Attack)، فیلدهای منحصربهفرد (Unique Fields) و تعداد آسیبپذیریهای کشفشده (Vulnerabilities Found) عملکرد بهتری نسبت به تمامی ابزارهای دیگر دارد (جدول ۱). بهطور مشخص، بر اساس معیار زمان تا اولین حمله، ابزار ما ۵۴ درصد سریعتر از نزدیکترین رقیب خود عمل کرده و موفق به کشف ۱۷ آسیبپذیری جدید در ۱۳ فیلد منحصربهفرد جدید شده است.
تنها معیاری که در آن BertRLFuzzer از تمامی ابزارهای دیگر پیشی نگرفته، جریمه تجزیهکننده (Parser Penalties) است. در این معیار، BertRLFuzzer امتیاز ۵٪ را کسب کرده، در حالی که فازر مبتنی بر جهش سازگار با گرامر (Grammar-Adhering Mutation Fuzzer) که توسط ما پیادهسازی شده است، امتیاز ۰٪ دارد. این نتیجه قابل انتظار است؛ زیرا در فازر مبتنی بر گرامر، گرامر بهصورت صریح تعریف شده است، در حالی که BertRLFuzzer با دقت بالا، نمایش مناسبی از گرامر برنامه هدف را بهصورت خودکار یاد گرفته است.
علاوه بر این، اگرچه فازر مبتنی بر گرامر دارای نرخ خطای تجزیه صفر است، اما قادر به کشف هیچ آسیبپذیریای در برنامه کاربردی وب نیست. دلیل این موضوع آن است که فضای ورودیهایی که فازر باید در آن جستوجو کند بسیار عظیم است و یک جستوجوی بدون هدایت در چنین فضایی عملاً محکوم به شکست است.
در مقابل، BertRLFuzzer قادر است بر اساس تعمیم الگوهای مشاهدهشده قبلی، بهصورت اکتشافی (Heuristically) بردارهای حمله تولید کند و بدین ترتیب فضای جستوجو را بهطور چشمگیری کاهش دهد. لازم به ذکر است که توسعهدهندگان وب معمولاً به چنین بردارهای حملهای علاقهمند هستند؛ زیرا ممکن است تنها برخی الگوهای ساده را در نظر گرفته باشند، اما ترکیبهای مختلف این الگوها را که همچنان میتوانند بردار حمله محسوب شوند، از قلم انداخته باشند.
فازر DQN [14, 51] تنها کاراکترهای فرار (Escape Characters) را پیشبینی کرده و بر روی دو الگوی حمله سازگار با گرامر، برای تولید بردارهای حمله تزریق SQL (SQL Injection)، عملیات افزودن یا حذف نام ستونها را انجام میدهد. بنابراین، با وجود حفظ دستور زبان، این فازر تنها قادر به تولید بردارهای حمله ساده مبتنی بر UNION و Tautology است.
مشاهده میکنیم که ابزارهای مبتنی بر گرامر و غیرمبتنی بر یادگیری ماشین کارایی محدودی دارند؛ زیرا قادر نیستند «یاد بگیرند» چگونه جهشهایی تولید کنند که منجر به ایجاد بردارهای حمله شوند و در نتیجه به جستوجوی بدون هدایت (Unguided Search) متکی هستند.
فازر DQN که یک فازر مبتنی بر یادگیری تقویتی (RL-Based Fuzzer) است، بهراحتی قابل تعمیم نیست؛ زیرا لازم است یک الگوی معمول تولیدکننده حمله (برای مثال، یک رشته عمومی مبتنی بر UNION برای حملات SQL Injection) و همچنین عملیات جهش اختصاصی مربوط به آن الگو از پیش تعریف شوند. افزون بر این، در صورت نبود چنین آسیبپذیریهایی، این ابزار قادر به شناسایی بردارهای حمله جدید نخواهد بود.
فازرهای تصادفی (Random Fuzzers) بیشترین میزان جریمه تجزیهکننده (Parser Penalties) را ایجاد میکنند و هیچ آسیبپذیریای را کشف نمیکنند؛ زیرا رشتههایی تولید نمیکنند که با گرامر مورد انتظار سازگار باشند.
سایر فازرهای مبتنی بر یادگیری ماشین، از جمله DeepFuzz، DeepXSS و DeepFix، برای ایجاد مجموعهداده آموزشی برچسبگذاری شده (Labeled Training Dataset) به مداخله دستی نیاز دارند؛ موضوعی که انطباق آنها با حملات جدید را بدون دانش تخصصی قبلی دشوار میسازد.
حتی با استفاده از یک روش یادگیری تقویتی مانند DQN برای حذف نیاز به ایجاد مجموعهداده آموزشی در حملات ناشناخته، بیشتر رشتههای کاندید تولیدشده پس از جهش از گرامر آگاه نیستند (همانگونه که افزایش جریمه تجزیهکننده نشان میدهد). این مسئله باعث میشود زمان زیادی در مرحله تجزیه (Parsing) هدر رفته و فرایند فازینگ در آن مرحله متوقف شود.
در مقابل، ابزار ما خودکار است (اپراتورهای جهش را بدون دخالت انسان یاد میگیرد)، سازگار با دستور زبان است (بردارهای حملهای تولید میکند که با دقت بالا از دستور زبان برنامههای هدف پیروی میکنند)، اثربخش است (در مقایسه با ابزارهای پیشرفته رقیب، آسیبپذیریهای امنیتی بیشتری را کشف میکند) و کارآمد است (زمان تا اولین حمله در آن پایین است).
6.2 پرسش پژوهشی دوم (RQ2): مطالعات حذف مؤلفهها (Ablation Studies)
ما از همان برنامههای کاربردی وب مورد استفاده در بخش قبل بهره گرفتیم و یک مطالعه حذف مؤلفهها (Ablation Study) انجام دادیم تا مشاهده کنیم هر یک از اجزای BertRLFuzzer چه نقش مهمی در عملکرد آن ایفا میکنند. نتایج نشان میدهد که استفاده از یک مدل مبتنی بر توجه (Attention) بهجای یک مدل بازگشتی مبتنی بر GRU، منجر به دستیابی سریعتر به اولین حمله، کاهش جریمه تجزیهکننده (Parser Penalties) و افزایش میزان کشف آسیبپذیریها شده است (جدول ۲).
افزودن یک عامل PPO (Proximal Policy Optimization) با سیگنالهای پاداش بهبودیافته (بخش 4.4) به حلقه یادگیری تقویتی (RL) در BertRLFuzzer، باعث افزایش قابلتوجه تعداد فیلدهای منحصربهفرد (+5) و آسیبپذیریهای کشفشده (+9) شده است. این نتیجه نشان میدهد که استفاده از یک سیگنال پاداش بهبودیافته به BertRLFuzzer کمک میکند تا فضای جستوجو را به شکل مؤثرتری کاوش کند.
همچنین، در مقایسه با نسخه مبتنی بر Deep Q Network (DQN)، بهبودهای آشکاری مشاهده میشود؛ زیرا PPO توانایی بیشتری در مدیریت فضاهای بزرگ اعمال (Large Action Spaces) و پاداشهای پراکنده (Sparse Rewards) دارد.
افزون بر این، استفاده از یک مدل BERT بهعنوان عامل یادگیری تقویتی، در مقایسه با یک عامل RL معمولی، موجب کاهش چشمگیر جریمه تجزیهکننده (-13٪) شده است. این نتیجه نشان میدهد که بهکارگیری مدل BERT باعث میشود BertRLFuzzer در مقایسه با روشهای مشابه، بهمراتب سازگاری بیشتری با دستور زبان داشته باشد.
همچنین، فیلترکردن ورودیهای بذر (Seed) با استفاده از یک باندیت چند اهرمی (Multi-Armed Bandit)، زمان دستیابی به اولین حمله را 13.56٪ کاهش داده است. همانگونه که در BanditFuzz نیز مشاهده شده است، مدلهای یادگیری تقویتی تکعاملی (Single-Agent RL Models) ممکن است در کمینههای محلی (Local Minima) گیر کرده و زمان بیشتری برای یافتن یک بردار حمله موفق صرف کنند. ازاین رو، استفاده از یک عامل ثانویه سبک میتواند یاد بگیرد که کدام بذر (Seed) با احتمال بیشتری به یک حمله موفق منجر خواهد شد و در نتیجه عملکرد بهتری نسبت به انتخاب قطعی (Deterministic) یا تصادفی بذرهای (Seed) ورودی ارائه دهد.
جدول ۱: نتایج مقایسهای فازرهای مبتنی بر یادگیری ماشین (ML) و غیرمبتنی بر یادگیری ماشین (Non-ML)
جدول ۲: تأثیر انتخابهای طراحی — مطالعات حذف مؤلفهها (Ablation Studies)
۶.۳ پرسش پژوهشی سوم (RQ3): قابلیت تعمیم به دستههای مختلف حملات (Extensibility to Different Categories of Attacks)
ما آزمایشهای خود را بر روی دو مجموعه شامل ۸ بنچمارک واقعی (۴ بنچمارک در هر مجموعه) انجام داده و نتایج را با ابزارهای پیشرفته جعبهسیاه (Black-Box) و جعبهسفید (White-Box) مقایسه کردیم. برای نشاندادن اینکه ابزار ما بهراحتی قابل گسترش به دستههای دیگری از حملات، فراتر از تزریق SQL (SQL Injection) است، آن را بر روی یکی از مجموعهبنچمارکهای واقعی که شامل آسیبپذیریهای XSS (Cross-Site Scripting) بودند نیز ارزیابی کردیم. سهولت پیشآموزش (Pre-training) یک مدل سازگار با گرامر (Grammar-Adhering Model) به ابزار ما کمک میکند تا بهسادگی به انواع جدید حملات تعمیم یابد.
نخستین مجموعه بنچمارکها شامل شش برنامه کاربردی وب تجاری و واقعی است که بهطور گسترده توسط پژوهشگران مورد استفاده قرار گرفتهاند. این برنامههای وب به زبان Java توسعه یافتهاند و از پایگاه داده MySQL در سمت پشتیبان (Back-End) استفاده میکنند. ما ابزار BertRLFuzzer را با دو رویکرد جعبهسیاه، یعنی DeepSQLi و SQLMap مقایسه کردیم. نتایج گزارششده توسط DeepSQLi را مجدداً مورد استفاده قرار داده و آزمایشهای خود را ۲۰ بار با همان زیرساخت محاسباتی مورد استفاده در DeepSQLi تکرار کردیم.
ابزار ما بر اساس همان معیارهای مورد استفاده در DeepSQLi ارزیابی شد؛ یعنی نرخ حمله (Attack Rate) یا نرخ خطا (Error Rate) و زمان واقعی پردازنده (CPU Wall Clock Time). نتایج نشان داد که ابزار ما بهطور قابلتوجهی عملکرد بهتری نسبت به هر دو ابزار دارد و ضمن کشف تمامی آسیبپذیریهای گزارششده توسط نویسندگان این ابزارها، نرخ خطایی بین 1.91 تا 4.38 درصد بیشتر از نزدیکترین رقیب به دست آورده است؛ آن هم در کمتر از نصف زمان موردنیاز برای کشف همه آسیبپذیریها (جدول ۳).
برای مجموعه دوم بنچمارکها (جدول ۴)، ابزار خود را با ابزار جعبهسفید Ardilla و ابزار جعبهسیاه مبتنی بر آزمون تکاملی BIOFuzz مقایسه کردیم. ما از همان مطالعات موردی (مجموعه بنچمارک) مورد استفاده در Ardilla و BIOFuzz بهره گرفتیم و نتایج گزارششده توسط نویسندگان را مجدداً استفاده کردیم؛ زیرا Ardilla بهصورت عمومی در دسترس نیست و BIOFuzz نیز بهشدت قدیمی شده است.
همچنین ارزیابی را با استفاده از همان معیارهای مورد استفاده توسط نویسندگان Ardilla انجام دادیم؛ یعنی تعداد آسیبپذیریهای شناساییشده و زمان اجرا یا زمان اتمام (Timeout) بر حسب ثانیه. Ardilla ابزار نسبتاً قدیمیای است و نویسندگان آن برای تمامی مطالعات موردی، محدودیت زمانی ۳۰ دقیقه در نظر گرفته بودند. ما نیز برای مقایسه منصفانه با BIOFuzz از همان تنظیمات آزمایشی مورد استفاده در آن ابزار بهره بردیم.
ابزار ما موفق شد تمامی آسیبپذیریهای SQL Injection و XSS1 (تزریق اسکریپت بینسایتی مرتبه اول) گزارششده توسط نویسندگان را کشف کند. از آنجا که BIOFuzz تنها از SQL Injection پشتیبانی میکند، نویسندگان آن هیچ نتیجهای برای آسیبپذیریهای XSS1 یا XSS2 (تزریق اسکریپت بینسایتی مرتبه دوم) گزارش نکردهاند.
علاوه بر این، ابزار ما سه آسیبپذیری جدید SQL Injection را نیز کشف کرد که توسط Ardilla گزارش نشده بودند اما در نتایج BIOFuzz وجود داشتند. این موضوع نشان میدهد که ابزار ما قادر به شناسایی الگوهای حمله متفاوتی برای آسیبپذیریهای SQL Injection است.
از سوی دیگر، ابزار ما نتوانست چهار آسیبپذیری XSS2 گزارششده توسط Ardilla را شناسایی کند. حملات XSS مرتبه دوم (Second-Order XSS) بهدلیل آنکه ایجاد آنها به یک توالی از ورودیها وابسته است، کشف دشوارتری دارند. بنابراین، فازرهای جعبهسفید مبتنی بر حلکننده SMT (SMT Solver) مانند Ardilla میتوانند این رشتههای آزمون را با سهولت بیشتری استنتاج کنند.
همچنین، ابزار ما تقریباً در تمامی موارد بهطور قابلتوجهی سریعتر عمل کرده و بهبودی بین ۴۰ تا ۶۰ درصد در زمان اجرا نشان داده است؛ بهجز یک مورد که در آن BIOFuzz توانسته بود یک حمله SQL Injection را تنها چند ثانیه سریعتر شناسایی کند.
در نتیجه، میتوان گفت که ابزار ما بهسادگی قابل تعمیم به برنامههای هدف جدید و همچنین دستههای متفاوتی از آسیبپذیریها (مانند XSS) است و میتواند با صرف زمان بهمراتب کمتر، اثربخشی مشابه یک فازر جعبهسفید پیشرفته مانند Ardilla را در کشف آسیبپذیریها ارائه دهد.
جدول ۳: مقایسه با DeepSQLi و SQLmap بر روی معیارهای دنیای واقعی
جدول ۴: مقایسه با BIOFuzz و Ardilla بر روی معیارهای دنیای واقعی
۷. تهدیدهای اعتبار (Threats to Validity)
اعتبار ارزیابی تجربی: ما ابزار خود را با ۱۳ ابزار پیشرفته دیگر بر روی ۹ معیار بزرگ و واقعی که بهطور گسترده توسط نویسندگان ابزارهای رقیب مورد استفاده قرار گرفتهاند [26، 30، 45] مقایسه کردیم. همچنین از معیارهایی استفاده کردیم که در این حوزه به طور گسترده پذیرفته شدهاند [6، 26، 30، 45] و به عنوان شاخصهای مهمی برای کشف آسیبپذیریهای برنامههای کاربردی وب شناخته میشوند. تا آنجا که ما اطلاع داریم، ارزیابی تجربی ارائه شده در این پژوهش، جامعترین و کاملترین ارزیابی انجام شده برای یک ابزار فازینگ از این نوع است.
یادگیری ساختار معنایی و دستور زبانی کلی آسیبپذیریهای برنامههای وب: همانطور که پیشتر اشاره شد، مدلهای BERT قادرند با دقت بالا نوعی بازنمایی از گرامر ورودیهای خود را یاد بگیرند. البته این بدان معنا نیست که انتظار داشته باشیم مدل بتواند گرامر را بهصورت کاملاً بینقص فرا بگیرد. با این حال، مدلهای زبانی مانند BERT با بهرهگیری از مکانیزم توجه (Attention Mechanism) در یادگیری گرامرهای پیچیده، موفقیت تجربی چشمگیری از خود نشان دادهاند. از جمله نمونههای این موفقیت میتوان به ترجمه کد از یک زبان برنامهنویسی به زبان دیگر، سنتز برنامه (Program Synthesis) و درک کد (Code Understanding) اشاره کرد. در تمامی این کاربردها، وجود یک مدل یادگیری ماشین با درک تجربی بسیار دقیق از گرامر، پیشنیاز اساسی موفقیت محسوب میشود. BertRLFuzzer نیز کاربرد دیگری از BERT را ارائه میدهد که توانایی این مدل در یادگیری یک بازنمایی بسیار دقیق از گرامرهای پیچیده را نشان میدهد. در ارزیابیها مشاهده کردیم که BertRLFuzzer میتواند به دقتی تا ۹۵ درصد دست یابد و تنها توسط فازرهای مبتنی بر جهشِ سازگار با گرامر که بهصورت دستی طراحی شدهاند، پشت سر گذاشته میشود.
قابلیت تعمیم BertRLFuzzer: در این مقاله، ابزار خود را بهصورت گسترده بر روی دو کاربرد مستقل و متفاوت، یعنی SQL Injection (SQLi) و Cross-Site Scripting (XSS) ارزیابی کردیم. همانگونه که پیشتر بیان شد، توانایی مدلهای زبانی مانند BERT در یادگیری بازنماییهای تجربی و دقیق از گرامرهای پیچیده و غیرساده (برای مثال، زبانهای برنامهنویسی) نشان میدهد که BertRLFuzzer میتواند بهسادگی به سایر دستههای برنامهها و بردارهای حمله تعمیم داده شود. فرایند فازینگ در BertRLFuzzer بهآسانی قابل تغییر، سفارشیسازی و تطبیق با نیازهای مختلف است. طراح سیستم میتواند با فراهمکردن مجموعهای نظارتشده از نمونههای آموزشی که شامل عملیات جهش خاص و شناختهشده برای الگوهای حمله موردنظر هستند، ابزار را متناسب با اهداف خود تنظیم کند. این الگوهای جهش تعریف شده توسط توسعهدهنده، پیش از آغاز حلقه یادگیری تقویتی (RL)، بهعنوان یک مرحله تنظیم دقیق اولیه (Initial Fine-Tuning) عمل میکنند و به مدل کمک میکنند تا الگوهای حمله مؤثر را سریعتر و بهتر فرا بگیرد. بهطور دقیقتر، برای تعمیم فازر به یک برنامه یا کاربرد جدید، کافی است ورودیهای Seed، مدل BERT از پیشآموزشدیده و محیط مورد آزمون (Program Under Test) جایگزین شوند.
۸. کارهای مرتبط (Related Work)
در حوزه فازینگ، یادگیری تقویتی (Reinforcement Learning – RL) یکی از رویکردهای پرکاربرد برای طراحی انواع مختلف الگوریتمهای فازینگ، بهویژه در زمینه انتخاب عملیات جهش (Mutation Operation Selection)، بوده است [5]. علاوه بر این، مسائل مربوط به آزمون نفوذ (Penetration Testing) نیز پیشتر با استفاده از انتزاعهای مختلف، بهصورت مسائل یادگیری تقویتی مدلسازی شدهاند [20، 40، 50]. در سالهای اولیه، الگوریتم SARSA (State-Action-Reward-State-Action) یکی از گزینههای محبوب برای این منظور بود [3] و پس از آن Q-Learning مورد استفاده قرار گرفت [15].
با گسترش محبوبیت یادگیری عمیق، Deep Q-Learning توسط Bottinger و همکاران [5] برای انتخاب عملیات جهش و توسط Kuznetsov و همکاران [27] برای تحلیل قابلیت بهرهبرداری (Exploitability Analysis) به کار گرفته شد. همچنین، Drozd و همکاران [12] از گونهای دیگر از Deep Q-Learning به نام Deep Double Q-Learning به همراه حافظه بلندمدت کوتاهمدت (LSTM)، که یکی از مدلهای شناختهشده در حوزه پردازش زبان طبیعی است، برای انتخاب عملیات جهش استفاده کردند. بهطور مشابه، μ4SQLi [2] نیز عملیات جهش را بر روی ورودیهای Seed اعمال میکند، اما برای مجموعهای ثابت از الگوهای حمله طراحی شده است. برای مقابله با مشکل بهرهبرداری بیشازحد (Exploitation) که اغلب در روشهای مبتنی بر یادگیری تقویتی مشاهده میشود، برخی پژوهشهای جدید بر بهرهبرداری در محیطهای سادهشده SQL و برای الگوهای حمله و عملگرهای جهش مشخص تمرکز کردهاند [14، 47].
۹. نتیجهگیری (Conclusion)
در این مقاله، BertRLFuzzer را معرفی کردیم؛ یک فازر مبتنی بر یادگیری تقویتی (Reinforcement Learning – RL). BertRLFuzzer نخستین فازر مبتنی بر یادگیری ماشین است که از معماری BERT و یک الگوریتم مبتنی بر یادگیری تقویتی استفاده میکند، بدون آنکه به یک فایل گرامرِ دستنویس یا یک مجموعه داده آموزشی برچسبگذاریشده نیاز داشته باشد.
از طریق یک ارزیابی تجربی گسترده، جامع و دقیق که در آن ابزار ما با ۱۳ فازر بر روی ۹ بنچمارک متفاوت مقایسه شد، نشان دادیم که BertRLFuzzer ابزاری خودکار (Automatic)، قابل تعمیم (Extensible)، سازگار با دستور زبان (Grammar-Adhering)، کارآمد (Efficient) و اثربخش (Effective) است. این ابزار بهویژه برای توسعهدهندگان نرمافزار مفید است؛ زیرا نگارش دستی فازرهای جهشیِ سازگار با گرامر معمولاً فرایندی زمانبر، مستعد خطا و پرهزینه است.
علاوه بر این، BertRLFuzzer در سناریوهایی که توسعهدهندگان برنامه تنها بر اساس بردارهای حمله ساده، مکانیزمهای پالایش یا سنیتایزرهای (Sanitizers) ورودی را طراحی کردهاند و ترکیبهای پیچیدهتر حملات را نادیده گرفتهاند، کارایی بالایی دارد. در مقابل، اگر مجموعهای غنی از بردارهای حمله ساده در اختیار باشد، BertRLFuzzer میتواند ترکیبهای پیچیده الگوهای حمله را یاد بگیرد و در نتیجه، نقاط ضعف موجود در سنیتایزرها (Sanitizer) را بهصورت اکتشافی و کارآمد شناسایی کند.
تا آنجا که ما اطلاع داریم، هیچ فازر مبتنی بر یادگیری ماشین دیگری وجود ندارد که برای حل مشکل نیاز به سازگارسازی فازر با گرامر برنامه هدف یا الزام کاربر به تعریف الگوهای بردار حمله — که فرایندی پیچیده، پرهزینه و مستعد خطاست — بهطور همزمان از معماری BERT و الگوریتمهای یادگیری تقویتی استفاده کرده باشد.
همچنین، از وجود فازر دیگری که بدون نیاز به دخالت انسانی قابلیت تعمیم و گسترش داشته باشد، آگاهی نداریم. در پژوهشهای آینده، میتوان از جستوجوی درختی مونتکارلو (Monte Carlo Tree Search – MCTS) برای کاوش مؤثرتر فضای جستوجو استفاده کرد؛ مشابه رویکردی که در موتورهای مشهور خودبازی (Self-Play Engines) به کار گرفته میشود.
منابع
[1] Miltiadis Allamanis and Charles Sutton. 2013. Mining source code repositories at massive scale using language modeling. In 2013 10th working conference on mining software repositories (MSR). IEEE, 207–216.
[2] Dennis Appelt, Cu Duy Nguyen, Lionel C Briand, and Nadia Alshahwan. 2014. Automated testing for SQL injection vulnerabilities: an input mutation approach. In Proceedings of the 2014 International Symposium on Software Testing and Analysis. 259–269.
[3] Sheila Becker, Humberto Abdelnur, Thomas Engel, et al. 2010. An autonomic testing framework for IPv6 configuration protocols. In IFIP International Conference on Autonomous Infrastructure, Management and Security. Springer, 65–76.
[4] Rishi Bommasani, Drew A Hudson, Ehsan Adeli, Russ Altman, Simran Arora, Sydney von Arx, Michael S Bernstein, Jeannette Bohg, Antoine Bosselut, Emma Brunskill, et al. 2021. On the opportunities and risks of foundation models. arXiv preprint arXiv:2108.07258 (2021).
[5] Konstantin Böttinger, Patrice Godefroid, and Rishabh Singh. 2018. Deep reinforcement fuzzing. In 2018 IEEE Security and Privacy Workshops (SPW). IEEE, 116–122.
[6] Josip Bozic, Bernhard Garn, Dimitris E Simos, and Franz Wotawa. 2015. Evaluation of the IPO-family algorithms for test case generation in web security testing. In 2015 IEEE Eighth International Conference on Software Testing, Verification and Validation Workshops (ICSTW). IEEE, 1–10.
[7] Tom Brown, Benjamin Mann, Nick Ryder, Melanie Subbiah, Jared D Kaplan, Prafulla Dhariwal, Arvind Neelakantan, Pranav Shyam, Girish Sastry, Amanda Askell, et al. 2020. Language models are few-shot learners. Advances in neural information processing systems 33 (2020), 1877–1901.
[8] Cameron B Browne, Edward Powley, Daniel Whitehouse, Simon M Lucas, Peter I Cowling, Philipp Rohlfshagen, Stephen Tavener, Diego Perez, Spyridon Samothrakis, and Simon Colton. 2012. A survey of monte carlo tree search methods. IEEE Transactions on Computational Intelligence and AI in games 4, 1 (2012), 1–43.
[9] Mark Chen, Jerry Tworek, Heewoo Jun, Qiming Yuan, Henrique Ponde de Oliveira Pinto, Jared Kaplan, Harri Edwards, Yuri Burda, Nicholas Joseph, Greg Brockman, et al. 2021. Evaluating large language models trained on code. arXiv preprint arXiv:2107.03374 (2021).
[10] Aakanksha Chowdhery, Sharan Narang, Jacob Devlin, Maarten Bosma, Gaurav Mishra, Adam Roberts, Paul Barham, Hyung Won Chung, Charles Sutton, Sebastian Gehrmann, et al. 2022. Palm: Scaling language modeling with pathways. arXiv preprint arXiv:2204.02311 (2022).
[11] Jacob Devlin, Ming-Wei Chang, Kenton Lee, and Kristina Toutanova. 2018. Bert:Pre-training of deep bidirectional transformers for language understanding. arXiv preprint arXiv:1810.04805 (2018).
[12] William Drozd and Michael D Wagner. 2018. Fuzzergym: A competitive framework for fuzzing and learning. arXiv preprint arXiv:1807.07490 (2018).
[13] Fabien Duchene. 2013. Fuzz in the dark: genetic algorithm for black-box fuzzing. In Black-Hat.
[14] Laszlo Erdodi, Åvald Åslaugson Sommervoll, and Fabio Massimo Zennaro. 2021. Simulating SQL Injection Vulnerability Exploitation Using Q-Learning Reinforcement Learning Agents. arXiv preprint arXiv:2101.03118 (2021).
[15] Kaiming Fang and Guanhua Yan. 2018. Emulation-instrumented fuzz testing of 4G/LTE android mobile devices guided by reinforcement learning. In European Symposium on Research in Computer Security. Springer, 20–40.
[16] Yong Fang, Yang Li, Liang Liu, and Cheng Huang. 2018. DeepXSS: Cross site scripting detection based on deep learning. In Proceedings of the 2018 international conference on computing and artificial intelligence. 47–51.
[17] Zhangyin Feng, Daya Guo, Duyu Tang, Nan Duan, Xiaocheng Feng, Ming Gong, Linjun Shou, Bing Qin, Ting Liu, Daxin Jiang, et al. 2020. Codebert: A pre-trained model for programming and natural languages. arXiv preprint arXiv:2002.08155 (2020).
[18] OWASP Foundation. 2022. Open Web Application Security Project (OWASP). Retrieved December 15, 2022 from https://owasp.org
[19] Ralf Gerlich and Christian R Prause. 2020. Optimizing the parameters of an evolutionary algorithm for fuzzing and test data generation. In 2020 IEEE International Conference on Software Testing, Verification and Validation Workshops (ICSTW). IEEE, 338–345.
[20] Mohamed C Ghanem and Thomas M Chen. 2020. Reinforcement learning for efficient network penetration testing. Information 11, 1 (2020), 6.
[21] Natural Language Toolkit Group. 2022. Natural Language Toolkit. Retrieved December 15, 2022 from https://www.nltk.org
[22] SQLmap Group. 2022. SQLmap. Retrieved December 15, 2022 from https://sqlmap.org
[23] Daya Guo, Shuo Ren, Shuai Lu, Zhangyin Feng, Duyu Tang, Shujie Liu, Long Zhou, Nan Duan, Alexey Svyatkovskiy, Shengyu Fu, et al. 2020. Graphcodebert: Pre-training code representations with data flow. arXiv preprint arXiv:2009.08366 (2020).
[24] Rahul Gupta, Soham Pal, Aditya Kanade, and Shirish Shevade. 2017. Deepfix: Fixing common c language errors by deep learning. In Thirty-First AAAI conference on artificial intelligence.
[25] William GJ Halfond, Alessandro Orso, and Panagiotis Manolios. 2006. Using positive tainting and syntax-aware evaluation to counter SQL injection attacks. In Proceedings of the 14th ACM SIGSOFT international symposium on Foundations of software engineering. 175–185.
[26] Adam Kieyzun, Philip J Guo, Karthick Jayaraman, and Michael D Ernst. 2009. Automatic creation of SQL injection and cross-site scripting attacks. In 2009 IEEE 31st international conference on software engineering. IEEE, 199–209.
[27] Alexandr Kuznetsov, Yehor Yeromin, Oleksiy Shapoval, Kyrylo Chernov, Mariia Popova, and Kostyantyn Serdukov. 2019. Automated software vulnerability testing using deep learning methods. In 2019 IEEE 2nd Ukraine Conference on Electrical and Computer Engineering (UKRCON). IEEE, 837–841.
[28] Marie-Anne Lachaux, Baptiste Roziere, Lowik Chanussot, and Guillaume Lample. 2020. Unsupervised translation of programming languages. arXiv preprint arXiv:2006.03511 (2020).
[29] Caroline Lemieux, Rohan Padhye, Koushik Sen, and Dawn Song. 2018. Perffuzz: Automatically generating pathological inputs. In Proceedings of the 27th ACM SIGSOFT International Symposium on Software Testing and Analysis. 254–265.
[30] Muyang Liu, Ke Li, and Tao Chen. 2020. DeepSQLi: Deep semantic learning for testing SQL injection. In Proceedings of the 29th ACM SIGSOFT International Symposium on Software Testing and Analysis. 286–297.
[31] Xiao Liu, Xiaoting Li, Rupesh Prajapati, and Dinghao Wu. 2019. Deepfuzz: Automatic generation of syntax valid c programs for fuzz testing. In Proceedings of the AAAI Conference on Artificial Intelligence, Vol. 33. 1044–1051.
[32] Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, and Veselin Stoyanov. 2019. Roberta: A robustly optimized bert pretraining approach. arXiv preprint arXiv:1907.11692 (2019).
[33] Valentin JM Manes, HyungSeok Han, Choongwoo Han, Sang Kil Cha, Manuel Egele, Edward J Schwartz, and Maverick Woo. 2018. The art, science, and engineering of fuzzing: A survey. arXiv preprint arXiv:1812.00140 (2018).
[34] Valentin JM Manès, Soomin Kim, and Sang Kil Cha. 2020. Ankou: Guiding grey-box fuzzing towards combinatorial difference. In Proceedings of the ACM/IEEE 42nd International Conference on Software Engineering. 1024–1036.
[35] Antonio Mastropaolo, Simone Scalabrino, Nathan Cooper, David Nader Palacio, Denys Poshyvanyk, Rocco Oliveto, and Gabriele Bavota. 2021. Studying the usage of text-to-text transfer transformer to support code-related tasks. In 2021 IEEE/ACM 43rd International Conference on Software Engineering (ICSE). IEEE, 336–347.
[36] Volodymyr Mnih, Koray Kavukcuoglu, David Silver, Andrei A Rusu, Joel Veness, Marc G Bellemare, Alex Graves, Martin Riedmiller, Andreas K Fidjeland, Georg Ostrovski, et al. 2015. Human-level control through deep reinforcement learning. nature 518, 7540 (2015), 529–533.
[37] Lili Mou, Ge Li, Lu Zhang, Tao Wang, and Zhi Jin. 2016. Convolutional neural networks over tree structures for programming language processing. In Thirtieth AAAI conference on artificial intelligence.
[38] OpenAI. 2023. ChatGPT. Retrieved January 31, 2023 from https://chat.openai.com/chat
[39] Gary J Saavedra, Kathryn N Rodhouse, Daniel M Dunlavy, and Philip W Kegelmeyer. 2019. A review of machine learning applications in fuzzing. arXiv preprint arXiv:1906.11133 (2019).
[40] Carlos Sarraute, Olivier Buffet, and Jörg Hoffmann. 2013. Penetration testing==pomdp solving? arXiv preprint arXiv:1306.4714 (2013).
[41] John Schulman, Filip Wolski, Prafulla Dhariwal, Alec Radford, and Oleg Klimov. 2017. Proximal policy optimization algorithms. arXiv preprint arXiv:1707.06347 (2017).
[42] Joseph Scott, Trishal Sudula, Hammad Rehman, Federico Mora, and Vijay Ganesh. 2021. Banditfuzz: Fuzzing smt solvers with multi-agent reinforcement learning. In International Symposium on Formal Methods. Springer, 103–121.
[43] David Silver, Thomas Hubert, Julian Schrittwieser, Ioannis Antonoglou, Matthew Lai, Arthur Guez, Marc Lanctot, Laurent Sifre, Dharshan Kumaran, Thore Graepel, et al. 2018. A general reinforcement learning algorithm that masters chess, shogi, and Go through self-play. Science 362, 6419 (2018), 1140–1144.
[44] Richard S Sutton and Andrew G Barto. 2018. Reinforcement learning: An introduction. MIT press.
[45] Julian Thomé, Alessandra Gorla, and Andreas Zeller. 2014. Search-based security testing of web applications. In Proceedings of the 7th International Workshop on Search-Based Software Testing. 5–14.
[46] Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez, Łukasz Kaiser, and Illia Polosukhin. 2017. Attention is all you need. In Advances in neural information processing systems. 5998–6008.
[47] Manuel Del Verme, Åvald Åslaugson Sommervoll, László Erdődi, Simone Totaro, and Fabio Massimo Zennaro. 2021. SQL Injections and Reinforcement Learning: An Empirical Evaluation of the Role of Action Structure. In Nordic Conference on Secure IT Systems. Springer, 95–113.
[48] Joannes Vermorel and Mehryar Mohri. 2005. Multi-armed bandit algorithms and empirical evaluation. In European conference on machine learning. Springer, 437–448.
[49] Michal Zalewski. 2015. American Fuzzing Lop.
[50] Fabio Massimo Zennaro and Laszlo Erdodi. 2020. Modeling penetration testing with reinforcement learning using capture-the-flag challenges and tabular Q-learning. arXiv preprint arXiv:2005.12632 (2020).
[51] Shicheng Zhou, Jingju Liu, Dongdong Hou, Xiaofeng Zhong, and Yue Zhang. 2021. Autonomous penetration testing based on improved deep q-network. Applied Sciences 11, 19 (2021), 8823.