آنالیز ایستا کد ( ک به اسم آنالیز متن کد نیز شناخته شده میشود) به عنوان قسمتی از مراحل بازنگری کد می باشد( که با white-box testing نیز شناخته میشود) و به از قسمت های فاز پیاده سازی از چرخه ی امنیت توسعه ی نرم افزار می باشد. آنالیز ایستا کد به طور معمول به این اشاره دارد که بر روی یک کد ایستا ( یعنی در حالت اجرا نیست) یک آنالیز انجام دهیم و خطرات و مشکلات احتمالی کد را مشخص کنیم. این کار به وسیله ی تکنیک های آنالیز جریان داده و روش های مشابه انجام می شود.
به طور ایده آل این ابزار ها به صورت خودکار میخواهند مشکل های امنیتی را تا حد خوبی از دقت پیدا کنند و مطمئن باشند که چیزی که پیدا میشود یک ایراد در کد است. در حالی که این موضوع حتی از دست برنامه های پرچم دار در این حوزه نیز خارج است. در نتیجه ابزار ها به یک وسیله ی کمکی برای فرد آنالیزور تبدیل می شوند و فرد به وسیله ی آن ها میتواند مشکل های امنیتی بیشتری را در زمان کمتری پیدا کند.
بعضی از ابزار ها کم کم در حال انتقال و تجمیع با IDE ها هستند. برای آن مشکلاتی که میتوانند در فاز روند توسعه نرم افزار به دست آیند این فاز با استفاده از چنین ابزاری می تواند بسیار در پیدا کردن مشکلات کد ها قوی ظاهر شود، از آنجایی که میتواند یک واکنش سریع به بروز این مشکلات به برنامه نویس که ممکن است در کد به وجود آمده بدهد. اینگونه واکنش های سریع و اقداماتی که در حال نوشتن کد انجام می شود بسیار می تواند در مقابل پیدا کردن کد پس از اتمام برنامه نویسی در روند تصحیح خطا کارآمد باشد.
تکنیک های مختلفی برای آنالیز کرد ایستای کد وجود دارد که بتواند کد محتمل خطا را شناسایی کند ک میتواند آن را یک راه حل دانست. این تکنیک ها معمولا از تکنولوژی کامپایلر مشتق میشوند.
آنالیز جریان داده برای جمع آوری اطلاعات زمان اجرا برای داده های نرم افزار در حالت ایستا انجام میشود.
معمولا از سه اصطلاح در آنالیز جریان داده استفاده میشود. basic block که به کد گفته میشود. Control Flow analysis که به جریان داده گفته میشود و مسیر کنترل که مسیری است که داده میپیماید. ک به توضیح مختصر این اصطلاحات میپردازیم.
تعریف basic block:
یک دنباله ای از دستورالعمل های به هم پیوسته که کنترل در اول بلوک وارد شده و در آخر آن تمام میشود و بلوک نمیتواند از بین برود و یا شاخه ای تولید کند مگر تا آخر آن.
مثالی از basic block کد PHP:
$a = 0; $b = 1; if ($a == $b) { # start of block echo “a and b are the same”; } # end of block else { # start of block echo “a and b are different”; } # end of block
یک نمایش گرافی انتزاعی از نرم افزار به وسیله ی گره هایی که هر کدام از آن ها یک basic block می باشد. یک نود از گراف نشان دهنده ی یک basic block بوده و یال ها نشان دهنده ی مسیر های اجرایی از یک گره به گره دیگر می باشد. اگر یک گره فقط یال خروجی داشته باشد آن را به عنوان گره ورودی شناخته و اگر یک گره فقط یال ورودی داشته باشد آن را به عنوان گره خروجی میشناسیم.
به طور مثال در تصویر زیر گره 1( گره بالا) ورودی و گره 6(گره پایین) خروجی می باشد.
روش Taint Analysis میکوشد تا که متغیری که با ورودی کاربر "taint" شده را پیدا کند و رد آن را تا متد های آسیب پذیر بگیرد که به "sink" شناخته میشوند. اگر متغیر taint شده بدون این که سالم شود به یک sink برسد میتوان آن را به عنوان یک خرابی احتمالی در نظر گرفت. بعضی از زبان های برنامه نویسی مانند Perl و Ruby روش Taint Analysisرا به صورت از پیش در خود دارند و در حالت هایی که به طور مثال باید داده توسط CGI قبول شود از این روش استفاده می شود.
تحلیلگر معنایی کد برنامه را به توکن هایی از اطلاعات تبدیل میکند که آن ها انتزاعی از کد مبدا را نشان می دهند و راحت تر میتوان آن را دستکاری کرد. به طور مثال توکن کردن یک کد PHP:
قبل از توکن کردن:
<?php $name = "Ryan"; ?>
پس از توکن کردن:
T_OPEN_TAG T_VARIABLE = T_CONSTANT_ENCAPSED_STRING ; T_CLOSE_TAG
یک ابزار تحلیل ایستای کد معمولا خطا هایی را تشخیص می دهد و آن ها را به عنوان خطا گزارش می کند که در اصل واقعا خطا نبوده اند و مشکلی در آن قسمت ها نیست. یکی از دلایل این رخداد این است که ابزار نمیتواند از جامعیت و امنیت داده در زمانی که در حال گرفتن ورودی و خروجی در برنامه جریان دارد به در ستی مطلع شود.
اعلام خطای به غلط میتوانند زمانی گزارش شود که در حال آنالیز کردن اپلیکیشنی هستیم که با تمامی اجزاء آن در ارتباط نیست و نمیتوانند به بقیه ی کامپننت ها دسترسی داشته باشد و در نتیجه نمیتواند جریان داده را ببیند و آن را آنالیز کند. زیرا که بدون بودن کد به دست آوردن جریان داده و تغیرات ورودی ها وخروجی ها امکان پذیر نمیباشد.
استفاده از ابزار های تحلیل ایستای کد میتواند منجر به False Negative نیز بشود و در مکانی که باید آسیب پذیری کد را گزارش کند این کار را نکند. این ممکن به طور مثال زمانی اتفاق بیفتد که مشکل در یک کامپننت دیگر وجود دارد و این آنالیزگر به آن دسترسی نداشته و آن را بررسی نکرده است و در زمان اجرای کد در دست بررسی این کد، کامپننت دیگر را صدا زده و آن نیز اجرا میشود و در آن خطا رخ میدهد که عملا یکی از آسیب پذیری های زمان اجرای این کد بوده که گزارش نشده.
برای حوزه ی تحلیل ایستا کد متاسفانه شرکتی یافت نشد که به طور مشخص برنامه ای برای این کار ارائه داده باشد.
این مطلب، بخشی از تمرینهای درس معماری نرمافزار در دانشگاه شهیدبهشتی است