انواع آسیبپذیریهای نرمافزار
طراحی و مهندسی ضعیف نرمافزار و یا بهرهبرداری ناامن از آن، ریشه اصلی بسیاری از آسیبپذیریهای امنیتی در سیستمهای رایانهای است، به همین دلیل امنیت نرمافزار به عنوان یکی از مباحث کلیدی مهندسی نرمافزار شناخته شده است. جهت تضمین امنیت نرمافزار لازم است آسیبپذیریهای مربوط به نرمافزار شناسایی شده و راهکارهای مناسب برای جلوگیری و یا مقابله با آنها تهیه گردد.
نرمافزارها به طور کلی دارای دو نوع آسیبپذیری هستند، نوع اول مربوط به ضعفهای بنیادی موجود در نرمافزارها میشود که اینگونه از ضعفهای امنیتی را نمی توان از بین برد، لذا برای مقابله با آنها لازم است ابتدا آنها را شناسایی کرده و سپس با استفاده از استراتژی دفاع چند لایه، احتمال سوءاستفاده از آنها را کاهش داد. نوع دیگری از ضعفهای امنیتی نیز وجود دارند که در زمان طراحی و پیادهسازی نرم افزار ایجاد میگردند. معمولاً اینگونه از ضعفهای امنیتی قابل پیشگیری هستند. این امر تا حد زیادی با رعایت الزامات امنیتی در زمان طراحی، پیادهسازی و تست نرمافزار محقق میگردد. لازم است برای آن دسته از آسیبپذیریهایی که به هر دلیل در حین پیادهسازی نرمافزار مخفی میمانند و بعد از تولید نرمافزار شناسایی میشوند، بلافاصله اصلاحیه مربوطه ایجاد و نصب گردد و در غیر اینصورت راهکاری برای کاهش خطر تا زمانی که اصلاحیه مربوطه تهیه گردد، ارائه شود. به همین دلیل نصب به موقع اصلاحیهها یکی از الزامات امنیتی در بهره برداری از انواع نرمافزارها است.
در ادامه طبقهبندی آسیبپذیریهای نرمافزار شرح داده شده است.
آسیبپذیریهای طراحی
آسیب پذیری طراحی از یک اشتباه زیربنایی و یا یک اشتباه سهوی در طراحی نرمافزار سرچشمه میگیرد. در صورت وجود یک نقص در طراحی، قطعاً نرمافزار مذکور امن نخواهد بود، زیرا نرمافزارها کاری را انجام میدهند که برای آن طراحی شدهاند و در این صورت برای انجام کاری نادرست طراحی شدهاند. این نوع از نقصها معمولاً به علت وجود پیشفرضهایی در مورد محیطی که نرمافزار در آن اجرا میشود، به وجود میآیند. این آسیبپذیریها معمولاً به عنوان آسیبپذیریهای سطح بالا، نقصهای معماری و یا مشکلات موجود در نیازمندیها و محدودیتهای برنامه نیز شناخته میشوند. برای مثال پروتکل TELNET برای اتصال به یک دستگاه از راه دور طراحی شده است. از دیدگاه طراحی، این پروتکل دارای آسیبپذیری است، زیرا بر ارتباطات ناامن تکیه کرده است. این پروتکل فقط در محیطهایی که زیرساخت شبکه قابل اعتماد باشد امن است، اما در محیطهایی همچون اینترنت میتواند بسیار خطرناک باشد.
آسیبپذیریهای پیادهسازی
در آسیبپذیریهای پیادهسازی، معمولاً کد منبع آن کاری را که باید انجام دهد، انجام میدهد، اما مشکل امنیتی در شیوه اجرای عملیات است. این آسیبپذیریها معمولاً زمانی رخ میدهند که پیاده سازی به منظور حل برخی مشکلات فنی از طراحی منحرف میشود. معمولاً حالتهای قابل سوءاستفاده به علت اختلافات جزئی در محیطهای پیادهسازی و زبانهای برنامهنویسی مورد استفاده رخ میدهند. به آسیبپذیریهای پیادهسازی، آسیبپذیریهای سطح پایین یا نقصهای فنی نیز گفته میشود. برای مثال در برخی نسخههای قدیمی TELNET، آسیبپذیریهای پیادهسازی همچون عدم پاکسازی کامل متغیرهای محیطی وجود دارد که به مهاجمان اجازه میدهد حق دسترسی خود را در دستگاههای دارای سیستم عامل یونیکس بالا ببرند.
آسیبپذیریهای عملیاتی
آسیبپذیریهای عملیاتی آن دسته از مشکلات امنیتی هستند که در هنگام پروسههای عملیاتی و استفاده از یک جزء نرمافزار در یک محیط خاص روی میدهند. راه تشخیص این دسته از آسیبپذیری ها اینست که آنها در کد منبع وجود ندارند و از شیوه تعامل نرمافزار با محیط ایجاد میشوند. آسیبپذیریهایی که بر اثر پیکربندی نادرست نرمافزار در محیط اجرایی ایجاد میشوند، نیز جزء این دسته از آسیبپذیریها به حساب میآیند. همچنین آسیبپذیریهای مربوط به حملات مهندسی اجتماعی و سرقت نیز به عنوان آسیبپذیریهای عملیاتی شناخته میشوند. برای مثال در TELNET، با توجه به این نکته که نقص طراحی به علت عدم رمزنگاری در آن وجود دارد، در صورتی که نرمافزاری از آن برای به روزرسانی برخی اطلاعات استفاده کند، وابسته به اینکه محیط امن باشد یا خیر می تواند منجر به یک آسیبپذیری عملیاتی شود.