توصيفگر ها :
تحليل برنامه , اجراي نمادين , شبيه سازي مونت كارلو , يادگيري ماشين
چكيده فارسي :
امروزه امنيت نرمافزار يكي از جنبههاي مهم و حياتي امنيت سيستمهاي كامپيوتري است. وجود آسيبپذيري در نرمافزار، زمينه سوءاستفاده افراد متخاصم از كاربران را ايجاد كرده و ضررهاي مادي و معنوي براي آنها به همراه دارد. در ميان زبانهاي برنامهنويسي، زبان C يكي از مهمترين و پركاربردترين آنها به شمار ميرود كه كشف و رفع آسيبپذيري در برنامههاي نوشتهشده به اين زبان از اهميت زيادي برخوردار است. ازآنجاييكه زبان C فاقد مكانيسم امنيتي حافظه است، آسيبپذيريهاي خطاي حافظه جزو رايجترين آسيبپذيريهاي موجود در اين زبان هستند كه عدم رفع آن مخاطراتي نظير سوءاستفاده، سرقت، اجراي كد مخرب و غيره را به همراه دارد. از طرفي تا به امروز روشهاي بسياري بهمنظور تشخيص آسيبپذيري و بررسي صحت برنامهها ارائهشدهاند، كه هركدام با چالشهايي روبهرو هستند. يكي از روشهايي كه در سالهاي اخير توجهات بسياري را به خود جلب كرده است اجراي نمادين نام دارد. اجراي نمادين يك رويكرد ايستا بهمنظور تحليل برنامه و بررسي صحت آن است. اجراي نمادين امروزه در عمل بهمنظور انجام يك تحليل كامل و صحيح با چالشهاي زيادي روبهرو است. انفجار مسير يكي از مهمترين چالشهايي است كه اجراي نمادين با آن روبهرو است. اين چالش زماني اتفاق ميافتد كه تعداد حالتهاي نمادين حاصل از اجراي نمادين برنامه تعداد نمايي داشته، بهطوريكه پردازش و ذخيره اين تعداد از حالت براي يك اجراگر نمادين يك چالش محسوب ميگردد. هدف ما در اين پاياننامه ارائه رويكردي بهمنظور كشف آسيبپذيري سرريز بافر هيپ بهعنوان يكي از خطاهاي حافظه در زبان C با استفاده از روش اجراي نمادين در كدهاي باينري است، بهطوريكه با چالش انفجار مسير مقابله كنيم. در اين راستا ما در ابتدا بهوسيله تحليل ايستا بر روي كد باينري و توصيف آسيبپذيري سرريز بافر هيپ حوزه اجراي نمادين را محدود به توابع آسيبپذير در برنامه ميكنيم. در مرحله بعد درخت محدوديت آنها را استخراج ميكنيم، بهطوريكه هر نود از درخت محدوديت شامل محدوديتهاي مسير و محدوديتهاي آسيبپذيري متناظر با آن نود از درخت ميباشد. ازآنجاييكه محدود كردن حوزه اجراي نمادين باعث كاهش دقت در توليد داده تست در سطح سيستمي ميگردد، ما با استفاده از شبيهسازي مونتكارلو، برنامه موردنظر را تحليل كرده و با استفاده از دادههاي بهدستآمده از اين شبيهسازي در يادگيري ماشين سعي ميكنيم رابطه بين وروديهاي سيستمي و واحد موردنظر را پيدا كنيم، بهطوريكه درنهايت بتوانيم دادههاي تست مناسبي را توليد كنيم. بدين ترتيب كه، اين وروديها از ابتداي برنامه به دستور آسيبپذير در واحد موردنظر رسيده و باعث فعال شدن اين آسيبپذيري گردند.
چكيده انگليسي :
Nowadays, software security is one of the essential aspects of the security of computer systems. The vulnerability of software paves the way for attackers to abuse the users and bring them both material and spiritual loss. Among programming languages, C is considered one of the most important and widely used languages, in which detection and fixing of vulnerability are of high importance. Since C language lacks any memory security mechanism, Memory error vulnerabilities are one of the most common vulnerabilities in this language, if it wonʹt be fixed It carries risks such as misuse, theft, malicious code execution, and so on. On the other hand, many methods have been presented to detect vulnerabilities and check the accuracy of the program, but these methods are prone to challenges. One of the methods that have attracted a lot of attention in recent years is called symbolic execution. Symbolic execution is a static approach to analyzing and checking a program. This method today is faced with several challenges when performing a sound and complete analysis. Path explosion is one of such issues that symbolic execution is faced with. This challenge occurs when the number of symbolic states resulting from the symbolic execution of the program is exponential, such that the process and storage of this great number of states by a symbolic executor are assumed a challenge. This thesis presents an approach to discover the vulnerability of heap buffer overflow as one of the memory errors in C language using the symbolic execution in binary codes in a way that we prevent the path explosion problem. To this end, by using static analysis on the binary code and describing the heap buffer overflow vulnerability, the symbolic execution scope is limited to vulnerable functions. Next, their constraint tree is extracted, where each node of the tree includes path constraints and the corresponding vulnerability constraints of that node. Since limiting the symbolic execution scope leads to a reduction in the accuracy of data generation at the system level, the Monte Carlo Simulation (MC) is adopted to analyze the program. Also, utilizing the data obtained from simulation in the machine learning process, the relationship between the system inputs and the considered unit is found so that we can produce suitable test data. Thereby, from the beginning of the program, these inputs reach the vulnerable command in the desired unit and activate this vulnerability.