چرا Proguard برای امن سازی اپلیکیشن های اندرویدی کفایت نمی کند؟

  • نویسنده: میلاد یداللهی
  • تاریخ انتشار: شنبه ، ۰۶ اردیبهشت ماه ۹۹
  • تعداد بازدید: 1160
  • تعداد نظرها: 0
  • دسته بندی: امنیت برنامه های موبایل

هرچه کسب و کارهای مختلف، به ویژه صنعت بانکداری و پرداخت بیشتر به سمت استفاده از ابزارها و کانال های مجازی و بهره گیری از اپلیکیشن های موبایلی برای ارتباط با مشتریان تمایل پیدا می کنند و در واقع این کانال نوین و با اقبال را به عنوان مسیری مهم برای راهبردی خدمات خود انتخاب می نمایند، موضوع امنیت زیرساخت این بستر و امن سازی اپلیکیشن های ارائه شده اهمیت بیشتری پیدا می کند. اپلیکیشن های موبایل با توجه به ماهیت خود، این امکان را به مهاجمین می دهند که بتوانند حتی با دانش نه چندان زیاد و بهره گیری از ابزارهای رایگان و قابل دسترس مهندسی معکوس، به سورس کد اپلیکیشن های موبایل دسترسی پیدا کرده و اقدام به انجام اعمال بدخواهانه خود نمایند. بکارگیری یکی از تکنیک های امن سازی اپلیکیشن های موبایل با عنوان درهم ریزی یا مبهم سازی (Obfuscation) و ناخوانا نمودن سورس کد در این میان بسیار مهم و محوری بنظر می رسد. مبهم سازی و ناخوانا نمودن سورس کد، بهترین و معروف ترین روش برای جلوگیری از دستکاری برنامه توسط مهاجم که زمینه ساز اعمال بدخواهانه ای نظیر سرقت IP، ارتکاب کلاهبرداری مالی، انجام خرید درون برنامه بدون واریز وجه و بسیاری از موارد دیگر است، محسوب می گردد.

این تکنیک امن سازی متداول و استاندارد، به منظور جلوگیری از دی‌کامپایل شدن و مهندسی معکوس اپلیکیشن به عنوان مهمترین آسیب پذیری شناخته شده در این حوزه، مورد استفاده قرار می گیرد. باوجود اینکه استفاده از این روش با فرض اینکه به صورت مناسب پیاده سازی شده باشد، موجب ارتقاء چشمگیر امنیت برنامه شده و بسیاری از آسیب پذیری های ذاتی اپلیکیشن را از بین می برد، گزارشات و تحقیقات صورت گرفته بر روی بسیاری از اپلیکیشن های مهم که عمدتا در صنعت بانکداری در حال خدمات رسانی می باشند، نشان می دهد که متاسفانه بسیاری از آنها از هیچ روش مبهم سازی و ناخوانا نمودن کد برنامه استفاده نمی کنند (برای مطالعه بیشتر نتایج این تحقیقات به این مقاله رجوع شود). از سوی دیگر آن دسته از اپلیکیشن هایی که از این تکنیک بهره میگیرند، مبهم سازی کد خود را تنها محدود به مبهم سازی نام ها (Name Obfuscation) به عنوانی یکی از روش های انواع مبهم سازی کد نموده اند. قریب به اتفاق این دسته از اپلیکیشن ها از ابزار نام آشنا و منبع باز Proguard جهت عملیات مبهم سازی نام ها استفاده می نمایند. با وجود اینکه ابزار مذکور به عنوان یک بهبوددهنده مناسب برای اپلیکیشن های اندرویدی جهت کاهش حجم فایل و همچنین کوچک سازی و بهینه سازی آن محسوب می شود، باید به این نکته اساسی توجه نمود که از منظر امنیت و امن سازی برنامه، این ابزار تنها اقدام به مبهم سازی نام ها می نماید که این عملیات به هیچ وجه جهت ایجاد اطمینان نسبی از امنیت اپلیکیشن موبایل کافی نیست. در واقع بر خلاف تصور غلط بسیاری از توسعه دهندگان و مالکان اپلیکیشن ها که فکر می کنند این ابزار رایگان می تواند خیال آنها را از بابت امنیت راحت نماید، باید گفت استفاده از این ابزار تنها یک قدم کوچک در مسیر امنیت برنامه است و قدم های مهم تری جهت دستیابی به یک سطح قابل قبول امنیتی برای اپلیکیشن وجود دارد که باید لحاظ گردد.

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

 

مبهم سازی نام ها چیست؟

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

 

 نمونه 1- کد یک برنامه فرضی

 

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

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

 

  نمونه 2- کد برنامه امن شده با استفاده از روش مبهم سازی نام ها

  

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

