آسیبپذیریها و بهرهبرداری
آسیبپذیریها نقصهایی در نرمافزار هستند که مفروضات امنیتی آن را نقض میکنند؛ بهرهبرداری هنر تبدیل چنین نقصی به رفتاری تحت کنترل مهاجم است، از نشت دادهها گرفته تا اجرای کامل کد.
Definition
آسیبپذیری ضعفی در یک سیستم است که مهاجم میتواند از آن برای نقض سیاست امنیتی آن استفاده کند؛ بهرهبرداری (exploit) یک تکنیک یا برنامه است که از یک آسیبپذیری خاص برای دستیابی به اثرات غیرمجاز بهره میبرد.
Scope
این موضوع دستههای اصلی آسیبپذیریها — اشکالات فساد حافظه (سرریز بافر، استفاده پس از آزادسازی)، تزریق، خطاهای عددی صحیح، و نقصهای منطقی — و تکنیکهای بهرهبرداری از آنها، از جمله ربایش جریان کنترل و برنامهنویسی بازگشتگرا را پوشش میدهد. همچنین به اقدامات کاهشی که هزینه بهرهبرداری را افزایش میدهند (ASLR, DEP/NX, قناریهای پشته، یکپارچگی جریان کنترل) میپردازد. این موضوع شامل شیوههای توسعه امن و آسیبپذیریهای خاص وب نمیشود که در موضوعات مرتبط دیگر بررسی میشوند.
Core questions
- چه دستههایی از نقصهای نرمافزاری آسیبپذیریهای قابل بهرهبرداری ایجاد میکنند؟
- چگونه یک اشکال فساد حافظه به کنترل یک برنامه تبدیل میشود؟
- برنامهنویسی بازگشتگرا چیست و چرا دفاعهای ساده را شکست میدهد؟
- چگونه اقدامات کاهشی مانند ASLR، DEP و قناریهای پشته، مانع بهرهبرداری را افزایش میدهند؟
- چرا «مسابقه تسلیحاتی» بین بهرهبرداری و اقدامات کاهشی ادامه دارد؟
Key concepts
- سرریز بافر
- استفاده پس از آزادسازی
- سرریز عدد صحیح
- تزریق
- ربایش جریان کنترل
- برنامهنویسی بازگشتگرا
- کد شل (shellcode)
- ASLR, DEP/NX, قناریهای پشته
- یکپارچگی جریان کنترل
Key theories
- ربایش جریان کنترل
- بسیاری از بهرهبرداریها یک اشارهگر کد (مانند آدرس بازگشت یا اشارهگر تابع) را خراب میکنند تا اجرای برنامه را به کد انتخابشده توسط مهاجم هدایت کنند، که مثال کانونی آن سرریز بافر پشته است که یک آدرس بازگشت ذخیرهشده را بازنویسی میکند.
- اقدامات کاهشی و مسابقه تسلیحاتی بهرهبرداری
- دفاعهایی مانند حافظه غیرقابل اجرا، تصادفیسازی چیدمان فضای آدرس، قناریهای پشته، و یکپارچگی جریان کنترل هر کدام یک دسته از تکنیکها را مسدود میکنند و حملات جدیدی (برنامهنویسی بازگشتگرا، نشت اطلاعات) را در یک تشدید مداوم تحریک میکنند.
Mechanisms
یک سرریز پشته کلاسیک فراتر از مرزهای بافر مینویسد و آدرس بازگشت ذخیرهشده را بازنویسی میکند تا زمانی که تابع بازمیگردد، اجرا به کد شل (shellcode) ارائهشده توسط مهاجم بپرد. اقدامات کاهشی این روند را متوقف کردند: حافظه غیرقابل اجرا (DEP/NX) از اجرای کد تزریقشده جلوگیری کرد و برنامهنویسی بازگشتگرا را که قطعات کد موجود را به هم متصل میکند، تحریک کرد؛ تصادفیسازی چیدمان فضای آدرس (ASLR) آدرسهای هدف را پنهان کرد و بدین ترتیب ابتداییهای نشت اطلاعات برای غلبه بر آن را تحریک کرد. یکپارچگی جریان کنترل و زبانهای حافظه-امن قصد دارند این دستهها را به طور کامل از بین ببرند.
Clinical relevance
آسیبپذیریهای قابل بهرهبرداری، مواد خام حملات واقعی هستند: اشکالات ایمنی حافظه بخش عمدهای از آسیبپذیریهای حیاتی در مرورگرها و سیستمعاملهای اصلی را تشکیل میدهند، بهرهبرداریهای روز صفر (zero-day exploits) در جاسوسی و جرم خریداری، فروخته و استفاده میشوند، و این رشته مهندسی دفاعی، افشای مسئولانه، پاداشهای اشکالیابی (bug bounties) و حرکت به سمت زبانهای حافظه-امن مانند Rust را هدایت میکند.
Evidence & guidelines
دستههای آسیبپذیری در CWE میتر (MITRE) فهرستبندی شدهاند و به صورت جداگانه به عنوان CVE با امتیازات شدت CVSS ردیابی میشوند. مطالعات از فروشندگان اصلی (مایکروسافت، گوگل) گزارش میدهند که حدود ۷۰٪ از آسیبپذیریهای شدید ناشی از عدم ایمنی حافظه هستند، که راهنمایی به سمت زبانهای حافظه-امن و استقرار اقدامات کاهشی (ASLR, CFI) به صورت پیشفرض در پلتفرمهای مدرن را توجیه میکند.
History
بهرهبرداری با سرریز بافر کرم موریس در سال ۱۹۸۸ به چشم عموم آمد و توسط 'Smashing the Stack for Fun and Profit' آلف وان در سال ۱۹۹۶ سیستماتیک شد. هر دفاعی پاسخی را برانگیخت: DEP منجر به return-into-libc و برنامهنویسی بازگشتگرا (return-oriented programming) شاکام (۲۰۰۷) شد؛ ASLR منجر به دور زدنهای مبتنی بر نشت اطلاعات شد. بررسی 'جنگ ابدی در حافظه' در سال ۲۰۱۳، مسابقه تسلیحاتی جاری را که همچنان محرک اقدامات کاهشی جدید و پذیرش زبانهای حافظه-امن است، چارچوببندی کرد.
Key figures
- Elias Levy (Aleph One)
- Hovav Shacham
- Dawn Song
- Ross Anderson
- Halvar Flake
Related topics
Seminal works
- aleph1996
- szekeres2013
- anderson2020
Frequently asked questions
- آسیبپذیری روز صفر (zero-day) چیست؟
- روز صفر (zero-day) آسیبپذیریای است که در زمان بهرهبرداری، برای مدافعان نرمافزار ناشناخته (و وصله نشده) است و به آنها صفر روز برای آمادهسازی فرصت میدهد. چنین نقصهایی به ویژه برای مهاجمان ارزشمند هستند زیرا هنوز هیچ اصلاح یا امضایی برای آنها وجود ندارد.
- چرا زبانهای حافظه-امن به عنوان یک راهحل ترویج میشوند؟
- زبانهای حافظه-امن (مانند Rust) دستههای کاملی از اشکالات — سرریز بافر، استفاده پس از آزادسازی — را در زمان کامپایل یا اجرا جلوگیری میکنند و رایجترین منبع آسیبپذیریهای شدید را از بین میبرند، به جای اینکه صرفاً بهرهبرداری از هر یک را دشوارتر کنند.