محمد نصیری
بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

چگونه کد امن بنویسیم ؟ اصول کدنویسی ایمن یا Secure Coding

برنامه نويسان با به کار گیری زبان های برنامه نویسی می‌توانند دستورات برنامه خود را طراحی کنند. زبان های برنامه نویسی به طور کلی به سه قسمت تقسيم بندی می شوند:

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران
  1. زبان ماشین (Native code or Binary code: رشته ای از اعداد باینری ۰ و ۱)
  2. زبان های اسمبلی
  3. زبان های سطح بالا (مانند C,C++,VB,Java,.NET)
کدنویسی ایمن

کامپیوترها فقط یک زبان را تشخیص می دهد و آن هم زبان ماشین است در نتیجه تمامی برنامه های نوشته شده ب زبان سطح بالا،می بایست برای اجرا شدن به زبان ماشین تبدیل شوند. دستورات برنامه ابتدا در یک فایل متنی به نام Source code نوشته می شوند سپس توسط Compiler به زبان ماشین ترجمه می شوند.

حاصل این ترجمه یک فایل اجرایی (.exe) است که روی یک Platform مناسب اجرا می شود. در زبان هایی مثل C و VB، دستورات برنامه مستقیما به زبان ماشین تبدیل می شوند اما در زبان های .NET- based و Java، دستورات هنگام کامپایل شدن ابتدا به کد میانی (Intermediate code) که واسط بین زبان برنامه نویسی و Platform است، تبدیل می شوند و سپس کد ماشین (Binary code) از روی آن تولید می شود.

حال یک Cracker می تواند بدون داشتن سورس کد به کدهای برنامه دسترسی پیدا کرده و آنها را تغییر دهد، یعنی با استفاده از یک فایل .exe (Binary code) یا کد میانی (Intermediate Code) به Source Code برسد. به این عمل Reverse Engineering یا مهندسی معکوس می گویند (مبحث مهندسی معکوس در مورد Intermediate Code نسبت به Binary code کاملاً متفاوت بوده و در مقایسه با آن ساده تر میباشد).

سه تکنیک اصلی در مهندسی معکوس عبارت اند از:

  1. Observation of data exchange: در این روش با استفاده از bus analyzers یا packet sniffers داده ای که بین نرم افزار و سخت افزار درحال تبادل است توسط Cracker آنالیز می شود.
  2. Dis-assembly: در این روش با استفاه از یک برنامه به نام disassembler کد ماشین (Binary code) به کد اسمبلی تبدیل می شود. چنانچه Cracker به زبان اسمبلی تسلط داشته باشد می توان از روی کد اسمبلی به طراحی و نحوه انجام محاسبات برنامه پی ببرد.
  3. De-compiling: در این تکنیک از نرم افزارهای خاصی به نام Decompiler(Reflector) استفاده می شود. این نرم افزار یک فایل .exe (Binary code) یا کدمیانی (Intermediate code) را به زبان سطح بالا تبدیل می کند یعنی ازطریق این نرم افزار می توان به Source code برنامه دسترسی پیدا کرد.

برای ایمن سازی کد برنامه و مقابله با مهندسی معکوس استراتژی های مختلفی وجود دارد. آسان ترین و ارزان ترین راه Code Obfuscation (ایجاد ابهام) است، در این متد سورس برنامه یا کد میانی به گونه ای تغییر می کند که decompile کردن آن بسیار دشوار شود (بدون اینکه عملکرد برنامه تغییر کند). فرایند Obfuscation توسط ابزاری به نام obfuscator صورت می گیرد.

انواع روش های یا مبهم سازی obfuscation

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

1.Name obfuscation یا Layout obfuscation: در این حالت فرمت سورس برنامه تغییر می کند، یعنی Identifier های برنامه مثل نام توابع، کلاس ها و متغیرهای برنامه را به گونه ای تغییر می دهیم که مبهم باشند و یا بعد از decompile کد بی معنی تولید شود به عنوان مثال استفاده از Property.

2.Data obfuscation: در این روش ساختار داده های تعریف شده در برنامه تغییر داده می شود که انواع مختلف آن عبارت اند از:

  • 2.1.Storage obfuscation: نحوه ذخیره داده در حافظه تغییر می کند، مثلا مکان تعریف متغیرهای برنامه عوض شود (متغیرهای محلی به Global تبدیل شود).
  • 2.2.Encoding obfuscation: نحوه ترجمه و تفسیر شدن داده ذخیره شده را تغییر می کند. مثلا جانشین کردن یک مقدار با یک عبارت (حایگزین کردن متغییر i با عبارتی مثل c1*i+c2).
  • 2.3.Aggregation obfuscation: نحوه گروه بندی داده ها تغییر داده می شود، به عنوان مثال یک آرایه را به چندین زیرآرایه تقسیم می کنیم. در این روش نحوه دستیابی به ساختار داده بعد از تغییر آن، عوض می شود.
  • 2.4.Ordering obfuscation: ترتیب قرار گرفتن داده ها در یک ساختار داده تغییر می کند، به عنوان مثال عناصر یک آرایه را دوباره مرتب می کنیم به گونه ای که مکان اصلی و اولیه عنصر iام توسط تابع f(i) (تابعی که در برنامه تعریف شده است) تعیین شود.

3.Code flow obfuscation یا Control obfuscation: در این مدل روند کنترل برنامه (control flow) تغییر داده می شود که انواع مختلف آن عبارت اند از:

  • 3.1.Control aggregation obfuscation: نحوه گروه بندی یک Statement تغییر داده می شود، مثلا استفاده از Inline Method به جای فراخوانی متدها.
  • 3.2.Control Ordering obfuscation: ترتیب اجرای دستورات را تغییر دهیم، مثلا حلقه های تکرار را معکوس کنیم، به گونه ای که از آخر به اول تکرار شود.
  • 3.3.Control Computation obfuscation: روند کنترل برنامه تغییر داده می شود. به عنوان مثال اضافه کردن کد مرده یا dead code (کدی که هرگز اجرا نشده) به برنامه، استفاده از دستورات پرش (Jump) کنترل نشده به منظور تغییر نحوه کنترل برنامه و ...

محمد نصیری
محمد نصیری

بنیانگذار انجمن تخصصی فناوری اطلاعات ایران ، هکر کلاه خاکستری ، کارشناس امنیت اطلاعات و ارتباطات

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

نظرات