محققای Threatfabric یه گزارشی منتشر کردن، در خصوص نسخه ی جدید بدافزار بانکی Chameleon برای اندروید ، که امکان دور زدن احرازهویت بیومتریک رو هم داره. در این پست نگاهی به این گزارش انداختیم. از این محققا قبلا گزارش “نسخه جدید Xenomorph ،خطرناکترین بدافزار بانکی اندرویدی” رو هم منتشر کرده بودیم که اگه علاقمند بودید، اونو هم میتونید مطالعه کنید.
تروجان بانکی Chameleon ، از ژانویه 2023 ، بعنوان یه تهدید ظاهر شد و از روش های مختلفی برای توزیع در اکوسیستم اندروید بخصوص برای کاربران استرالیا و لهستان استفاده کرد. برنامه های بانکی ، هدف اصلی این بدافزار هستن و از طریق جا زدن خودش بعنوان یه برنامه قانونی توزیع میشد.
محققا اعلام کردن که در طول آنالیز این بدافزار، تونستن یه نسخه ی بروز شده از Zombinder رو هم شناسایی کنن. Zombinder یه dropper-as-a-service (DaaS) هستش که به بازیگران تهدید امکان ، بایند کردن بدافزارش ، با یه برنامه ی قانونی رو میده.
نمونه های جدید Zombinder ، از یه فرایند پیلود دو مرحله ای پیچیده ، استفاده میکنن. با SESSION_API از طریق PackageInstaller استفاده میکنن و نمونه های Chameleon رو بهمراه بدافزارهای خانواده Hook مستقر میکنن.
در این گزارش محققا روی نمونه های جدید Chameleon که از طریق Zombinder توزیع شدن، پرداختن. نمونه های جدید، نسخه ی بهبود یافته و بازسازی شده نسخه های قدیمی هستش و در اجرای Device Takeover (DTO) با استفاده از Accessibility Service خیلی بهتر عمل میکنن و همچنین منطقه هدفشون رو هم گسترده کردن.
تروجان بانکی
:همونطور که بالا گفته شد، این بدافزار برای اولین بار در ژانویه 2023 ، و در مرحله اول توسعه خودش، کشف شد. استفاده از لاگرهای مختلف ، عملکرد مخرب محدود ، دستورات تعریف شده اما استفاده نشده، نشون دهنده یه بدافزار در حال توسعه بود.
بدافزار قابلیت جالبی برای دستکاری دستگاه قربانی ، اجرای کارها توسط قربانی از طریق ویژگی پروکسی داره. این ویژگی امکان انجام حملات پیشرفته ای مانند Account Takeover (ATO) و Device Takeover (DTO) رو بخصوص روی برنامه های بانکی و ارزهای دیجیتال فراهم میکنه. این عملکردها با سوء استفاده از Accessibility Service ، قابل انجام هستش.
نمونه های اخیر Chameleon از روش های مختلفی برای توزیع استفاده میکنن از جمله : استفاده از صفحات فیشینگ و وانمود کردن خودش بعنوان یه برنامه قانونی، استفاده از CDNها برای توزیع فایل .
عمدتا کاربران استرالیا و لهستان رو هدف قرار میداده و برای توزیع ، مثلا خودش رو بعنوان برنامه مالیات استرالیا (ATO) یا برنامه های بانکی لهستانی و صرافی CoinSpot ، جا میزده.
این استراتژی هدفمند نگرانی های اساسی رو برای بانک ها و سایر موسسات مالی در این مناطق ایجاد میکنه. مهارت تروجان در جعل هویت برنامه های قابل اعتماد، پتانسیلش رو برای تأثیر گسترده، افزایش میده و اهمیت تهدیدش رو برای چشم انداز امنیت تلفن همراه نشون میده.
نسخه ی پیشرفته بدافزار Chameleon :
همونطور که از آنالیزهای قبلی مشخص بود، برنامه در حال توسعه بود و بنابراین یه نمونه جدیدی از اون ، با یسری اصلاح و ویژگی های جدید توزیع شده. نسخه ی جدید، کاربران بریتانیا و ایتالیا رو هم هدف قرار میده.
نسخه ی جدید همچنان از Device Takeover (DTO) توسط Accessibility Service سوء استفاده میکنه. همونطور که گفته شد، توسط Zombinder توزیع شده و در قالب برنامه های Google Chrome ارائه شده.
نسخه های جدید ، دو ویژگی خیلی مهم دارن:
- امکان دور زدن احرازهویت بیومتریک
- امکان نمایش یه صفحه ی HTML برای فعال کردن Accessibility Service ، در دستگاههایی که ویژگی Restricted Settings در اندروید 13 رو فعال کردن.
فعال کردن Accessibility Service در اندروید 13 از طریق HTML :
ویژگی Restricted Settings ، یه ویژگی امنیتی هستش که در اندروید 13 معرفی شد و جلوی تایید مجوزهای خطرناکی مانند Accessibility رو مسدود میکنه. توسعه دهندگان بدافزار از سرویس Accessibility ، برای سرقت محتوای اسکرین، اعطای مجوزهای بیشتر و … استفاده میکنن.
این ویژگی توسط دستور android_13 از C2 در بدافزار فعال میشه. بدافزار ، دستگاه رو بررسی میکنه و اگه اندروید 13 و بالاتر باشه و ویژگی Restricted Settings روش فعال باشه، یه صفحه ی HTML رو نمایش میده و از کاربر میخواد Accessibility service رو فعال کنه. این مرحله برای خانواده بدافزار Chameleon ، خیلی مهمه ، چون این سرویس برای انجام حملات Device Takeover (DTO) ضروریه.
کد زیر نحوه ی بررسی دستگاه برای Restricted Settings رو نشون میده :
1 2 3 |
if (!class.devicebuild() && (class2.commandlist("android_13", Boolean.valueOf(true)) && Build.VERSION.SDK_INT >= 33 && !class2.commandlist("restrict_opened", Boolean.FALSE)) { this.startActivity(new Intent(this, class0).putExtra("action", "restriction")); } |
اگه بدافزار تایید کنه که دستگاه یه اندروید 13 با قابلیت Restricted Settings فعاله، یه صفحه ی HTML رو لوود میکنه و مرحله به مرحله ،نحوه ی فعال کردن Accessibility Service در اندروید 13 و بالاتر رو توضیح میده. شکل زیر تعامل بدافزار با یه دستگاه اندروید 13 رو نشون میده.
این قابلیت جدید، نشون میده که بازیگر تهدید چطوری میتونه تدابیر امنیتی که برای مسدود کردن اونا توسعه داده شده رو، به سادگی دور بزنه.
دور زدن احرازهویت بیومتریک :
این ویژگی توسط دستور interrupt_biometric فعال میشه. بدافزار با گرفتن این دستور، متد InterruptBiometric رو اجرا میکنه. این متد از KeyguardManager API و AccessibilityEvent ، برای دسترسی به وضعیت اسکرین و صفحه کلید استفاده میکنه. وضعیت قفل صفحه کلید رو در خصوص مکانیسم های مختلفی امنیتی مانند : پسورد ، PIN و Pattern بررسی میکنه. بعد از این بررسی ، بدافزار از طریق AccessibilityEvent ، احرازهویت رو از بیومتریک به PIN تغییر میده. با این کار بدافزار میتونه احرازهویت بیومتریک رو دور بزنه و قفل دستگاه رو باز کنه.
اینکه بازیگر تهدید ، احرازهویت رو از بیومتریک به یه احرازهویت استاندارد تبدیل میکنه، دو مزیت براشون داره :
- اولا اینکه امکان سرقت PIN ، پسوردها و کلیدهای گرافیکی رو از طریق کیلاگرها ، راحت تر میکنه.
- دوم اینکه امکان باز کردن قفل دستگاهها از طریق PINها و پسوردهای قبلی رو براشون فراهم میکنه. این کار هم از طریق Accessibility فراهم میشه.
در حقیقت بدافزار، PINها و پسوردها رو بی سر و صدا ضبط و در ادامه از اونا برای باز کردن قفل دستگاه استفاده میکنه.
این روش ،اگرچه داده های بیومتریک رو برای بازیگران تهدید همچنان غیرقابل دسترس میکنه، اما امکان دور زدن محافظ های بیومتریک رو فراهم میکنه.
کد زیر ، نحوه ی ارزیابی وضعیت
، توسط بدافزار رو نشون میده :
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public final void interruptBiometric(AccessibilityEvent accessibilityEvent0) { if (accessibilityEvent0.getPackageName() != null) { if (bCBFNOgmB2372b7065b5f58f8f9f.screenstatus != 1 && (KeyguardManager != null && (KeyguardManager.isKeyguardSecure()))) { if (getInstance.findViewByContainsID(getInstance.getRootInActiveWindow(), "lockPatternView") != null) { return; } if (getInstance.findViewByContainsID(getInstance.getRootInActiveWindow(), "pinEntry") != null) { return; } if (getInstance.findViewByContainsID(getInstance.getRootInActiveWindow(), "passwordEntry") != null) { return; } } |
ویژگی مدیریت زمان و کنترل فعالیت:
یه ویژگی جدید دیگه ای که به نسخه ی جدید بدافزار Chameleon اضافه شده، و البته در خیلی از تروجانهای بانکی هم استفاده میشه، زمانبندی Taskها از طریق AlarmManager API هستش. این ویژگی در نسخه های قبلی این بدافزار نبود.
اما چیزی که زمانبندی Task ها رو در این بدافزار متمایز میکنه، رویکرد داینامیک، مدیریت کارآمد Accessibility و اجرای Activity در راستای رفتار تروجان هستش.
نسخه ی جدید ، از دستور جدید ، inejction_type ، پشتیبانی میکنه. بسته به اینکه قابلیت Accessibility غیرفعاله یا نه ، بطور خودکار از “a11y” (a11y مخفف accessibility هستش) به “usagestats” تغییر میکنه. اگه فعال باشه، بدافزار از طریق “Injection” حملات overlay رو انجام میده. حملات Overlay حملاتی هستن که روی برنامه های موبایل انجام میشه و در اون ، بدافزار یه پنجره ای روی یه برنامه ی قانونی باز میکنه که قابل تشخیص برای کاربر نیست و وقتی کاربر اعتبارنامه یا اطلاعات بانکی و … وارد میکنه، بدافزار میتونه به این اطلاعات دسترسی داشته باشه و اونارو به سرقت ببره.
اگه سرویس Accessibility غیرفعال باشه، از a11y به usagestats تغییر میکنه و اطلاعاتی از app usage data کاربر ، در دستگاههای دارای اندروید 13 و بالاتر جمع آوری میکنه تا بهترین زمان injection رو انتخاب کنه. این داده ها شامل foreground app ، یه متد جایگزین برای تعیین foreground app و تصمیم گیری برای شروع overlay یا injection .
1 2 3 4 5 6 7 8 9 10 |
public final void run() { ((AlarmManager) class.this.getApplicationContext().getSystemService("alarm")).set(0, System.currentTimeMillis() + 60000 L, PendingIntent.getBroadcast(class.this.getApplicationContext(), 5333, new Intent(class.this.getApplicationContext(), class2.class), 0xC000000)); if (!class.accessibility_enabled(class2.class) || (class.list("inejction_type", "a11y").equals("usagestats"))) { if (class.usage_stats()) { String s = class.this.currentActivity(); if ((class.commandlist("injection", Boolean.TRUE)) && (class.config(s)) && !false) { new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public final void run() { ActivityThread.startActivity(new Intent(ActivityThread, class2.class).putExtra("app", this.val$lastPackage).addFlags(0x10000000).addFlags(0x8000)); } |
IoCهای گزارش :
- HASH (SHA256): 2211c48a4ace970e0a9b3da75ac246bd9abaaaf4f0806ec32401589856ea2434
- APP NAME : Chrome
- PACKAGE NAME: Z72645c414ce232f45.Z35aad4dde2ff09b48
- HASH (SHA256): 0a6ffd4163cd96d7d262be5ae7fa5cfc3affbea822d122c0803379d78431e5f6
- APP NAME : Chrome
- PACKAGE NAME: com.busy.lady