برنامه نویسی امن
بررسی امنیت یک سامانه نرمافزاری در سطوح مختلفی همچون شبکه، سیستم عامل، دیتابیس سرور، وب سرور و برنامه کاربردی میتواند صورت بگیرد. سطح برنامه کاربردی، آخرین سطحی است که نفوذگر در صورت گذر از لایههای مختلف زیرساخت سختافزاری و نرمافزاری با آن مواجه خواهد شد. لذا امنیت سامانه در سطح application از اهمیت خاصی برخوردار است. منابع، چک-لیست، راهنمای کاربری و ابزارهای معتبری در این زمینه وجود دارد که یادگیری و بکارگیری آنها در چرخه حیات نرمافزار منجر به افزایش امنیت و قابلیت اطمینان سیستم خواهد شد.
از منابع معتبری که در شیوه کدنویسی امن استفاده خواهد شد، میتوان به موارد زیر اشاره کرد:
CWE-SANS Top 25 Most Dangerous Programming Errors
OWASP Top 10 Security Vulnerabilities
PCI Data Security Standard
NIST SAM
Secure Coding Best Practices
هر یک از منابع معتبر مذکور، آیتمهای مهمی را در شیوه برنامه نویسی امن مورد بررسی قرار دادهاند که با تدوین آنها در قالب یک checklist میتوان امنیت سورس کد را به صورت رسمی مورد ارزیابی قرار داد. برای تسریع در یادگیری شیوه برنامهنویسی امن و همچنین ارزیابی امنیت سورسکد توصیه میشود از ابزارهای مناسبی استفاده شود. در بخش ابزارهای تست به این امر پرداخته شده است.
به عنوان نمونه، یکی از مباحث مهم در برنامهنویسی بهینه از دیدگاه امنیت و کارایی، مسئله جلوگیری از نشتی حافظه است. در ادامه به تشریح این مسئله میپردازیم.
شناسایی نشتی حافظه
نشتی حافظه موضوعی است که هم یک مشکل کارایی (به دلیل اتلاف حافظه) و هم یک مشکل امنیتی محسوب میگردد (به دلیل مصرف بیرویه حافظه که نهایتا منجر به پرشدن حافظه و پایین آمدن سرور میشود). بررسی این مشکل در برنامهنویسی سیستمهای سطح پایین (تولید شده با زبانهایی همچون C و ++C) از اهمیت خاصی برخوردار است چرا که به دلایلی همچون عدم وجود virtual machine در زبانهای سطح پایین و امکان استفاده مستقیم از اشاره گرها (pointer)، تشخیص این مشکل بسیار پیچیده است. البته مشکل نشتی حافظه در زبانهای سطح بالایی همچون Java و #C نیز که در یک محیط sandbox اجرا میشوند، به دلیل برنامهنویسی نامطلوب میتواند رخ دهد و لذا برنامهنویسان باید دقت کافی در این زمینه را بنمایند.
لذا برنامه نویسان سامانههای نرمافزاری در مورد قوانین برنامهنویسی مربوط به مدیریت حافظه، باید دانش و آگاهی لازم را داشته باشند. در هر صورت برای تشخیص مشکلات حافظه ابزارهای مناسبی نیز وجود دارد. در زبانهای سطح بالایی همچون Java و #C معمولا از ابزارهای static analysis و پیکربندی قوانین مربوط به تشخیص نشتی حافظه استفاده میشود. این روش برای زبانهای سطح پایینی همچون C و ++C نیز کاربرد دارد ولیکن برای زیانهای سطح پایین، روشهای کاراتری همچون تشخیص نشتی حافظه در حین اجرای برنامه (run-time memory leakage detection) نیز وجود دارد. یکی از ابزارهای قدرتمند در این زمینه ++Parasoft Insure میباشد که در بخش ابزارهای تست معرفی شده است. این ابزار از تکنیک instrumentation برای تشخیص نشتی حافظه در حین اجرای برنامه استفاده مینماید.
شرکت مهندس پیشگان آزمون افزار یاس، ابزارهای پیشرفته زیر را در زمینه ارزیابی امنیت سیستم و تست نفوذ در سطح برنامهنویسی ارائه میدهد:
Checkmarx، JTest، dotTest، C++Test و Sonar.