امن سازی اپلیکیشنهای موبایل: راهی برای محافظت در برابر تهدیدات سایبری

  • نویسنده: علی مهرآبادی
  • تاریخ انتشار: سه‌شنبه ، ۰۷ مرداد ماه ۹۹
  • تعداد بازدید: 736
  • تعداد نظرها: 0
  • دسته بندی: امنیت برنامه های موبایل

تهدیدات سایبری بر روی اپلیکیشنهای موبایلی روز به روز در حال افزایش است. بر اساس مطالعات مؤسسه Verizone، بیش از 40% از شرکتهای تحت بررسی طی سال گذشته مورد حمله سایبری قرار گرفته اند. نفوذگران بیش از همیشه به دنبال یافتن اپلیکیشنهای آسیب پذیر و سوء استفاده از آنها (با مهندسی معکوس (Reverse Engineering) برنامه و یا استفاده از آسیب پذیری های حین اجرا (Runtime)) هستند و به همین دلیل نرخ تراکنشهای تقلبی به شدت رو به فزونی است. از طرفی وابستگی سازمانها و کسب و کارها به اپلیکیشنهای موبایلی نیز روز به روز در حال افزایش است و بنابراین لازم است به امنیت آنها به عنوان الزامی جهت تداوم کسب و کار، توجه ویژه شود.

هر روز بد افزارهای جدیدی به بازار روانه می شود و اپلیکیشنهای بیشتری را هدف قرار می دهد. آسیب پذیرترین اپلیکیشنهای موبایلی را می توانید اینجا بررسی کنید. نتایج یک پژوهش میدانی نشان می دهد که بسیاری از اپلیکیشنهای مالی و مرتبط با صنعت پرداخت، آسیب پذیر هستند. برای تبیین بهتر این آسیب پذیری ها، در مقاله دیگری به باورهای غلط از سوی برنامه نویسان اپلیکیشن‌های موبایل در خصوص امن بودن پلتفرم های موبایلی پرداخته ایم. در مقاله مذکور اقدام به دستکاری کد (Tampering) و Repackaging یک اپلیکیشن در هر دو پلتفرم اندروید و iOS شده است.

امن سازی اپلیکیشنها، یکی از روشهای مؤثر برای ارتقای امنیت اپلیکیشنهاست و بسیاری از سازمانها و شرکتهای بزرگ – که امنیت اطلاعات خود و مشتریانشان را به خوبی درک می کنند- با استفاده از ابزارهای مختلف امن سازی، کار نفوذگران را اگر نگوئیم غیر ممکن، بسیار سخت کرده اند.این کار با استفاده از لایه های مختلف امنیتی که در بخشهای مختلف یک اپلیکیشن پیاده سازی می شود، انجام می گردد.

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

انواع آسیب پذیری ها

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

آسیب پذیری های ایستا (استاتیک)

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

آسیب پذیری های زمان اجرا (پویا یا دینامیک)

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

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

 

چگونگی سوء استفاده نفوذگران از آسیب پذیری ها

نفوذگران با استفاده از ابزارهای برگرداندن برنامه (Decompiler, Disassembler) تلاش می کنند تا اطلاعات حساس و یا الگوریتم عملکردی اپلیکیشن را استخراج نمایند؛ بنابراین سوء استفاده از اینگونه تهدیدات نیازمند نصب و اجرای برنامه نیست. اما برای سوء استفاده از آسیب پذیری های پویا، لازم است برنامه بر روی یک دستگاه یا محیط شبیه ساز نصب شود.

سه نوع از متداول ترین آسیب پذیری هایی که بصورت گسترده ای توسط نفوذگران مورد استفاده قرار می گیرند، عبارتند از:

استخراج کلید ارتباطی API (API key extraction)

نفوذگران ممکن است پس از دسترسی به متن کد، به دنبال آدرسهای ارتباطی برنامه جستجو کنند. با دسترسی به کلیدهای ارتباطی (API key)، می توانند از آن برای سایر برنامه های خود استفاده کرده و پرداختهای دورن برنامه ای خود را بدون پرداخت هزینه، انجام دهند؛ یا ممکن است این کلیدها را در بازار سیاه فروخته و یا در دسترس عموم قرار دهند تا منافع مادی مالک اپلیکیشن را با خطر جدی مواجه سازند.

سرقت آدرس IP، تزریق بدافزار (malware insertion) و انتشار نسخه های تقلبی

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

سرقت (Piracy) یا برداشت از اعتبار (credential harvesting)

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

 

نمونه های فراوانی از اینگونه حملات در سرتاسر جهان گزارش شده است. یکی از نمونه های بارز آن، سرقت اطلاعات جغرافیایی کاربران در بازی معروف Pokemon Go است. اگرچه توسعه دهندگان این بازی، بررسی های اولیه محیط نصب را انجام داده بودند و دستورالعملهای بررسی محیط نصب (Root Checker) را مد نظر قرار داده بودند، اما نفوذگران با دور زدن (Bypass) این بررسیها، موفق به بی اثر کردن آن و نصب برنامه بر روی تلفنهای root شده کردند. مشابه این موضوع در پلتفرم iOS نیز برای اپلیکیشنهای Photo Vault و Keepsake اتفاق افتاد و نفوذگران با مهندسی معکوس برنامه، کدهای حساسی را که بصورت متن واضح (Clear text) درون برنامه استفاده شده بود، استخراج کردند. این کار با استفاده از نصب برنامه بر روی گوشیهای jailbreak شده انجام شد و کلمات عبور به سادگی در دسترس نفوذگران قرار گرفت. در اینجا نیز علاوه بر آسیب پذیر بودن برنامه در برابر مهندسی معکوس، محیط نصب برنامه نیز در زمان نصب مورد بررسی قرار نمی گرفت و مهاجم از همین رخنه های امنیتی، نهایت استفاده را بعمل آورد.

