روش های دور زدن مکانیزم امنیتی SSL Pinning در برنامه های موبایل

تاریخ انتشار: 8 سال پیش
آخرین بروزرسانی: 2 ماه پیش توسط wp71948829
105 بازدید
0 نظر

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

 

به طور کلی دور زدن مکانیزم امنیتی SSL Pinning توسط مهاجمین به یکی از دو روش زیر قابل انجام است:

  1. از طریق جلوگیری از بررسی SSL پین شده و یا دستکاری نتیجه حاصل از این بررسی.
  2. از طریق جایگزینی داده های پین شده در اپلیکیشن، به عنوان مثال جایگزینی گواهی موجود در asset ها و یا کلید هش شده.

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

آزمون و هدف

در ادامه به توضیح چگونگی دور زدن TrustKit SSL Pinning در نرم افزار نسخه دموی TrustKit که بر روی نسخه ی جیلبریک شده آیفون اجرا می گردد، پرداخته می شود. برای این کار، از ابزارهای زیر استفاده خواهیم کرد:

  • از mitmproxy برای تجزیه و تحلیل داده های ارسالی در شبکه استفاده می شود که ابزارهای جایگزین آن Burp Suite یا Charles هستند.
  • ابزار Frida برای متدها و حملات hooking و patching استفاده می شود. از دیگر فریمورک های محبوب برای hooking میتوان به Cydia Substrate، Cycript یا Substitute اشاره نمود.
  • برای جایگزینی رشته ها در باینری، از ابزار Disassembler Hopper استفاده خواهیم کرد.

طبیعتا نرم افزار نسخه دموی TrustKit قابلیت کمتری نسبت به نسخه تجاری آن را دارد و تنها قابلیتی که ما از آن استفاده می کنیم، تلاش برای اتصال به https://www.yahoo.com با استفاده از یک هش پین نامعتبر برای آن دامنه می باشد.

 

 

توجه داشته باشید حتی اگر هشهای ارائه شده برای دامنه yahoo.com معتبر باشند، اعتبار سنجی SSL Pinning بایستی رد شود زیرا ما از پراکسی مردمیانی یا Man-in-the-Middle  استفاده میکنیم.

هنگام اتصال به دامنه yahoo.com، ابزار mitmproxy نشان می دهد که دامنه در واقع بازدید نمی شود و فقط گزارش اعتبارسنجی Pinning SSL به سرورهای مورد نظر ارسال می گردد. از سوی دیگر دستگاه خود پیامی با محتوای رد شدن اعتبارسنجی Pinning نمایش می دهد. تمامی این رفتارها با توجه به فعال بودن SSL Pinning کاملا طبیعی و قابل پیش بینی هستند.

 

 

متد اول: جلوگیری از بررسی SSL پین شده

در ادامه به بررسی چگونگی دور زدن SSL Pinning با استفاده از ابزار Frida می پردازیم. اما پیش از آن بایستی بدانیم که در کدام قسمت از کد، در واقع چک کردن و بررسی SSL Pinning انجام می شود.

پیدا کردن محل بررسی

از آنجا که TrustKit منبع باز است، بنابراین به راحتی می توان دریافت که منطق اعتبار سنجی گواهی واقعی در کجا می افتد: -[TSKPinningValidator evaluateTrust:forHostname:].  در مواردی که سورس کد در دسترس نباشد، با یک بررسی دقیق تر از API کتابخانه Pinning SSL می توان دریافت فعالیت اصلی اعتبار سنجی در کجا اتفاق می افتد.

امضای evaluateTrust:forHostname: حاوی اطلاعات زیادی در خصوص متد مربوطه می باشد.

 

 

همان طور که مشاهده می شود این متد 2 ورودی شامل نام سروری (Hostname) که قصد اتصال به آن وجود دارد را شامل شده  و در نهایت TSKTrustDecision را به عنوان خروجی باز می گرداند. این متغیر از نوع enum می باشد.

 

 

همان طور که در سورس کد مشاهده می گردد، هر یک از فیلدهای مربوطه مورد اشاره قرار گرفته است، اما روشن است که مهمترین مقدار در میان آنها، مقدار فیلد TSKTrustEvaluationSuccess می باشد.

دور زدن بررسی SSL

