توسعه سوء استفاده پیشرفته: از باگ تا PoC تسلیح شده
نگاهی عملی به توسعه سوء استفاده پیشرفته: اولیه های فساد حافظه، دور زدن تخفیف ها، و انضباط مهندسی پشت سوء استفاده های قابل اعتماد.
توسعه سوء استفاده پیشرفته جایی است که تحقیق آسیب پذیری با انضباط مهندسی نرم افزار ملاقات می کند. یافتن یک باگ فقط اولین قدم است؛ تبدیل آن باگ به یک اثبات مفهوم قابل اعتماد و تسلیح شده نیاز به درک طرح بندی حافظه، رفتار کامپایلر، و تخفیف هایی دارد که برای متوقف کردن شما طراحی شده اند. این حوزه در قلب تحقیق امنیت تهاجمی، تیم های قرمز، و کار دفاعی که به دانستن دقیق نحوه تفکر مهاجمان بستگی دارد، قرار دارد.
از خرابی به کنترل
یک fuzzer یا ممیزی دستی ممکن است یک خرابی را به شما بدهد، اما خرابی یک سوء استفاده نیست. کار واقعی با ریشه یابی باگ شروع می شود: آیا این overflow بر پایه پشته است، use-after-free است، type confusion است، یا integer overflow است که منجر به فساد heap می شود؟ هر کلاس باگ یک مسیر سوء استفاده متفاوت دارد. محققین پیشرفته زمان قابل توجهی را در یک debugger و disassembler صرف می کنند و دقیقاً ردیابی می کنند که کدام حافظه فاسد می شود، چقدر، و چه داده ای که مهاجم کنترل می کند در لحظه فساد وجود دارد. ابزارهایی مانند WinDbg، GDB با GEF یا pwndbg، و IDA Pro یا Ghidra برای این تجزیه باقی مانده اند، به شما اجازه می دهند وضعیت رجیستر، metadata heap، و کنترل جریان را در نقطه شکست بررسی کنید.
ساخت اولیه های قابل اعتماد
سوء استفاده مدرن به ندرت یک overflow تک شلیک به یک آدرس برگشت است. در عوض، محققین اولیه ها را به هم زنجیر می کنند: یک نشت اطلاعات برای شکست ASLR، یک نوشتن کنترل شده برای فساد یک شاخص تابع یا vtable، و راهی برای تغییر مسیر اجرا بدون فعال کردن تخفیف های مانند DEP. تکنیک های حملات heap مانند heap grooming، feng shui، و سوء استفاده از metadata allocator (همانطور که در تحقیقات حملات heap های مختلف glibc و Windows دیده می شود) مهارت های بنیادی هستند. هدف تبدیل یک باگ فساد حافظه غیر قابل اعتماد به یک اولیه معین و قابل تکرار است: به من خواندن خودسرانه بدهید، سپس یک نوشتن خودسرانه بدهید، سپس اجرای کد بدهید.
شکست تخفیف های مدرن
سیستم عامل ها و کامپایلرها محافظت های لایه شده ای را اضافه کرده اند که سوء استفاده ساده را بسیار سخت تر از یک دهه پیش می کنند. درک این تخفیف ها و محدودیت های آنها ضروری است:
- ASLR (Address Space Layout Randomization) نیاز به نشت اطلاعات یا بازنویسی های جزئی برای شکست تصادفی بودن آدرس را الزام می کند.
- DEP/NX توسعه دهندگان سوء استفاده را به سمت return-oriented programming (ROP) و jump-oriented programming (JOP) به جای تزریق shellcode کلاسیک ترغیب می کند.
- Stack canaries نیاز به یک نشت ارزش canary یا یک مسیر سوء استفاده دارند که کل پشته را دور بزند، مانند هدف قرار دادن heap یا داده های جهانی.
- CFI (Control Flow Integrity) و CET (Control-flow Enforcement Technology) محل فراخوانی های غیرمستقیم و بازگشت ها را محدود می کنند، محققین را به سمت gadget chains سازگار با CFI یا حملات تنها داده ای ترغیب می کنند که هرگز جریان اجرا را تغییر مسیر ندهند.
- Sandboxing در کنار محافظت های حافظه اغلب به این معنی است که یک زنجیر سوء استفاده واحد باید شامل یک فرار sandbox باشد، تحقیق را به یک پروژه مهندسی چند مرحله ای تبدیل می کند.
حملات تنها داده ای شایسته توجه خاصی هستند: به جای هدایت جریان کنترل، مهاجم ساختار های داده های برنامه، پرچم های اجازه، یا شاخص های شی را فاسد می کند تا همان تاثیر را بدون فعال کردن چک های CFI انجام دهد. این روند توسعه سوء استفاده را بیشتر به سمت درک منطق عمیق برنامه به جای ترفندهای خالص طرح بندی حافظه هدایت کرده است.
ROP Chains و کشف Gadget
با DEP در جای خود، تزریق مستقیم shellcode به ندرت قابل اجرا است، بنابراین توسعه دهندگان سوء استفاده زنجیرهای return-oriented programming را از fragments کد موجود یا "gadgets" می سازند که قبلاً در باینری یا کتابخانه های بارشده وجود دارند. ابزارهایی مانند ROPgadget، Ropper، و قابلیت های اجرای نمادین angr کشف gadget و ساخت زنجیر را خودکار می کنند. یک ROP chain به خوبی ساخته شده معمولاً DEP را برای یک منطقه حافظه هدف غیرفعال می کند (از طریق فراخوانی های توابعی مانند VirtualProtect یا mprotect) و سپس اجرا را به shellcode محور می کند، یا مستقیماً یک تابع حساس مانند system() را با آرگومان های کنترل شده توسط مهاجم فراخوانی می کند.
اعتماد پذیری سوء استفاده و تسلیح
یک اثبات مفهوم که یک بار در debugger کار می کند بسیار متفاوت از یک سوء استفاده تسلیح شده است که به طور قابل اعتماد در سطوح patch، سخت افزار، و شرایط دنیای واقعی کار می کند. مهندسی اعتماد پذیری در این فضا شامل مقابله با طرح بندی حافظه غیر معین، ساخت اولیه های بازگشتی زمانی که یک نشت ناموفق می شود، و آزمایش در چندین نسخه نرم افزار هدف است. این همچنین جایی است که اصول افشای مسئول بیشتر اهمیت دارند: مستند کردن واضح زنجیر سوء استفاده، هماهنگی با فروشندگان، و درک مرزهای قانونی و اخلاقی پیرامون تحقیق آسیب پذیری.
چرا برای دفاع اهمیت دارد
همه از این تحقیق بهره می برند، حتی دفاع کنندگانی که هرگز خود یک سوء استفاده را ننویسند. درک اولیه های سوء استفاده طراحی تخفیف بهتر، harnesses fuzzing مؤثرتر، code review هوشمندتر بر روی الگوهای ریسک بالا، و engagements تیم قرمز واقع بینانه تر را مطلع می کند. توسعه سوء استفاده پیشرفته در نهایت در مورد درک عمیق نحوه شکست نرم افزار است، و این درک بنیاد ساخت نرم افزاری است که به طور امن شکست می خورد.
اگر این کنجکاوی شما را برانگیخت، بخش های مرتبط Korra Studio را در مورد بنیادی های فساد حافظه، reverse engineering، و تکنیک های دور زدن تخفیف بررسی کنید تا بنیاد امنیت تهاجمی خود را همچنان ساخت.
با کمک هوش مصنوعی نوشتهشده، بازبینی و منتشرشده توسط Michal Pilch (CISSP)، Korra Studio.
این یکی از یادداشتهای پایگاه دانش Korra Studio است — پلتفرم هر موضوع را با مربی یکبهیک جفت میکند.
شروع رایگانarrow_forward