سماع قلمی حول برنامهنویسی، امنیت و دنیای آنالوگ https://mrbug.ir
هک اپهای بانکی ایران - بخش اول
من علیرضام. برنامهنویسم و کنارش به جای هنر، امنیت رو ادامه دادم. اگر یادتون باشه چند وقت پیش خبر دزدی از بانک ملی سر صدای زیادی کرد. داشتم با خودم فکر میکردم که اگر دزدها به همین راحتی میان تو بانک و امانات مردم رو میدزدن آیا رابطهای بین امنیت فیزیکی و امنیت سایبری بانکها وجود داره؟
اما فکر کردن مثل خیلی وقتای دیگه فایدهای نداشت به خاطر همین دست به کار شدم. امنیت اپهای بانکی هم مثل امنیت فیزیکی داستانهای خودش رو داره و در چندین لایه ممکنه تعریف بشه. مثلا دیوارهای محکمی داشته باشه، دوربین و حسگر های قدرتمندی برای ورود داشته باشه یا اینکه هرکسی اجازه ورود به بخش های حساس رو نداشته باشه و...
توی قسمت اول قراره ۱۰ عامل امنیتی خیلی بیرونی ۱۸ اپ بانکی( کشور عزیزمون )ایران رو باهم بررسی کنیم و ببینیم دیوارهاش چقدر محکمه اما (Spoiler Alert) رد شدن از این دیوارها و پیچش دوربینهای نظارتی و نگهبانها و تعقیب و گریز با پلیس رو توی قسمتهای بعدی بررسی خواهیم نمووود.
بعد از خوندن این پست:
- میفهمیم که بانکها چقدر به امنیتشون (مال مردم) اهمیت میدن.
- کدوم بانک از همه امنتره و کدوم...
- نکات فنی راجع به امنیت اپهای اندرویدی فرا خواهیم شاید گرفت.
هشدار
کلیه مطالب و تحقیقات جنبه آموزشی داشته بدون نقض حریم خصوصی و افشا اطالاعات محرمانه اپلیکیشنها انجام شده است. مسئولیت هرگونه سو استفاده و نقض حریم خصوصی با استفاده از مطالب، بر عهده شماست.
امنیت هر بانک از ۱۰
در صورت داشتن هر مکانیزم امنیتی خاص، اپ مورد نظر یک امتیاز مثبت دریافت کرده و بالاترین امتیاز مربوط به بانک ملی و سینا هست.
به دلیل اینکه مکانیزمهای امنیتی وزن برابری ندارند، مثلا نمیشه گفت که امنیت بانک ملی با سینا باهم برابره و اینجاست که 7 با 7 برابر نیست!
به طور کلی اگر از من بپرسید دو تا از امنترین بانکها رو نام ببر قطعا خواهم گفت ملی و ملت و ضعیفترین ها هم طبق نمودارها مشخصه. حالا ببنید آیا رابطهای بین میزان دانلود هر اپ توی کافهبازار و میزان امنیت وجود داره؟
برای اینکه دقیقتر مشخص بشه که هر عدد چه مفهومی داره، باید بدونیم هر بانک چه چیزهایی داره و چه چیزهایی نه.
تصویر از خیلی بالا
اینجا به تفکیک معلوم میشه مثلا بانک ملی که در مرحله قبل امتیاز 7 گرفته بود یعنی چی. اگر اعداد سطر بانک ملی رو باهم جمع بزنیم عدد نهایی بدست میاد. که 0 یعنی اون مکانیزم رو نداشته و 1 یعنی داشته.
ممکنه بپرسید که چرا این ویژگی هارو بررسی کردی و فلان ویژگی رو بررسی نکردی و چرا 10 تا؟
بعد از مدتی تامل پاسخ کوبنده "نمیدانم" را خواهم داد! هیچ پشتوانه علمی برای اینکه ثابت کنه دقیقا این 10 مورد دیوار ابتدایی امنیت اپهای اندرویدی هستند وجود نداره اما طبق اندک تجربه احتمالا خیلی هم پر بیراه نمیگم :) از طرفی هم اینجا چون داریم راجع به بانک صحبت میکنیم من ویژگیهایی رو در نظر گرفتم که بیشتر مربوط به دزد جماعت باشه. اگر راجع به مثلا اپ دیگری بود شاید حریم خصوصی کاربر از اهمیت خیلی بیشتری برخوردار بود.(مثلا اینکه آیا اپلیکیشن مورد نظر، لیست نرمافزارهای نصب شده را برای خود جمعآوری میکند یا خیر)
اما شاید هنوز هم برای خیلیها واضح نباشه که این مکانیزمها چی هستن و اصلا به چه دردی میخورن و اگر نباشن چی میشه مگه و اصلا چطوری میتونیم بفهمیم اینا رو.
توی مرحله بعد قراره به صورت تک تک این مکانیزم های امنیتی رو بررسی کنیم.از اینجا به بعدش دیگه دستمون بیشتر به کامپیوتر و امنیت و... آلوده خواهد شد.
شیرجه عمیق فنی
بریم ببینیم این ۱۰ عامل چیه و هرکدوم از اپها کدوم امتیازها رو گرفتن. البته که چون این عوامل به مثابه اون دیوارهای اولیهس و هنوز توی بانک نرفتیم، اینطور نیست که اگر این دیوارها سست باشه الزاما دزدی از بانک راحته. ممکنه دیواراش موش داشته باشن و دزدی که از موش میترسه نتونه واردش بشه.
1- تشخیص شبیهساز اندرویدی
یا همون emulator detection خودمون. همینطور که میدونید یه سری نرمافزارها وجود دارن که دستگاههای اندرویدی رو شبیهسازی میکنن و شما میتونید توی کامپیوتر شخصی خودتون یه اندروید هم داشته باشید.( یکی از خوبا Genymotion هست)
اگر رعایت نشه
اما چون این شبیهسازها دسترسی Root دارند و اگر دستگاهی این دسترسی رو داشته باشه خطرات امنیتی زیادی رو ممکنه متوجه کاربر بکنه. با داشتن این دسترسی همه جای سیستم قابل مشاهده و ویرایش میشه و فرض کنید اگر این اپ بانکی خوش خط و خال ما یه باگ ریز داشته باشه که مهاجم بتونه دسترسی به فایل بگیره. اگر این دسترسی به کل سیستم(همان Root) نباشه فقط به یسری جاهای خاص رو میتونه ببینه اما با وجود این دسترسی کل سیستم رو میتونه مدیریت کنه. اندکی شاید بزرگنمایی کردم خوندن این مقاله میتونه مفید باشه.
حالا توی نمودار زیر:
- 1 به معنای اینه که اپ میفهمیده که توی محیط شبیه ساز اجرا شده و از اجرای اپ خودداری کرده.
- 0 به این معناس که اپ هیچی نفهمیده و اصلا براش مهم نبوده که کجا اجرا میشه.
- 0.5 به این معناس که فهمیده توی شبیهسازه و به کاربر هشدار هم داده اما گفته به من ربطی نداره اگر اپ رو اجرا کنی همه مخاطرات امنیتیش به عهده خودته کاربر عزیزم.
اپها برای امن سازی خودشون میان یه حرکاتی انجام میدن که بفهمن آیا توی محیط شبیه ساز اجرا شدند یا مثل آدمیزاد روی یه گوشی اندرویدی مادرزاد. از طرف دیگه محققان امنیتی(یا شاید دزدان بالقوه) معمولا از این شبیهساز ها استفاده میکنن و کمتر کاربر عادی بانکی پیدا میشه که روی شبیهساز بخواد تراکنش بانکی انجام بده :)
متاسفانه یا خوشبختانه این نرمافزارهای شبیه ساز نمیتونن به صورت صددرصد همه چیز رو شبیه سازی کنن و به خاطر همین موضوع، اگر یکسری اطلاعات سیستمی رو بخونیم متوجه خواهیم شد که الان توی چه محیطی هستیم مثلا این میتونه تابعی باشه که داره تشخیص میده:
چگونه در خانه انجام دهیم
بعد از نصب شبیه ساز مثلا genymotion اپ را با drag&drop روی آن پرت کرده تا نصب شود. پس از اجرا اگر هشداری مشاهده نمودید و از اپ خارج شد به معنی 1 میباشد :)
2- تشخیص دسترسی Root
به جز شبیهساز که دسترسی Root داره ما میتونیم روی دستگاههای مادرزاد اندرویدی خودمون هم این دسترسی رو داشته باشیم.به طور پیشفرض اندرویدهای که در دست ماست در واقع دست ما نیست. خیلی جاهاش محدود شده که ما رو از مخاطرات امنیتی حفظ کنه.
اما این بشر دوپا محدود شدنی نیست و گاهی دلش میخواهد امنیت را فدای آزادی کند.
مثلا شما میتوانید با Magisk که از سلاطین Root توی اندرویده به این آزادی برسید. اینجا هم توضیحات نمودارش مثلا مورد اوله که تشخیص شبیهساز بود.
- 1 به معنای اینه که اپ میفهمیده که گوشی روت شده و از اجرای اپ خودداری کرده.
- 0 به این معناس که اپ هیچی نفهمیده و اصلا براش مهم نبوده که روت هست یا نه.
- 0.5 به این معناس که فهمیده که روته و به کاربر هشدار هم داده اما گفته به من ربطی نداره اجرا کن بره.
دسترسی روت آتشی در گوشی برپا میکنه که برنامه نویس زبل از رو همین گرما به راحتی میتونه بفهمه این آتش، قراره یه روزی خرمنش را به باد دهد. چنتا از این تغییرات به عنوان مثلا:
- توانایی اجرای دستور su
- نصب چیزایی مثل com.noshufou.android.su
- تغییر permissionهای پوشه های /system /data /dev
و کلی داستان دیگه که توی این لینک میتونید ببینید.
چگونه در خانه انجام دهیم
یک گوشی روت شده توسط مثلا Magisk را برداشته و پس از نصب اگر برنامه به درستی اجرا شد یعنی این کار برای برنامه اهمیتی نداشته!
3- مخفی کردن روت با magisk
فکر کردید بازی با چهارتا تشخیص اینکه چه پوشهای عوض شده یا چه اپی نصب شده تموم میشه؟ نه آقا نه. دوستان روت کننده که بلد بازی هستند وقتی دیدن تقریبا همه اپهای بانکی اگر ببینن گوشی روت بشه اجرا نمیشن، دست به اقدام بدی زدند که من ندیدم تاحالا بشه اونو هم فهمید و دورش زد. با خلق zygisk که یکی از افزونه های سلطان magisk ه و اینجا میتونید نحوه نصبش روی دستگاه روت شده خودتون رو ببینید، شما قادرید که انتخاب کنید کدام اپها نفهمن گوشی شما root شده. اینکه با چه مکانیزمی این کار انجام میشه از حوصله این مقاله خارجه (اینکه منم کامل بلدش نیستم بی تاثیر نیست) و هیچ کدوم از اپهامون هم متوجه این قضیه نشدن و نمره صفر گرفتن. البته همونطور که گفتم من تا حالا ندیدم اصلا بشه این رو فهمید، اگر اطلاعی در این زمینه دارید بهم بگید خلاصه :)
4- تشخیص frida
خب خب، frida یکی از قدرتمندترین ابزارهایی که من میشناسم. برای تحلیل پویا(در مقابل تحلیل ایستا که تحلیل و مهندسی معکوس کدهای برنامس در حالتی که هنوز حتی نصبش هم نکردیم) استفاده میشه یعنی وقتی برنامه در حال اجراس میشه یه تغییراتی توی توابع و متغیرها داد که عمل دلخواه مهاجم رو انجام بده(در واقع رم رو تغییر میده) حالا چون این ابزار عزیز برای اجرا شدن نیاز به root داره اکثرا گفتن که خب چون ما root رو بررسی کردیم دیگه اینو بیخیال ( چون که 100 آید 90 هم پیش ماست).
اما بانک ملت و سینا من رو تحت تاثیر قرار دادن چرا که به صورت جدا این بزرگوار رو بررسی کردن چون حواسشون هست که توی یه سناریو خاص میشه بدون اینکه گوشی root باشه frida رو به نکاح اپلیکیشن درآورد.
چگونه در خانه انجام دهیم
ابتدا یه گوشی یا شبیه ساز روت شده نیاز دارید سپس مثل این لینک برید جلو و frida رو کانفیگ کنید. بعدش فقط کافیه یکبار اپ رو با frida اجرا کنید و اگر اجرا شد یعنی برای اپ مهم نیست. اما یه نکته ریزی هم هست که باید توسط frida دورش بزنید و اون Root detection ه که توی مرحله قبل گفتیم. این کارها با RMS (که در واقع داره از frida استفاده میکنه) خیلی راحتتره.
5- وجود SSL-Pin
تبریک میگم دوستان! تمام اپهای بانکی ما SSL-Pin دارند. اما خب حالا که چی؟
به طور خیلی ساده اگر بخوام بگم SSL-Pin یه مکانیزم امنیتی برای ارتباط با سروره که نمیذاره کسی اون وسط(یعنی بین گوشی و سرور) به شنود ترافیک بپردازه. چنتا راه داره که مثلا یکیش اینطوریه که میاد کلید عمومی سرور رو بررسی میکنه، اگر با اونی که مدنظر خودشه(معمولا توی اپ هارد کد شده) یکسان نباشه، خطا میده و هیچ ارتباطی برقرار نمیشه. برای اطلاع بیشتر این رو بخونید خوبه.
چگونه در خانه انجام دهیم
برای تست این مورد احتیاج داریم یه پروکسی سرور داشته باشیم. بعد این پروکسی رو روی اندرویدمون ست کنیمو بعد بینگوووو. تمام ترافیک از پروکسی ما رد میشه و میتونیم ببنیم کی به کیه و چی به چیه. ابزاری که معمولا استفاده میشه burp suit هستش که توی این لینک میتونید نحوه استفادش رو ببینید.
اگر وقتی پروکسی رو ست کردید ترافیک رو دیدید یعنی ssl-pin نداره اما اگر با هرگونه اروری مواجه شدید(مثلا من خودم فقط روی login بانکها تست کردم) یعنی بعععله بچه ها حواسشون بوده.
6- چک کردن integrity
این یکی که دیگه خیلی باید آشنا باشه. integrity یک از اضلاع مثلث توی امنیته که به CIA معروفه. توی اندروید مفهومش اینه که آیا این اپی که داره اجرا میشه همونی هست که باید باشه و کسی تغییرش نداده؟ اگر واقعا خودشه که هیچی و اگر تغییر کرده نباید بذاریم اجرا بشه چون کاربر به این اپ اعتماد کرده و ممکنه هرکاری این اپ بگه کاربر فقط بگه چشم!
چون خیلی راحت میشه اپی که فایل apk ش موجوده رو دستکاری کرد و دقیقا با همون اسم و رسم اما با ویژگی های خیلی بدافزارگونه راهی بازار کرد و کاربر از همه جا بی خبر بیاد صرفا با دیدن اسم اپ، سریع نصبش کنه.
البته که اونی که اپ رو داره دستکاری میکنه خب اگر واقعا این کاره باشه این بخش چک کردن integrity هم پاک میکنه و با خیال راحت کار رو جلو میبره، ولی خب کار از محکم کاری هیچوقت عیب نمیکنه!
یکی از روشهای چک کردن همچین چیزی هم اینطوریه که میان از فایل برنامه یه hash میگیرن(md5/sha1/...) بعد موقع اجرا هم باز اینکار رو انجام میدن اگر یکی نبود یعنی بعععله برنامه رو مهاجم عوض کرده و اونی نیست که قرار بوده باشه. توی اندروید میشه از signature برنامه هم استفاده نمود.
چگونه در خانه انجام دهیم
فرایندش نسبتا سادس. من اومدم اول یه Apk studio نصب کردم که فرایند رو راحتتر کنم. به طور کلی اول اپ رو باز میکنم، بعد یه چیزی مثل permission ها رو توی manifest اضافه یا کم میکنم. بعد باید اپ رو sign کرد. بعد build ش کرد به apk و اونو نصب کرد و تمام. اگر گیر داد یعنی بعععععله بچه ها حواسشون بوده:)
7- پک شدن
یکی از مکانیزمهای خیلی جالب که مهاجم رو به زحمت زیادی میندازه استفاده از packer هاست. این بزرگوار میاد تمام کدهای برنامه رو رمز میکنه و زمان اجرا اونها رو رمزگشایی و اجرا میکنه. وقتی به صورت ایستا و مهندسی معکوس اپ رو باز کنید چیز خاصی دستگیرتون نخواهد شد و اصلا هدفش اینه که تحلیل ایستا رو فلج کنه. بانو توی این ارایه ای که داشتن توی black hat 2018 توضیحاتی در این مورد میدن. واقعا برام عجیب بود که بانک ملی داره از این روش استفاده میکنه. حقیقتش رو بخواید فکر نمیکردم اصلا. دمشون گرم.
چگونه در خانه انجام دهیم
این یکی اندکی شاید برای تازه کارها قابل فهم نباشه اما من توضیخ مختصری میدم. ابتدا باید از manifest برنامه main activity رو پیدا کنیم. معمولا پکرها(اونهایی که من دیدم) میان از همینجا تمام کارهای مربوط به رمزنگاری رو انجام میدن و احتمالا چندجا هم از کدهای native استفاده کنن. در واقع شما توی این اکتیویتی اثری از حیات نمیبینید و یه مشت چرت و پرتی که توسط انسان زیاد قابل خوندن نیست اورده شده و بقیه اکتیویتی ها هم اصلا انگار نیستن که بشه بررسی شون کرد.
8- رمزنگاری
هرجا سخن از امنیت باشه مگه میشه رمزنگاری و دوستاش نباشن؟ توی اندروید یسری اطلاعات قراره به صورت محلی روی گوشی ذخیره بشه و همچنین یسری اطلاعات قراره با سرور رد و بدل بشه. اگر این اطلاعات رمز بشن و فرستاده یا ذخیره بشن و موقع بازیابی هم رمزگشایی بشوند، میگوییم دمتان گرم.
من اینجا فقط از رمزنگاری بین اپ و سرور پرده برداشتم و فقط هم از طریق لاگین بانک. به بقیه ترافیک کاری نداشتم چون توی همشون که حساب ندارم که بتونم اصلا تست کنم. اگر از رمزنگاری توی این ارتباط استفاده کرده باشند باید بهشون احسنت گفت چرا که تحلیل ترافیک رو یک مرحله سختتر میکنند. شما فرض کن با کلی بدبختی میای میرسی به ترافیک، بعدش میبینی ای دل غافل که حالا رمز هم شده باید کلی بیل بزنی تا بتونی رمزگشاییش هم بکنی. بله فقط بانک ملت. شیر است.
چگونه در خانه انجام دهیم
بساط burp suit رو دوباره باید بیارید بالا. اما چون همشون ssl-pin داشتن اول باید اون رو دور بزنید. از RMS برای اینکار استفاده شود. بعدش فقط کافیه یک بار با اپ لاگین کنید. اگر نام کابری و رمزعبور رو تونستید توی ترافیک ارسالی ببینید یعنی نه خیر رمزنگاری کنسله.
9- استفاده از Obfuscation
یکی دیگه از کارهایی که تحلیل ایستا رو قراره به کام مهاجم تلخ کنه وارد میشود. یسری کتابخونه و افزونه وجود داره که موقع کامپایل برنامه، باعث میشه اسامی متغیرها، توابع، کلاسها و پوشهها و ... به اسامی مزخرف تغییر پیدا کنه مثلا a,b,c و ... اینجور چیزها که همه چیزها رو شبیه به هم میکنه و تحلیلگر دیگه از روی اسم تابع نمیتونه بفهمه کارش چیه و باید بشینه کل کدهاش رو بخونه تا دقیق بفهمه. البته کارش به همین تغییر اسم محدود نمیشه و اون خفنتر هاش کارهایی دیگه مثل اضافه کردن کدهای اضافی و پیچیدهتر کردن کد و... هم انجام میدن.
چگونه در خانه انجام دهیم
بعد از باز کردن اپ توی jadx-gui و پیدا کردن main activity اگر اسامی متغیرها، توابع یا پوشه های اطراف نا معقول بود یا تک حرفی و دوحرفی و چند حرفی با تکرار زیاد بود بدونید که بعععله بچه ها کارشون رو انجام دادند.
10- کدهای Native
به صورت عادی کدهای موجود در برنامههای اندرویدی java/kotlin هستن که با توجه به ویژگی این زبانها مهندسی معکوس و تبدیل آنها به کد نسبتا شبیه به کدی که برنامهنویس نوشته کار سختی نخواهد بود.
اما گاها برای performance بیشتر یا امنیت بیشتر میان از c/c++ استفاده میکنن که تحلیل و مهندسی معکوس این کدها به سادگی کدهای جاوا نخواهد بود. حالا فرض کنید که یکی از مکانیزمهای امنیتی را به استفاده از کدهای native پیاده سازی کرده باشند(مثلا ssl-pin) حال مهاجم کارهای به مراتب بیشتری را باید برای دور زدن آن مکانیزم امنیتی انجام دهد.
من در اینجا برای اینکه خیلی به حریم خصوصی اپها وارد نشم صرف دیدن کدهای native رای آری به صندوق این مرحله انداختم، اما کار درستتر این است که ببینیم آیا مکانزیم امنیتی بوده که به صورت native نوشته شده باشد یا خیر. به همین خاطر false/positive ممکن است در این آزمایش زیاد از حد بوده باشد.
چگونه در خانه انجام دهیم
ایزی. فایل apk را مانند یک فایل زیپ از حالت فشرده خارج کنید. اگر پوشهای به اسم lib مشاهده کردید یعنی بلخره جایی از برنامه از کدهای native استفاده شده است. حالا یا صرفا برای فشرده سازی یک عکس بوده یا واقعا یکی از مکانیزمهای امنیتی به این صورت نوشته شده تا کار مهاجم را سختتر کند.
نتیجه
خیلی زود به نظر میرسه که بخوایم نتیجه گیری کنیم که آیا بانکها به امنیتشون اهمیت میدهند آنقدری که باید یا نه اما میشه گف تا همین قسمت و صرف نظر از بقیه ابعاد امنیت، بانک ملی و ملت فراتر از انتظار من ظاهر شدند و اینکه چرا نباید همه اپهای بانکی حداقل 9 امتیاز داشته باشن وقتی واقعا خیلی قرار نیست بهشون پیچیدگی پیادهسازی اضافه کنه؟
نکته دیگه هم اینکه تمام ابعادی که بررسی شد توسط یک آدم کاردان قابل دور زدنه و اینطوری نیست که اگر اپی بیاد از اینا استفاده کنه یعنی 100 درصد امنیت داره. صرفا هرکدوم باعث میشه که حمله به تاخیر بیفته یا مثلا برخی از مهاجمین غیر کاردان از ادامه کار صرف نظر کنن.
کارهای آینده
من خیلی دوستداشتم این آموزشهای انجام در خانه به صورت ویدیویی باشه اما به خاطر داستانها نقض حریم خصوصی بانکها بیخیال شدم. اگر بانکی بیاد به من اوکی بده میتونم به صورت عمیقتری بررسی و منتشر کنم.
قسمتهایی بعدی این پست بنظرم خیلی میتونه داستان درست کنه و فعلا قصد ادامشو ندارم. نتیجهگیری اصلی رو بعد از چند قسمت تحلیل اینطوری فرض کنید عجب چیزی بشه! اگر پیشنهادی داشتید که چطوری میشه عمیق تر بانکها رو بررسی و منتشر کرد بدون اینکه واقعا هکشون نکرد خوشحال میشم که بهم بگید:)
دوست دارم که این کارها روی با یکسری چیزهای دیگه مثل تمرکز روی حریم خصوصی کاربران تا تمرکز روی دزدی، ترکیب کنم و روی فروشگاههای آنلاین ایران، خدمات فروشی های ایران، ابزارهای پرطرفدار ایران و ... انجام بدم. من به هیچکدوم از حرفهایی که اینجا گفته شده 100 درصد اطمینان ندارم پس لطفا شما هم نداشته باشید و اگر جایی ایرادی میبینید واقعا بهم بگید.
در ضمن اگر به مباحث امنیتی توی اندروید علاقهمندید میتونید از طریق مخزن زیر به یادگیری بپردازید:
مطلبی دیگر از این انتشارات
تاریخ جهان | انقلاب ایران | مقال شهرزاد و فریدون
مطلبی دیگر از این انتشارات
ممانعت از اکران فیلم مساوی ورشکستگی است
مطلبی دیگر از این انتشارات
تاثیر تبلیغات در اینستاگرام؛ خلق فرصت یا پول سوزی؟