تجزیه و تحلیل ایستای کد یا تجزیه و تحلیل کد منبع به عنوان بخشی از بازنگری کد که به عنوان تست جعبه سفید شناخته میشود انجام میشود و در مرحله پیادهسازی یک چرخه حیات توسعه امنیت (SDL) مورد استفاده قرار میگیرد. یک روش اشکالزدایی برنامه است که با بررسی کد بدون اجرای برنامه انجام میشود. این فرایند درک ساختار کد را فراهم میکند. تحلیل ایستای کد به اجرای ابزار تحلیل ایستای کد مربوط است و برای برجسته کردن امکان آسیبپذیری در کد منبع ایستا که در حال اجرا نیست با استفاده از روشهایی مانند تحلیل Taint و تحلیل جریان داده تلاش میکند. چنین ابزارهایی به طور خودکار نقصهای امنیتی را با درجه بالایی از اطمینان و نقص واقعی را پیدا میکنند. چنین ابزارهایی به تحلیلگران کمک میکند تا بخشهای مربوط به امنیت کد به صفر برسند و آنها میتوانند نقصها را به صورت مؤثرتری پیدا کنند نسبت به ابزاری که به سادگی و به طور خودکار میتوانند نقصها را پیدا کنند.
برخی از ابزارها به سمت یکپارچهسازی محیط توسعه حرکت میکنند. در انواع مشکلاتی که در طول فاز توسعه نرمافزار شناسایی میشوند، یک مرحله مهم و قدرتمندی در چرخه حیات توسعه برای استفاده از چنین ابزارهایی است که بازخوردهایی را برای توسعه دهنده در مورد مسائلی که ممکن است در طول توسعه کد با آنها مواجه شود را ارائه میدهد. این بازخوردها در مقایسه با آسیبپذیریها که بسیار دیرتر در چرخه توسعه یافت میشوند، مفید هستند. تحلیل ایستای کد در مهندسی نرمافزار توسط تیم توسعه و تضمین کیفیت نرمافزار انجام میشود. تحلیل ایستای کد در یافتن مسائل کدگذاری مانند خطاهای برنامهنویسی، نقضهای استاندارد کدنویسی، مقادیر تعریف نشده، نقضهای نحوی، آسیبپذیریهای امنیتی مورد استفاده قرار میگیرد.
فرایند تحلیل ایستای کد تا زمانی که خودکار باشد، نسبتا ساده است. این فرایند قبل از تست نرمافزار و در مراحل اولیه توسعه اتفاق میافتد. در فعالیتهای DevOps این فرایند در فاز ایجاد رخ میدهد. بعد از نوشتن کد، تحلیلگر کد را برای بررسی آن اجرا میکند و قوانین کدنویسی استاندارد تعریف شده یا قوانین از پیش تعریف شده سفارشی را بررسی میکند و تحلیلگر تطابق کد با قوانین تنظیم شده را بررسی میکند و موارد مثبت کاذب و منفی کاذب را شناسایی میکند. هنگامی که مشکلات کد حل شود، کد می تواند تست و اجرا شود. بدون داشتن ابزارهای تست کد، تحلیل ایستا سخت و زیاد است. زیرا انسانها باید کد را بررسی کند و بفهمند که کد چگونه در محیطهای زمان اجرا رفتار میکند. بنابراین استفاده از ابزارهایی که این فرایند را خودکار میسازند، سبب خلاص شدن از کاری طولانی و طاقتفرسا میشود و محیط کار کارآمدتری را ایجاد میکند.
تکنیکهای مختلفی برای تحلیل ایستای کد منبع برای آسیبپذیریهای احتمالی وجود دارد که ممکن است در یک راه حل با هم ترکیب شوند. این تکنیکها اغلب از تکنولوژیهای موجود در کامپایلر تشکیل شدند. در ادامه تعدادی از این تکنیکها معرفی میشوند.
تحلیل جریان داده: تحلیل جریان داده برای جمعآوری اطلاعات زمان اجرا (پویا) در مورد داده در نرمافزار زمانی که در حالت ایستا هستند مورد استفاده قرار میگیرد. اطمینان حاصل میکند که دادههای تعریف شده به درستی استفاده میشوند. همچنین از دادههایی که به درستی عمل میکنند، اطمینان حاصل میکند. در تحلیل جریان داده سه اصطلاح مورد استفاده قرار میگیرند که شامل بلاک اصلی (کد)، تحلیل جریان کنترل (جریان داده) و مسیر جریان کنترل (مسیری که دادهها طی میکنند) هست. بلاک اصلی یک دنباله از دستورات متوالی است که کنترل در شروع یک بلاک وارد میشود و از انتهای آن خارج میشود و بلاک فقط در انتهای آن میتواند متوقف یا منشعب شود.
تحلیل کنترل: روی جریان کنترل در یک ساختار فراخوانی تمرکز میکند. یک جریان کنترل میتواند یک پردازش، تابع، متد یا یک زیر برنامه باشد.
گراف جریان کنترلی: در یک نمایش گراف انتزاعی نرمافزار، نودهای موجود در گراف بلاکهای اصلی را نشان میدهند. یالهای جهتدار برای نمایش پرشها (مسیرها) از یک بلاک به بلاک دیگر را نشان میدهد. اگر نود فقط یک یال خروجی داشته باشد، نشاندهنده بلاک ورودی است. اگر یک نود فقط یک یال ورودی داشته باشد، نشاندهنده بلاک خروجی است. در شکل زیر یک گراف جریان کنترلی نمایش داده شده است که node 1 یک بلاک ورودی و node 6 یک بلاک خروجی را نمایش میدهد.
تحلیل Taint: تجزیه و تحلیل Taint، متغیرهایی که با ورودی قابل کنترل کاربر آلوده می شوند را شناسایی میکند و آنها را برای توابع آسیبپذیر احتمالی که به عنوان سینک شناخته میشود، ردیابی میکند. اگر یک متغیر آلوده قبل از این که اصلاح شود به تابع سینک منتقل و ارسال شود،به عنوان یک آسیبپذیری علامت گذاری میشود. برخی از زبانهای برنامهنویسی مانند Perl و Ruby از بررسی Taint استفاده میکنند و در شرایط خاصی مانند پذیرش دادهها از طریق CGI فعال میشوند.
تحلیل لغوی: تحلیل لغوی، نحو کد منبع را به توکنهای اطلاعات برای انتزاع کد منبع تبدیل میکند و دستکاری و تغییر آن را آسانتر میسازد.
تحلیل رابط: شبیهسازیها را برای بررسی کد تایید میکند و اطمینان حاصل میکند که رابط با مدل شبیهسازی مطابقت دارد.
تحلیل خطا و خرابی: خطا و خرابی را در مدل مؤلفهها تجزیه و تحلیل میکند.
همچنین میتوان تحلیل ایستای کد دارای دستهبندیهای دیگری مانند رسمی، زیبایی، ویژگیهای طراحی، بررسی خطا و پیشبینی هست. اگر کد صحیح باشد در دسته رسمی قرار میگیرند. اگر کد با روشهای استاندارد همگام شود در دسته زیبایی قرار میگیرد. دسته ویژگیهای طراحی مربوط به سطح پیچیدگیها است. دسته بررسی خطا به دنبال نقضهای کد است. دسته پیشبینی میپرسد که کد در هنگام اجرا چگونه رفتار میکند.
ابزارهای تحلیل ایستا ممکن است به دلیل اتکا به مدلهای انتزاعی و نمایش جریانهای داده و منطق برنامه همراه با ناتوانی در درک هدف توسعه دهنده در زمینههای کدنویسی معین نتایج مثبت کاذب و منفی کاذب تولید کند.
مثبت کاذب: یک ابزار تحلیل ایستای کد اغلب نتایج مثبت کاذب را تولید میکند. جایی که ابزار آسیبپذیری احتمالی را گزارش میکند که در واقع درست و واقعی نیست که به این دلیل است که ابزار نمیتواند از یکپارچگی و امنیت داده که در برنامه از ورودی به خروجی جریان مییابد، مطمئن باشد. نتایج مثبت کاذب ممکن است هنگام تحلیل یک برنامه که با مؤلفههای کد بسته یا سیستمهای خارجی تعامل دارد، گزارش شوند. زیرا بدون کد منبع، ردیابی جریان داده در سیستم خارجی و اطمینان از یکپارچگی و امنیت داده امکانپذیر نیست.
منفی کاذب: استفاده از ابزارهای تحلیل ایستای کد میتواند نتایج منفی کاذب را ارائه دهد یعنی جایی که آسیبپذیریها ایجاد میشوند ولی ابزار نمیتوانند آنها را گزارش دهند. ممکن است این اتفاق زمانی رخ دهد که یک آسیبپذیری جدید در یک مؤلفه خارجی کشف شود یا زمانی که ابزارهای تحلیل دانشی در مورد محیط زمان اجرا و پیکربندی ایمن و نحوه آن نداشته باشند.
مزیت اصلی تحلیل ایستا این هست که میتواند خطاهایی را آشکار کند که تا زمانی که فاجعهای رخ ندهد نمیتوانند خود را نشان دهند. تحلیل ایستا اولین گام در کنترل کیفیت یک نرمافزار جامع است. بعد از انجام تحلیل ایستا، تحلیل پویا برای کشف خطاهای پنهان و نامحسوس یا آسیبپذیریها است. در حوزه کامپیوتر استاتیک (ایستا) به معنای ثابت است در حالی که داینامیک (پویا ) به معنای قابلیت عمل یا تغییر است. تحلیل پویا شامل تست و ارزیابی یک برنامه بر اساس زمان اجرا است. تحلیل ایستا و پویا با هم در نظر گرفته میشوند و به عنوان تست جعبه سفید شناخته میشوند.
تفاوت اصلی بین تحلیل ایستا و تحلیل پویا زمانی است که خطا در چرخه عمر توسعه نرمافزار پیدا میشود. تحلیل ایستا خطا را بین فاز کدنویسی و تست واحد بدون آن که هیچ کدی اجرا شود، تشخیص میدهد. تحلیل پویا خطا را در طول فاز تست واحد شناسایی میکند و نحوه رفتار کد در طول زمان اجرا را بررسی میکند. بنابراین بهترین راه برای تضمین امنیت برنامه، ترکیب هر دو تحلیل ایستا و پویا است. تحلیل ایستا میتواند با حذف بسیاری از مسائل قبل از اجرا ، کیفیت کلی کد و نرمافزار را بهبود بخشد، در حالی که تحلیل پویا خطاها را در زمان اجرا و آسیبپذیرهایی که با استفاده از روشهای ایستا قابل شناسایی نیستند را پیدا میکند.
در این بخش دو مورد ابزارهای منبع باز مهم و کاربردی مورد استفاده برای تجزیه و تحلیل ایستای کد به منظور افزایش کیفیت و بررسی کد معرفی و بررسی میگردند.
ابزار SonarQube
این ابزار در بررسی کیفیت و امنیت کد مورد استفاده قرار میگیرد و ابزارهایی برای مدیریت کیفیت مانند IDE یکپارچه، سرور یکپارچه ماندگار محبوب و ابزارهای بررسی کد را فراهم میکند. با استفاده از آن توسعهدهندگان میتوانند کدهای تمیزتر ایمنتری بنویسند و توسعهدهندگان را در طول بررسی کد هدایت میکند. با هزاران قانون خودکار تحلیل ایستای کد در بیش از 25 زبان برنامهنویسی مانند Java، C#، JavaScript، TypeScript، C/C++، COBOL و .. مورد استفاده قرار میگیرد و مستقیما با پلتفرم DevOps ادغام میشود. این ابزار برای خودکارسازی بررسی کد مورد استفاده قرار میگیرد. از جمله معایب این ابزار، عدم پشتیبانی از هر IDE است. ویژگیهای مهم ابزار SonarQube عبارتند از:
ابزار DeepSource
یک ابزار خوب برای تحلیل ایستای کد است که برای تشخیص کیفیت کد و مسائل امنیتی در چرخه عمر توسعه نرمافزاز استفاده میشود. یکی از سریعترین و کم نویزترین ابزارهای تحلیل ایستا است و ریسکهای خطا، ضد الگوها، عملکرد و مسائل امنیتی را قبل از این که در محصول نهایی مداخله کنند، تشخیص میدهد. توسعهدهندگان در راهاندازی و توسعه این ابزار مشکلی ندارند. این ابزار میتواند خطاها و برخی از مشکلات رایج را در کد به صورت خودکار در طول بررسی کد پیدا کند و ترمیم هایی را برای آنها تولید کند و به صورت خودکار کد را قالببندی میکند. این ابزار برای پروژههای منبع باز و تیمهای کوچک رایگان است و برای شرکتها یک گزینه استقرار self hosted را پیشنهاد میدهد. این ابزار می تواند با Bitbucket، GitHub یا GitLab ادغام شود. DeepSource معیارهایی مانند تعداد وابستگی، پوشش اسناد و ... را به صورت خودکار تولید و ردیابی میکند. ازجمله معایب این ابزار در دسترس نبودن پشتیبانی از زبان PHP است. ویژگیهای مهم ابزار DeepSource عبارتند از:
در این بخش دو مورد از شرکتهای ایرانی فعال در حوزه آزمون و کیفیت نرمافزار و تحلیل ایستای کد برنامه و محصولات آنها معرفی میشوند.
آزمایشگاه آزمون و تایید نرمافزار دانشگاه شهید بهشتی
این آزمایشگاه در طراحی و اجرای انواع آزمونها بر روی سامانههای نرمافزاری و ارزیابی کیفیت نرمافزارها فعالیت میکند. با هدف رشد صنعت آزمون نرمافزار و سایر حوزههای مرتبط با کیفیت نرمافزار ایجاد شده است. خدمات این آزمایشگاه عبارتند از:
شرکت مهندس پیشگان آزمون افزار یاس
هدف این شرکت ارتقا تعالی سازمانی از طریق تضمین کیفیت خدمات و محصولات نرمافزاری است و استراتژی کاری آن طبق استاندارد و متدلوژی و به کارگیری ابزارهای مدرن است. این شرکت به منظور آزمون و کیفیت نرمافزار از ابزارهایی در زمینه مدیریت کیفیت، تست کارکردی، تست کارایی، تست امنیت، تست برنامهنویسی، تحلیل ایستا، تحلیل پویا و مانیتورینگ استفاده میکند. چشمانداز این شرکت عبارتند از:
خدمات این شرکت به منظور آزمون و تضمین کیفیت نرمافزار عبارتند از:
در این مقاله ابتدا در بخش اول به معرفی و بررسی تحلیل کد ایستا در حوزه معماری نرمافزار و توسعه نرمافزار پرداخته شد و سپس در بخش دوم دو مورد از ابزارهای مورد نیاز به منظور تحلیل کد ایستا و تضمین کیفیت و آزمون نرمافزار معرفی شدند و در پایان نیز دو مورد از شرکتهای ایرانی فعال در حوزه ارائه خدمات مربوط به کیفیت و تضمین نرمافزار به همراه محصولاتی که ارائه میدهند معرفی و بیان گردید.
«این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است»