Pooya Sabeti
Pooya Sabeti
خواندن ۶ دقیقه·۳ سال پیش

مقدمه ای بر Static Code Analysis

تعریف Static code analysis

آنالیز ایستا کد ( ک به اسم آنالیز متن کد نیز شناخته شده میشود) به عنوان قسمتی از مراحل بازنگری کد می باشد( که با white-box testing نیز شناخته میشود) و به از قسمت های فاز پیاده سازی از چرخه ی امنیت توسعه ی نرم افزار می باشد. آنالیز ایستا کد به طور معمول به این اشاره دارد که بر روی یک کد ایستا ( یعنی در حالت اجرا نیست) یک آنالیز انجام دهیم و خطرات و مشکلات احتمالی کد را مشخص کنیم. این کار به وسیله ی تکنیک های آنالیز جریان داده و روش های مشابه انجام می شود.

به طور ایده آل این ابزار ها به صورت خودکار میخواهند مشکل های امنیتی را تا حد خوبی از دقت پیدا کنند و مطمئن باشند که چیزی که پیدا میشود یک ایراد در کد است. در حالی که این موضوع حتی از دست برنامه های پرچم دار در این حوزه نیز خارج است. در نتیجه ابزار ها به یک وسیله ی کمکی برای فرد آنالیزور تبدیل می شوند و فرد به وسیله ی آن ها میتواند مشکل های امنیتی بیشتری را در زمان کمتری پیدا کند.

بعضی از ابزار ها کم کم در حال انتقال و تجمیع با IDE ها هستند. برای آن مشکلاتی که میتوانند در فاز روند توسعه نرم افزار به دست آیند این فاز با استفاده از چنین ابزاری می تواند بسیار در پیدا کردن مشکلات کد ها قوی ظاهر شود، از آنجایی که میتواند یک واکنش سریع به بروز این مشکلات به برنامه نویس که ممکن است در کد به وجود آمده بدهد. اینگونه واکنش های سریع و اقداماتی که در حال نوشتن کد انجام می شود بسیار می تواند در مقابل پیدا کردن کد پس از اتمام برنامه نویسی در روند تصحیح خطا کارآمد باشد.


تکنیک ها

تکنیک های مختلفی برای آنالیز کرد ایستای کد وجود دارد که بتواند کد محتمل خطا را شناسایی کند ک میتواند آن را یک راه حل دانست. این تکنیک ها معمولا از تکنولوژی کامپایلر مشتق میشوند.


Data Flow Analysis

آنالیز جریان داده برای جمع آوری اطلاعات زمان اجرا برای داده های نرم افزار در حالت ایستا انجام میشود.

معمولا از سه اصطلاح در آنالیز جریان داده استفاده میشود. 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

گراف جریان کنترلی (CFG)

یک نمایش گرافی انتزاعی از نرم افزار به وسیله ی گره هایی که هر کدام از آن ها یک basic block می باشد. یک نود از گراف نشان دهنده ی یک basic block بوده و یال ها نشان دهنده ی مسیر های اجرایی از یک گره به گره دیگر می باشد. اگر یک گره فقط یال خروجی داشته باشد آن را به عنوان گره ورودی شناخته و اگر یک گره فقط یال ورودی داشته باشد آن را به عنوان گره خروجی میشناسیم.

به طور مثال در تصویر زیر گره 1( گره بالا) ورودی و گره 6(گره پایین) خروجی می باشد.

نمونه یک CFG
نمونه یک CFG

Taint Analysis

روش 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 Positive )

یک ابزار تحلیل ایستای کد معمولا خطا هایی را تشخیص می دهد و آن ها را به عنوان خطا گزارش می کند که در اصل واقعا خطا نبوده اند و مشکلی در آن قسمت ها نیست. یکی از دلایل این رخداد این است که ابزار نمیتواند از جامعیت و امنیت داده در زمانی که در حال گرفتن ورودی و خروجی در برنامه جریان دارد به در ستی مطلع شود.

اعلام خطای به غلط میتوانند زمانی گزارش شود که در حال آنالیز کردن اپلیکیشنی هستیم که با تمامی اجزاء آن در ارتباط نیست و نمیتوانند به بقیه ی کامپننت ها دسترسی داشته باشد و در نتیجه نمیتواند جریان داده را ببیند و آن را آنالیز کند. زیرا که بدون بودن کد به دست آوردن جریان داده و تغیرات ورودی ها وخروجی ها امکان پذیر نمیباشد.

اعلام نکردن خطا به غلط (False Negative)

استفاده از ابزار های تحلیل ایستای کد میتواند منجر به False Negative نیز بشود و در مکانی که باید آسیب پذیری کد را گزارش کند این کار را نکند. این ممکن به طور مثال زمانی اتفاق بیفتد که مشکل در یک کامپننت دیگر وجود دارد و این آنالیزگر به آن دسترسی نداشته و آن را بررسی نکرده است و در زمان اجرای کد در دست بررسی این کد، کامپننت دیگر را صدا زده و آن نیز اجرا میشود و در آن خطا رخ میدهد که عملا یکی از آسیب پذیری های زمان اجرای این کد بوده که گزارش نشده.

به طور کلی چه معیار هایی میتوان برای انتخاب ابزار داشت؟

  • نیازمندی : باید حتما زبان در حال استفاده را پشتیبانی کند.
  • این که بدانیم کدام نوع از آسیب پذیری ها را در کل می تواند یافت کند.
  • آیا نیاز به یک کدی دارد که کاملا قابل اجرا است یا با کد های نصفه و ناکامل هم کار میکند>
  • میتواند بدون داشتن تمام کد مبدا اجرا شود؟
  • میتواند با IDE آن را تجمیع کرد؟
  • میزان هزینه ای که باید برای مجوز استفاده از ابزار بپردازیم.
  • آیا از OOP پشتیبانی میکند؟


برنامه های مشابه ایرانی برای آنالیز کد

برای حوزه ی تحلیل ایستا کد متاسفانه شرکتی یافت نشد که به طور مشخص برنامه ای برای این کار ارائه داده باشد.

این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است

منابع

owasp.org

معماری_نرم_افزار_بهشتیStatic Code Analysis
شاید از این پست‌ها خوشتان بیاید