اگر بخواهیم دقیقتر به موضوع نگاه کنیم، ابزارهای مهندسی معکوس مورد استفاده توسط هکرها، کاری با مفهوم اسامی ندارند و قرار نیست بر اساس نامگذاری های برنامه نویس در کد، فرآیند خود را جلو ببرند. در واقع حتی اگر اسم واقعی یک متغیر "John" باشد و اسم جایگزین شده برای آن "A@^@#$@#$" تعیین شود، این تغییر تاثیری در فرآیند دی‌کامپایل و مهندسی معکوس ندارد. بنابراین ابزارهای مهندسی معکوس در برابر کدهایی که تنها از تکنیک مبهم سازی نام ها استفاده نموده اند با چالشی روبرو نیستند و کد شما را به راحتی بر می گرداند. حال اگر به نمونه شماره دو مجددا نگاه کنیم، بویژه برای افرادی که دانش حتی اندک از برنامه نویسی دارند، مشخص است که متغیر b نقش اصلی را در کد برنامه بازی می کند و یک مقایسه در خصوص این متغیر در تابع d صورت می گیرد که خود به صورت عمومی در کلاس a قابل دسترس است.

با توجه به دلایل فوق می توان نتیجه گرفت که مبهم سازی نام ها به تنهایی به عنوان یک روش امن سازی کدهای موبایل کفایت نمی کند و تنها زمانیکه با دیگر روش های امن سازی ادغام گردد می تواند موثر واقع شود.

 

چگونه از دیگر تکنیک های امن سازی کد استفاده نماییم؟

همان طور که اشاره شد، به منظور امن سازی موثر در کد اپلیکیشن های موبایل باید روش مبهم سازی نام ها را با دیگر روش های امنیتی ادغام نماییم. در ادامه به معرفی برخی از تکنیک های اصلی امن سازی کد به همراه توضیح نحوه عملکرد هر یک می پردازیم:

 

مبهم سازی جریان کنترلی

به طور کلی تکنیک مبهم سازی جریان کنترلی (Control Flow Obfuscation)، در راستای ایجاد قابلیت ناخوانا بودن هر چه بیشتر کد برای مهاجمین، اقدام به ایجاد تغییر در ساختار کد برنامه می نماید. این تکنیک یک مرحله‌ی بسیار مهم در پیچیده نمودن منطق برنامه است و موجب می شود تا ابزارهای مهندسی معکوس نتوانند برنامه را دی‌کامپایل نمایند.

اما این روش چگونه کار می کند؟ برای فهم بهتر نحوه عملکرد این تکنیک به مثال بالا رجوع می کنیم. به عنوان مثال دستور if استفاده شده در کد نمونه با دستورها و حتی توابع مختلفی جایگزین می شود که عملا پیدا کردن ارتباط میان آنها بسیار مشکل خواهد بود. در واقع این امر موجب می شود تا با بهره گیری از تغییر چینش و ساختار کد، متغیرهای ثانویه، فراخوانی های غیرواقعی و مواردی از این قبیل، عملا بدست آوردن منطق نرم افزار بسیار مشکل و پیچیده شود.

 

مبهم سازی ریاضی

نوع دیگر مبهم سازی، تکنیک مبهم سازی ریاضی(Arithmetic Obfuscation) می باشد. به زبان ساده در این روش کلیه محاسبات ریاضی درون کد با استفاده از معادل های ریاضی آنها جایگزین شده و از لحاظ محاسباتی فهم کد را دشوار می نماید.

 

دیگر تکنیک های امن سازی کد

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

 

 

  نمونه 3- کد برنامه فرضی

 

 

 

   نمونه 4- کد برنامه امن شده با استفاده از روش های مختلف مبهم سازی

 

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

 

امنیت لایه‌ای – قوی‌ترین رویکرد امنیتی برای اپلیکیشن‌های موبایل

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

می توان نتیجه گرفت که هر یک از تکنیک های معرفی شده، با اندکی تفاوت نسبت به یکدیگر، زمانیکه به صورت منفرد به عنوان یک لایه حفاظتی در اپلیکیشن موبایل اعمال می شوند، کارایی کامل و بهینه ای را ندارند و تنها زمانی می توانند به صورت مناسبی موثر عمل کنند که در کنار یکدیگر مورد استفاده قرار گیرند. در واقع هر یک از این روش ها به صورت یک لایه امنیتی می توانند اثر هم افزایی روی یکدیگر داشته و کد اپلیکیشن موبایل را محافظت نمایند. از سوی دیگر ذکر این نکته ضروری است که امنیت اپلیکیشن های موبایل تنها منحصر به حفاظت از کد برنامه در برابر حملات ایستا نمی باشد، بلکه به منظور اطمینان از سطح امنیت قابل قبول برای اپلیکیشن می بایست از تکنیک های امنیتی زمان اجرا (RASP) نیز استفاده نمود.

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