برای دور زدن بررسی TrustKit SSL pinning، ما متد [TSKPinningValidator estimateTrust: forHostname:] را با استفاده از ابزار Frida، دستکاری (یا به اصطلاح hook) خواهیم کرد و اطمینان حاصل می کنیم که همیشه مقدار مورد نظر ما را برمی‌گرداند. در ابتدا اسکریپت مورد نیاز ابزار Frida را ایجاد می کنیم و آن را با عنوان disable_trustkit.js ذخیره می کنیم.

 

 

این اسکریپت در واقع Frida را به متد evaluateTrust:forHostname: instance در محیط TSKPinningValidator متصل می کند و کد مربوطه را  هر بار که این متد باز گردانده می شود، اجرا می کند. این کد، بدون در نظر گرفتن مقدار قبلی و واقعی (TSKTrustEvaluationSuccess) ، آن را با مقدار صفر (0) جایگزین کرده و بر می گرداند.

حال Frida را اجرا نموده و به فرآیند TrustKitDemo موجود در دستگاهمان متصل نموده و اسکریپ را اجرا می نماییم:

frida -U -l disable_trustkit.js -n TrustKitDemo-Swift.

اکنون اگر https://www.yahoo.com را لود کنیم، می بینیم که در mitmproxy suite ، این URL با موفقیت بارگذاری شده است.

 

 

همچنین مطابق با شکل زیر در موبایل نیز این پیام را مشاهده می کنیم: تأیید پین با موفقیت انجام شده است.

 

 

همجنین، Frida خروجی زیر را برای حصول اطمینان از اینکه فرآیند دستکاری (hook) مطابق با انتظار ما عمل کرده و مقدار مطلوب را برگردانده است، ارائه می دهد.

[iPhone::TrustKitDemo-Swift]->

Current return value: 0x1

Return value replaced with (TSKTrustDecision)

TSKTrustDecisionShouldAllowConnection

 Current return value: 0x1

Return value replaced with (TSKTrustDecision)

TSKTrustDecisionShouldAllowConnection

 

اکنون فرآیند دور زدن Pinning TrustKit SSL با موفقیت انجام شده و تمامی درخواست های وب قابل مشاهده و تغییر می باشند. البته مثال ارائه شده تنها یک نمونه ساده و ابتدایی از دور زدن Pinning SSL تنها با تغییر مقدار بازگشتی متد می باشد.

استفاده از سایر ابزارها

دور زدن SSL Pinning را می توان حتی با استفاده از ترفندهای موجود برای موبایل های جیلبریک شده، از طریق روش های ساده‌تری انجام داد. برای مثال، SSL Kill Switch 2 پشته TLS در سیستم عامل iOS را پچ کرده و بدینوسیله کلیه SSL پیاده سازی شده که از آن استفاده می نمایند را غیرفعال می کند. یکی از این ترفندها می باشد. از سوی دیگر ابزار Objection SSL Pinning disabler  در Frida، بررسی های سطح پایین SSL Kill Switch 2 را اجرا می کند و چند نمونه هوک در اسن فریمورک را ایجاد می نماید.

جدول زیر متدهایی را که می توانند برای بعضی از فریمورک های SSL Pinning ، هوک شوند را تشریح می کند.

 

 

روش مقابله: تشخیص و شناسایی hooking

قبل از تأیید SSL Pin، می توان به منظور شناسایی حملات هوکینگ، یکپارچگی و عدم دستکاری شدن یا تغییر غیرمجاز توابع فوق را مورد بررسی قرار داد. به عنوان مثال، از SSL Kill Switch 2 که در بالای فریمورک معروف Cydia Substrate جهت انجام حملات هوکینگ در زمان اجرا، ساخته شده است، استفاده خواهیم کرد. هوکینگ در این فریمورک از طریق MSHookFunction API  انجام می شود.

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

یک روش معمول برای هوک کردن توابع اساسی (native)، جایگزین نمودن چند دستور اولیه آنها با یک ترامپلاین (Trampoline)  است. ترامپلاین به مجموعه ای از دستورها گفته می شود که مسئول انتقال جریان کنترل به یک قطعه کد جدید برای جایگزینی یا تقویت رفتار اولیه است. با استفاده از lldb، می توانیم دقیقا متوجه شویم “ترامپلاین” چیست و چگونه به نظر می رسد.