امن سازی اپلیکیشن چگونه از برنامه ها در برابر آسیب پذیری ها محافظت می کند؟

در برابر تهدیدات مختلفی که به برخی از انواع آنها در بالا اشاره شد، بسیاری از برنامه نویسان از روشهای ساده و عمومی – که در بسیاری از وب سایتها و وبلاگها به آنها اشاره شده است- استفاده می کنند (بعنوان مثال استفاده از روشهای اولیه تشخیص محیطهای root و یا jailbreak) و تلاش می کنند با استفاده از استراتژی موسوم به "خودت انجامش بده" (DIY: Do It Yourself) این آسیب پذیری ها را رفع نمایند یا اینکه از ابزارهای رایگان موجود مانند Proguard استفاده می کنند. اما نفوذگران با اطلاع از این مکانیزمهای ساده و ابتدایی، به سادگی آنها را دور زده و به اطلاعات حساس برنامه دست پیدا می کنند. در واقع در این حالت توسعه دهندگان/مالکان اپلیکیشن به آسیب پذیری برنامه خود واقفند، اما آنرا دست کم ارزیابی می کنند.

امن سازی در برابر حملات ایستا

راهکار اصولی به منظور حفاظت از برنامه های موبایلی، استفاده از راهکارهای امنیت چند لایه است که در کنار حفاظت از متن برنامه در برابر تهدیدات ایستا، آنها را در برابر تهدیدات پویا نیز محافظت می کند. امن سازی کد، ابزاری قدرتمند برای محافظت از APK و SDK ها بر روی هر دو پلتفرم اندروید و iOS است. در این روش می توان با اعمال سیاستهای امنیتی مختلف (مانند درهم سازی (Obfuscation) و رمزنگاری(Encryption)) در لایه های مختلف، متن کد برنامه را امن نمود. به این ترتیب امکان مهندسی معکوس برنامه توسط ابزارهای مختلف (اعم از خودکار و دستی) وجود نخواهد داشت و تحلیل ایستای برنامه توسط نفوذگران، بسیار دشوار خواهد شد.

درهم سازی (Obfuscation)

با استفاده از درهم سازی، متن کد بعد از بازخوانی متن از روی فایل نصبی توسط decompiler، نامفهوم و غیر قابل فهم خواهد شد. البته این درهم سازی، هیچ اثری بر عملکرد برنامه نخواهد داشت. روشهای درهم سازی بسیار متنوع هستند و در یک دسته بندی کلی عبارتند از:

  • درهم سازی نامها (Name Obfuscation): عبارت است از تغییر نامها و مشخصه های مورد استفاده در متن برنامه؛ بگونه ای که امکان یافتن ارتباط معنادار بین نامهای اصلی و نامهای تغییر یافته و ردیابی آنها وجود نداشته باشد.
  • درهم سازی جریان داده (Control Flow Obfuscation): به مفهوم درهم سازی جریان منطقی برنامه است؛ بگونه ای که منطق برنامه غیر قابل پیش بینی و غیر قابل درک شود.
  • درهم سازی روابط (Arithmetic Obfuscation): به درهم سازی روابط محاسباتی و منطقی ساده گفته می شود تا منطق محاسباتی برنامه از دید مهاجمان مخفی و مستتر بماند.

رمزنگاری (Encryption)

رمزنگاری روشی برای اطمینان از عدم خوانایی اطلاعات حساس درون کد برنامه در زمانی است که برنامه در حال اجرا نیست. در زمان اجرا این اطلاعات ناخوانا، رمزگشایی شده و مورد استفاده قرار می گیرد. به این ترتیب اطلاعات صرفاً در زمان نیاز و در فراخوانی در متن برنامه در زمان اجرا، رمزگشایی خواهد شد. جهت اطمینان پیشنهاد می شود که رمزنگاری در لایه های مختلف برنامه انجام شود. برخی از انواع ابتدایی رمزنگاری ها عبارتند از: رمزنگاری رشته ها (String Encryption)، رمزنگاری کلاسها (Class Encryption)، رمز نگاری داراییها (Asset Encryption) و رمزنگاری منابع (Resource Encryption).

امن سازی در برابر تهدیدات زمان اجرا (Runtime)

امن سازی اپلیکیشن بخش حیاتی از تأمین امنیت کاربران و مالک اپلیکیشن است که می تواند در لایه های مختلف، اجرا شده و با تدابیر محافظت خودکار در برابر تهدیدات پویا (Runtime Application Self-Protection (RASP)) تکمیل گردد. این بخش از امن سازی، از اپلیکیشن در برابر تهدیدات پویا مانند نصب و اجرای برنامه در محیط root و یا jailbreak و یا استفاده از مکانیزمهای hooking برای تغییر برنامه در زمان اجرا محافظت خواهد کرد و می تواند در چنین شرایطی بر اساس سناریوی از پیش تعیین شده، واکنش مناسب (مانند توقف اجرای برنامه و یا نشان دادن پیغام مناسب) را نشان دهد. به این ترتیب امکان انطباق اپلیکیشنها با الزامات بسیاری از استانداردهای بین المللی (مانند PCI) فراهم خواهد شد.

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

 

شرکت گارداسکوئر با ارائه دو محصول iXGuard و DexGuard مجموعه ای از راهکارهای منحصر بفرد را برای امن سازی اپلیکیشنهای موبایلی در برابر آسیب پذیری های ایستا و پویا فراهم کرده است.

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