10 دستور اول تابع اولیه (unhook) به شرح ذیل است:

 

 

10 دستور اول تابع هوک شده به شرح ذیل است:

 

 

در تابع هوک شده، 16 بایت اول، ترامپلاین را تشکیل می دهند. آدرس 0x00000001002ebc2c در رجیستر x16 بارگذاری می شود و سپس به آن آدرس می رود (BR X16). این آدرس به المان زیر اشاره می کند:

SSLKillSwitch2.dylib`replaced_tls_helper_create_peer_trust

همان گونه که مشاهده می شود، در آن SSL Kill Switch 2 جایگزین شده است.

 

 

اگر پیاده سازی تابع از پیش مشخص شده باشد، چند بایت اول از تابع یافت شده را می توان با بایت های مشخص شده مقایسه کرد. بدین ترتیب می توان بدون نقض Pinning را اجرا نمود. در خصوص Cydia Substrate، مشاهده می شود که تابع با استفاده از یک برنچ غیرشرطی به یک رجیستر (BR Xn) پچ شده است، در این حالت می توانیم وجود این دستور را در چند بایت اول بررسی نماییم. در صورتیکه دستور برنچ یافت شد، فرض بر این است که تابع هوک شده و در غیر اینصورت تابع معتبر است.

روش مقابله: مبهم سازی اسامی (Name Obfuscation)

همان طور که در بالا دیدیم، برای دور زدن مکانیزم SSL Pinning، نفودگر ابتدا باید بفهمد که کدام مکانیزم را باید هوک کند. با استفاده از یک ابزار مبهم سازی (Obfuscation) متادیتاهای اپلیکیشن های iOS نوشته شده به زبان Swift و یا Objective-C، برنامه نویسان می توانند این تشخیص را برای نفود گر بسیار دشوار سازند.

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

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

متد دوم: جایگزینی داده های SSL Pinning

راه دیگر برای دور زدن SSL Pinning این است که داده های پین شده را در داخل برنامه جایگزین نماییم. اگر ما قادر به جایگزینی فایل گواهی پین شده اصلی یا رشته کلید عمومی با گواهی یا کلید موجود در سرور مردمیانی (Man-in-the-Middle) خودمان باشیم، قاعدتا میتوانیم سرور خودمان را به جای سرور اصلی پین کنیم.

جایگزینی یک فایل گواهی جاسازی شده می تواند به آسانی جایگزینی یک فایل در پکیج IPA باشد.

در اپلیکیشن هایی که هش کلید عمومی سرور را پین می کنند، می توانیم رشته را با هش کلید عمومی سرور خودمان جایگزین کنیم. تصویر زیر نشان می دهد که چگونه برنامه Demo TrustKit در ابزار Hopper بارگذاری شده است. Hopper به مهاجم اجازه می دهد که رشته ها را در فایل MachO جایگزین نموده و آن را مجددا به شکل یک فایل قابل اجرا و معتبر تبدیل نماید.

 

 

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

روش مقابله: مبهم سازی رشته ها (String Obfuscation)

هنگام پین کردن گواهینامه ها با یک لیست از هش های کلید عمومی hard-code شده، بهتر است که مقادیر و ارزش ها را رمزگذاری کنید. این عمل در واقع اپلیکیشن شما را در برابر حملات hooking محافظت نخواهد کرد، اما نفوذگر را برای جایگزینی هش های اصلی با گواهی ساختگی از سوی او، با مشکل جدی رو به رو می سازد. مبهم سازی و رمزگذاری رشته ها (مقادیر) در این بخش قابل استفاده می باشد. ابزارهای DexGuard برای اپلیکیشن های اندرویدی و همچنین iXGuard برای برنامه های iOS می توانند مبهم سازی رشته های (حساس) مدنظر برنامه نویس را انجام دهند.

روش مقابله: مبهم سازی جریان کنترل (Control Flow Obfuscation)

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

اشتراک‌گذاری:

دیدگاه‌ها (0)

💬

هنوز دیدگاهی ثبت نشده است. اولین نفری باشید که نظر می‌دهید!

ارسال دیدگاه