Trustlook's Integration with OKC (OKX Chain)
San Jose, California, Oct. 19, 2022, Trustlook, the global leader ...
4月初,Trustlook安全研究人员在使用App Insight对国内某商店进行常规审核时,截获了一个名为“换机精灵”的样本,该应用作为一款换机工具,实则为恶意刷量木马,截止我们发现样本的当日,该应用在国内各大软件市场拥有高达上亿次下载,以下为样本的存档信息:
该恶意软件具备极高的威胁:
各大应用商店全军覆没
自从Trustlook安全人员截获该应用后,我们随即调查了10多家应用商店,包括各大厂家应用商店、第三方专业应用商店以及一些下载网站,涵盖主流手机厂家应用商店、360手机助手、百度手机助手、腾讯应用宝、豌豆荚、应用汇、PP助手、安智、安卓网、太平洋下载等,发现该应用都长期存在各家应用商店中,无一幸免。下载量从几十万、上百万、几百万甚至上亿都有。除了该应用做恶隐蔽性较强外,与应用商店在审核与发布环节上安全机制不健全和人为疏漏也有很大关系。
换机精灵分析报告
该应用包含了4个静态库以及其作用分别为:
Libiohook.so
Virtual App核心库,包含SubstrateHook框架,该库暴露了大量接口给jni层用于运行时hook。
libHuanJi.so
SSDP协议库,用于wlan局域网查找发现设备
Libjpush174.so
极光推送
libTmsdk-2.0.6-mfr.so
腾讯御安全sdk
关于Virtual App沙盘的分析我们稍后再提,此外该应用在Android Manifest中不正常的申请了大量的权限:
包括联系人、读写收发短息、通话记录、拍照、录音、位置、账号、日历、储存、安装列表等。
尽管换机类应用需要大量的系统权限,但有些权限的申请实属勉强,并存在一定的安全威胁,实际上这些权限的目的是为了保障沙盘中的恶意应用能够顺利运行。
android.permission.READ_CALENDAR
android.permission.READ_SOCIAL_STREAM
android.permission.INTERNET
com.android.browser.permission.WRITE_HISTORY_BOOKMARKS
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.WRITE_CONTACTS
android.permission.CHANGE_WIMAX_STATE
com.android.browser.permission.READ_HISTORY_BOOKMARKS
android.permission.SYSTEM_ALERT_WINDOW
android.permission.CHANGE_WIFI_STATE
android.permission.READ_CONTACTS
android.permission.READ_PROFILE
android.permission.WRITE_CALENDAR
android.permission.BLUETOOTH
android.permission.CAMERA
android.permission.ACCESS_MOCK_LOCATION
android.permission.RECEIVE_SMS
android.permission.NFC
android.permission.RECORD_AUDIO
android.permission.SEND_SMS
android.permission.BATTERY_STATS
android.permission.USE_SIP
android.permission.PROCESS_OUTGOING_CALLS
android.permission.WRITE_CALL_LOG
android.permission.WRITE_SMS
android.permission.GET_TASKS
android.permission.WRITE_PROFILE
android.permission.CALL_PHONE
android.permission.READ_PHONE_STATE
com.android.voicemail.permission.ADD_VOICEMAIL
android.permission.SUBSCRIBED_FEEDS_WRITE
android.permission.RECEIVE_MMS
android.permission.DISABLE_KEYGUARD
android.permission.READ_USER_DICTIONARY
android.permission.ACCESS_COARSE_LOCATION
android.permission.BLUETOOTH_ADMIN
android.permission.ACCESS_FINE_LOCATION
android.permission.USE_CREDENTIALS
android.permission.RECEIVE_WAP_PUSH
android.permission.READ_CALL_LOG
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.MANAGE_ACCOUNTS
android.permission.WRITE_SOCIAL_STREAM
android.permission.AUTHENTICATE_ACCOUNTS
android.permission.READ_SMS
android.permission.CLEAR_APP_CACHE
android.permission.CHANGE_CONFIGURATION
android.permission.READ_LOGS
android.permission.INTERACT_ACROSS_USERS
android.permission.DEVICE_POWER
android.permission.BIND_DIRECTORY_SEARCH
android.permission.ACCESS_CACHE_FILESYSTEM
android.permission.ACCOUNT_MANAGER
android.permission.BIND_APPWIDGET
android.permission.INTERACT_ACROSS_USERS_FULL
android.permission.WRITE_APN_SETTINGS
android.permission.CLEAR_APP_USER_DATA
android.permission.DELETE_PACKAGES
android.permission.WRITE_MEDIA_STORAGE
android.permission.INSTALL_PACKAGES
android.permission.PACKAGE_USAGE_STATS
android.permission.MOUNT_UNMOUNT_FILESYSTEMS
android.permission.READ_MMS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher3.permission.UNINSTALL_SHORTCUT
android.permission.WRITE_SYNC_SETTINGS
android.permission.BROADCAST_STICKY
android.permission.READ_OWNER_DATA
com.android.launcher3.permission.INSTALL_SHORTCUT
com.android.voicemail.permission.READ_WRITE_ALL_VOICEMAIL
com.android.mylauncher.permission.WRITE_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.SET_WALLPAPER_HINTS
android.permission.UPDATE_APP_OPS_STATS
com.android.launcher3.permission.READ_SETTINGS
android.permission.ACCESS_NETWORK_STATE
com.android.launcher2.permission.WRITE_SETTINGS
android.permission.WRITE_USER_DICTIONARY
com.android.vending.CHECK_LICENSE
android.permission.WRITE_SETTINGS
android.permission.ACCESS_WIMAX_STATE
com.android.vending.BILLING
android.permission.RECEIVE_USER_PRESENT
android.permission.WRITE_OWNER_DATA
android.permission.DOWNLOAD_WITHOUT_NOTIFICATION
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.VIBRATE
com.android.launcher2.permission.READ_SETTINGS
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.ACCESS_WIFI_STATE
android.permission.WAKE_LOCK
android.permission.ACCESS_DOWNLOAD_MANAGER
com.android.launcher3.permission.WRITE_SETTINGS
android.permission.RESTART_PACKAGES
android.permission.GET_ACCOUNTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.CHANGE_NETWORK_STATE
android.permission.READ_SYNC_SETTINGS
com.android.launcher.permission.UNINSTALL_SHORTCUT
com.android.launcher.permission.WRITE_SETTINGS
android.permission.READ_EXTERNAL_STORAGE
android.permission.FLASHLIGHT
android.permission.EXPAND_STATUS_BAR
android.permission.PERSISTENT_ACTIVITY
android.permission.REORDER_TASKS
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.SET_WALLPAPER
android.permission.GET_PACKAGE_SIZE
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.SET_TIME_ZONE
com.android.launcher.permission.READ_SETTINGS
com.android.launcher2.permission.INSTALL_SHORTCUT
com.android.mylauncher.permission.READ_SETTINGS
该应用运行时,用户并不会察觉到应用有明显的恶意行为,但通过流量监控我们会发现几个比较有意思的网络行为:
http://ky.5rob.com/active/security/
通过该链接,会从服务器获取主流杀毒软件的列表:
{
"success": true,
"ver_code": "1",
"list": [
"com.tencent.qqpimsecure",
"cn.opda.a.phonoalbumshoushou",
"com.lenovo.safecenter",
"com.lbe.security",
"com.qihoo360.mobilesafe",
"com.anguanjia.safe",
"kvpioneer.cmcc",
"com.ijinshan.mguard",
"com.ijinshan.duba",
"com.kms.free",
"com.anyisheng.doctoran",
"com.drweb.pro.market",
"project.rising",
"com.symantec.mobilesecurity.base",
"com.nqmobile.antivirus20",
"org.antivirus"
],
"err_code": 0
}
我们通过分析代码逻辑,在com.hj.comm.g中发现了以下代码:
而接下来的2个请求更加格外的重要:
这些请求返回了预安装app列表:
{
"success": true,
"err_code": 0,
"list": [
{
"state": 3,
"pkg_name": "com.cx.photo2",
"app_name": "照片银行测试2",
"icon_url": "http://cache.goyihu.com/aa/3a7cf245-f897-47fd-b7c2-a36a6efce2a2.png",
"apk_org": "6zPze%2Bs9OFDLr5d/HYR7yIHQBjh18n9j%2B1GU2xmtbzM2EMv1oQkPoMZmdF6mviXR",
"apk_url": "http://cache.goyihu.com/aa/3a7cf245-f897-47fd-b7c2-a36a6efce2a2.apk",
"apk_ver_code": 58,
"apk_ver_name": "3.2.5",
"open_counts": 1,
"index_num": 1,
"apk_size": 1032035,
"is_default": false,
"type": 2,
"intro": "信息流插件",
"cate_name": "装机必备",
"pkg_chan_code": "",
"security_check": true,
"app_plan_id": 13324,
"apk_filter_window": 0,
"apk_filter_install": 0,
"apk_filter_notify": 0
},
{
"state": 3,
"pkg_name": "com.cx.photo6",
"app_name": "照片银行测试6",
"icon_url": "http://cache.goyihu.com/aa/32fe7044-1af1-454e-bfa1-a9b4395b1564.png",
"apk_org": "v9WxN9BQe3CQQM4s/r8ZrR5cjwO1VdLJ6Sa92CMdGcw2EMv1oQkPoMZmdF6mviXR",
"apk_url": "http://cache.goyihu.com/aa/32fe7044-1af1-454e-bfa1-a9b4395b1564.apk",
"apk_ver_code": 58,
"apk_ver_name": "3.2.5",
"open_counts": 1,
"index_num": 1,
"apk_size": 1031991,
"is_default": false,
"type": 2,
"intro": "换机东方(黄)",
"cate_name": "装机必备",
"pkg_chan_code": "",
"security_check": true,
"app_plan_id": 13330,
"apk_filter_window": 0,
"apk_filter_install": 0,
"apk_filter_notify": 0
},
{
"state": 3,
"pkg_name": "com.pgy.sdkapp_tyjh",
"app_name": "CXPGY08",
"icon_url": "http://cache.goyihu.com/aa/14b972dc-4a4a-4204-bf97-2df232f100ab.png",
"apk_org": "aHtqvD%2BBfsseufKJzMQvH5L/HdSDvDl4c3nXkpnGeHQ=",
"apk_url": "http://cache.goyihu.com/aa/14b972dc-4a4a-4204-bf97-2df232f100ab.apk",
"apk_ver_code": 1,
"apk_ver_name": "1.0",
"open_counts": 1,
"index_num": 1,
"apk_size": 289929,
"is_default": false,
"type": 2,
"intro": "",
"cate_name": "装机必备",
"pkg_chan_code": "",
"security_check": true,
"app_plan_id": 13336,
"apk_filter_window": 0,
"apk_filter_install": 0,
"apk_filter_notify": 0
}
],
"uninstall_pkgs": []
}
通过返回数据,我们截获了这些应用:
但是这些安装包被下载之后,并没有调用安卓系统自带的包安装管理器询问用户是否进行安装,那么这些应用是怎么被安装的呢?
我们跟踪代码逻辑最终来到了这个地方:
经过逆向工具对函数签名的还原,我们鉴别出了该应用使用了APP插件化框架——VirtualApp,也正是libhuanji.so所对应的java层代码,通过InstallPackage函数,上述的恶意软件将被静默安装到应用沙盘中并执行,而这一切用户却浑然不知。
沙盘中安装应用的上一层:
我们可以发现它根据服务器返回的参数security_check的配置,预先检测了列表中的杀毒软件是否被安装,如果发现了杀毒软件便不会安装恶意插件,这极大的提高了自身的存活率。
这些恶意应用在沙盘中运行了以后,开始频繁的进行网络请求,以下为部分请求:
流量的内容为这些广告运营商的统计接口,显然易见,通过控制用户的手机进行恶意刷量来进行不法牟利是他们的目的,宿主“换机精灵”会进行后台常驻,开启自启,保持用户的受控状态。
同时,我们发现了其未经许可收集用户隐私的行为:
接口:http://au.goyihu.com/sdkactivate/
通过分析代码,解密被提交数据:
加密算法:DES/ECB/PKCS5Padding 密钥:12345678 编码:UTF8
1554997435;com.cx.huanji;110;HUAWEI;19;5055**********68;50:55:**:****:99;35********38008;cbc5********e633;1; {
"CALLLOGNUM": 0,
"HARDWARE": "hammerhead",
"RADIO": "unknown",
"NT": "0",
"HOST": "*****************",
"TAGS": "test-keys",
"SW": 1080,
"ID": "KTU84P",
"ROOT": "true",
"MANUFACTURER": "LGE",
"TYPE": "userdebug",
"SMSNUM": 0,
"SDNUM": 1,
"TIME": "1532975348000",
"IMAGENUM": 10,
"FINGERPRINT": "unknown",
"SH": 1776,
"SDDATASIZE": 963846144,
"UNKNOWN": "unknown",
"BOARD": "hammerhead",
"versionName": "3.5.0",
"PRODUCT": "aosp_hammerhead",
"DPI": 480,
"DISPLAY": "aosp_hammerhead-userdebug 4.4.4 KTU84P eng.*****.20180731.022454 test-keys",
"MEM": 1855.02734375,
"USER": "*****",
"DEVICE": "hammerhead",
"MODEL": "AOSP on HammerHead",
"BOOTLOADER": "HHZ20h",
"CONTACTNUM": 0,
"CPU_ABI": "armeabi-v7a",
"SDSIZE": 28734615552,
"CPU_ABI2": "armeabi",
"IS_DEBUGGABLE": "true",
"SERIAL": "0*****************5",
"BRAND": "Android"
}
此外,我们在代码中发现了更多隐藏的恶意代码:
如果服务器下发了模拟操作的脚本,在com.hj.scripter.execute.a中,会模拟操作沙盘中的应用:
并且,在特定的条件下,使用一些功能,App将不经用户同意,私自下载第三方APP并安装在沙盘中,在用户的桌面上创建快捷方式。
其实,这已经不是换机精灵第一次被人发现有恶意行为,传信官网曾于2018年4月就已经发布过声明:
该声明声称打包的sdk并非自己编写,未来将严格管控这些问题,但事实上真的如其所说吗?为何相似的恶意行为不到一年又卷土重来?
我们接下来对“换机精灵“预安装app列表中下载的三款恶意插件进行分析,找出“第三方sdk”的幕后黑手。
通过分析发现,com.cx.photo2与com.cx.photo6基本为同一APP,代码相似度极高,在MainReceiver中,此APP启动时便会检查安全软件,如果用户未安装相关的安全软件,便开始周期执行恶意功能并启动InvisibleService2服务。
在InvisibleService2 onCreate中,一个不可见的透明窗口被创建,覆盖在所有应用的最上层,系统任务栏的下层,并创建了一个webview用于加载网页。
这样不寻常的创建方式并不会被用户察觉,在用户使用app时,所有的屏幕触摸,滑动事件会同时响应到隐藏的webview上,模拟成用户对webview网页中的操作,这样的目的是,通过真实的用户网页浏览行为,欺骗广告运营商的流量统计反作弊算法,来变相进行刷量的目的。
除这两款恶意应用以外,还有一款sdk包名为com.pgy.sdkapp_tyjh的恶意应用,该sdk有明显的恶意行为,通过对网络流量的观察,我们发现该sdk在很短的时间内进行了千余次的网络请求,此sdk在沙盘中启动时,会先访问CNZZ的数据统计:http://z5.cnzz.com/stat.htm?id=1276358758&cnzz_eid=设备id,推测此请求是用来统计感染的设备数量,之后便发送设备数据到http://a.bjsdknet.com/index.php?r=api/activite来注册受害设备,从服务端返回的数据来看:
{
"status": 0,
"msg": "OK",
"data": {
"id": "342",
"app_name": "092_d157_W_C",
"publisher_id": "342",
"show_times": "5",
"time_step": "5",
"position": "1",
"is_ad": "1",
"open_type": "1",
"is_video": "1",
"is_imgshow": "0",
"sub1": "1",
"sub2": "0&&24",
"sub3": "0",
"is_deleted": "0",
"province": " ",
"type": "2",
"showcount": "3",
"freecount": "1",
"usercount": "0",
"ispush": "0",
"is_free": "0",
"status": "1",
"loadtime": "30",
"package": "com.ss.android.article.news,com.ss.android.ugc.aweme,com.ss.android.article.lite,com.ss.android.article.video,com.ss.android.ugc.live,com.Qunar,com.taobao.taobao,com.tencent.news,com.ss.android.auto,com.sina.weibo,com.youku.phone,com.baidu.searchbox,com.UCMobile,ctrip.android.view,com.sohu.sohuvideo,com.achievo.vipshop,com.qiyi.video,com.cubic.autohome,com.songheng.eastnews,com.netease.newsreader.activity,com.ifeng.news2,com.mfw.roadbook,com.wuba.zhuanzhuan,com.jingdong.app.mall,com.suning.mobile.ebuy,com.tencent.qqlive,com.sohu.newsclient,com.baidu.searchbox.lite,com.baidu.tieba,com.autonavi.minimap,com.eg.android.AlipayGphone,com.jifen.qukan,com.baidu.haokan,com.shuqi.controller,com.xunmeng.pinduoduo,com.dianping.v1,com.dangdang.buy2,com.pplive.androidphone,com.ss.android.caijing.stock,com.xueqiu.android,com.meilapp.meila,com.taobao.mobile.dipei,com.gf.client,com.eastmoney.android.berlin,com.android.dazhihui,com.hexin.plat.android,com.baidu.BaiduMap,com.babytree.apps.pregnancy,com.baidu.mbaby,com.lingan.seeyou,com.wangzhi.MaMaHelp,com.tencent.map,com.mogujie,com.lanjingren.ivwen,com.tencent.karaoke,com.meelive.ingkee,tv.yixia.bobo,com.tencent.reading,com.qiyi.video.reader,com.sogou.activity.src,com.gome.eshopnew,com.hipu.yidian,sogou.mobile.explorer,cn.com.sina.finance,com.smile.gifmaker,com.jzyd.coupon,com.tencent.weishi,com.qq.ac.android,com.UCMobile.intl,com.tuan800.tao800,com.suning.mobile.ebuy,air.tv.douyu.android",
"loadgrap": "5",
"sub4": "1",
"sub5": "1",
"sub6": "com.eg.android.AlipayGphone,com.xunmeng.pinduoduo",
"current": "10&&0##24&&http://www.baidu.com&&21&&11&&40&&3&&30&&85&&0&&0",
"is_creen": "0",
"creen_time": "1",
"creen_number": "1",
"push_see": "1",
"push_second": "1"
}
}
该数据包含了要执行的刷量任务,而之后的请求http://d.bjsdknet.com/index.php?r=api/dynamic获取了更多的刷量插件:
{
"status": 0,
"msg": "OK",
"data": [
{
"id": "66",
"name": "cjmob20190301",
"md5_data": "1",
"jar_url": "http://down.dd799aa.com//upload/sdk3/cjmob20190301.jar",
"description": "cnzz:d152",
"method_data": "startInit",
"version": "2",
"package": "com.fsd.one.Init",
"gap": "30",
"paramstype": "Context",
"adtime": "1551424538"
},
{
"id": "60",
"name": "SDK31dex20190220",
"md5_data": "1",
"jar_url": "http://down.dd799aa.com//upload/sdk2/SDK31dex20190220.jar",
"description": "cnzz:d127",
"method_data": "startInit",
"version": "1",
"package": "lsdtw.teysh.j.Init",
"gap": "30",
"paramstype": "Context",
"adtime": "1550634371"
},
{
"id": "39",
"name": "mfgz",
"md5_data": "1",
"jar_url": "http://down.dd799aa.com/upload/plog/mfgz.jar",
"description": "231-d3-11.19首次提交,11.28修改没写死问题,1204更改包名报读等问题",
"method_data": "aj",
"version": "3",
"package": "vby.obzg.hmwq.Favb",
"gap": "30",
"paramstype": "Context",
"adtime": "1542598400"
},
{
"id": "56",
"name": "sdk04dex20190218",
"md5_data": "1",
"jar_url": "http://down.dd799aa.com//upload/sdk2/sdk04dex20190218.jar",
"description": "cnzz:d98",
"method_data": "startInit",
"version": "1",
"package": "com.aapi.main.Init",
"gap": "30",
"paramstype": "Context",
"adtime": "1550480559"
},
{
"id": "52",
"name": "N38de20181225",
"md5_data": "1",
"jar_url": "http://down.dd799aa.com/upload/plog/N38de20181225.jar",
"description": "cnzz:d54",
"method_data": "startInit",
"version": "1",
"package": "net.boc.ocpci.Init",
"gap": "30",
"paramstype": "Context",
"adtime": "1548485413"
}
]
}
这些插件将被下载并运行,每轮任务执行完成后又会去请求新的刷量sdk来下载执行,我们对截获的样本进行了一次分析,发现如下类型:
刷流量统计接口
通过对网络流量的监控,发现多家广告sdk的接口被访问,在用户设备上采集接口所需的端上数据并发送:
刷视频播放量
此类样本通过创建难以被察觉的1像素webview窗口来播放视频,通过js进行交互,并针对了具体的视频网站:
else if((!arg3.contains("sohu.com") || !arg4.contains("sohu.com")) && (!arg3.contains("iqiyi.com") || !arg4.contains("iqiyi.com")) && (!arg3.contains("youku.com") || !arg4.contains("youku.com")) && (!arg3.contains("365yg") || !arg4.contains("365yg")) && (!arg3.contains("pptv") || !arg4.contains("pptv")))
视频播放一段时间后,通过js判断是否播放成功,来决定后续的任务执行逻辑:
javascript: (function () {
var video = document.getElementsByTagName('video')[0];
var now_time = video.currentTime;
if (now_time > 0) {
window.java_obj.save('ok');
} else {
window.java_obj.save('no');
}
})();
电商产品刷量
周期性将淘口令等内容写入到用户的剪切板中,这样当用户打开淘宝等电商应用后,会自动跳转到对应的推广页面来完成刷量的目的:
搜索引擎关键词优化
通过对要优化的产品的关键词与形容关键词("免费", "排名", "正品", "正版", "价格", "效果", "周期", "品质", "好不好", "好吗", "怎么样", "北京", "深圳", "上海", "广州", "中国", "活动", "促销", "优惠", "打折", "厉不厉害", "2017", "最新", "最好", "最大", "2018", "最全", "2017排名", "全部", "最火"等)组合,进行搜索查询,来欺骗搜索引擎算法并提高搜索结果的排序优先级。
下载计量
CPD(Cost per Download),通过产品曝光来按下载量计费,此样本通过伪造CPD推广量来达到不法牟利的目的:
传信科技
由传信开发的“换机精灵“及沙盘内的”照片银行“APP的签名均为hangzhou chuanxin wangluo ltd.,且包名为com.cx开头,拼音完全相符,表明由传信所开发,而用于下载恶意应用的域名“http://www.goyihu.com/”,通过对域名所有人信息的查询,发现杭州冒泡科技有限公司是掩人耳目的马甲公司,对其注册信息的反查,最终也指向了杭州传信科技有限公司:
通过搜索引擎的搜寻,我们发现早在几年前传信科技就已经因投放恶意软件而多次被曝光过:
https://www.anquanke.com/post/id/106225
https://m.qq.com/security_lab/news_detail_435.html (截图中的sdk为传信开发)
https://www.anva.org.cn/alliance/detail?id=1445&typeFlag=202 (goyihu.com被下架9款app)
pgy sdk
而另外一款被下载到沙盘中,名为pgy sdk就显得更加专业了,我们没能找到其与传信科技的联系,但通过对代码的分析,发现大部分由pgy所下载的jar恶意插件包,均包含一个用于统计感染量的链接,网页最终指向cnzz统计:
通过自增id的方式,在dandelionmob.com域名上,我们最终从其网站上找出200余个用于统计感染量的网址,这意味着恶意sdk插件包可能拥有上百个,该sdk不仅可以藏身于Virtual App沙盘中,一些正常应用中也包含该sdk的身影,而为了避免被查杀,开发者展现了自己娴熟的免杀技巧,逃避杀毒软件的扫描,字符串是静态扫描的重要特征之一,对字符串的处理方式在样本中也多种多样:
字符串拆分
字符串被拆分成几段进行拼接来避免被作为静态特征扫描。
字符串混淆
通过成熟的混淆工具,如DexGuard等,将原本的字符串隐藏起来,在运行时主动重组还原为原始的字符串。
字符串编码
通过将字符串转换为base64编码或字节数组的形式,在运行时重编码。
字符串加密
通过自写算法或常见对称算法对字符串进行加密,并在运行时还原为原本的字符串。
随机包名
为了避免被使用固定的包名查杀,同样的代码在几份sdk中使用了不同且无规律的包名。
动态加载
通过从远程服务器获取并下载新的sdk,或将恶意可执行dex文件加密的方式,动态加载恶意代码,使得扫描的难度增加。
该样本将dex加密为图片文件,解密并执行。
流量的泡沫
通过一系列的分析,对网络流量的监控,我们还捕获到了部分广告联盟的接口:
从下发的配置项来看,一些广告联盟或渠道,自身参与了流量作弊,而广告主投入了资金,却没有得到对应的效果,成为了直接受害者。
今年4月份,T ru s t lo ok团队向该应用商店通告了换机精灵的恶意行为,传信科技在刷量行为败露后,发布了新版的换机精灵应用,清除了相关代码并关闭了服务器接口。他们对原有的恶意代码进行删减后,开发了一款新的基于VirtualApp多开工具—小隐大师,同时使用了360加固安全服务,尽管目前为止,我们暂未发现其有明确的恶意行为,但该应用保留了之前“换机精灵”的大部分代码,为了掩人耳目,具备极高的安全风险。而且考虑到传信科技之前的行为,他们极有可能在风头过后又卷土重来。
在新版应用第一次启动时,它会主动去下载微信软件,并自动安装在沙盘中,且通信过程未使用安全连接,排除服务端主动下发应用列表的情况,如果被第三方加以利用,可篡改为任意应用并自动安装,从而成为一个后门,其解析预安装列表的逻辑如下:
VirtualApp作为一款应用沙盘框架,本身没有恶意代码,对于运行在沙盘中的应用,VirtualApp模拟成了Android系统的Framework层,提供了一个APP运行时所需要的环境,因此使用了沙盘技术的应用无法避免要申请大量的系统权限,同时也具备了Hook沙盘中的应用的能力,多被用于应用多开、正规应用修改/插件版、马甲包等,因此可以修改原应用的正常执行流程,盗取包括且不限于用户的账号密码及各类隐私等。
Java语言作为一门准动态语言,具备完善的代码反射机制, Android平台得益于这项技术,可以在线通过热更新的方式修改现有的程序,在改善了用户体验的同时,也带来了大量的安全隐患,恶意软件作者和黑产开发者同样利用了这项技术威胁到了用户的安全,通过类加载器DexClassLoader可以在运行时加载并解释运行dex文件,达到隐藏恶意代码的目的。
本文通过逆向分析换机精灵样本,却无意中发现了一个庞大的黑产团队,在对相应的SDK使用统计的链接中,Trustlook团队发现了将近200个恶意插件,实际上这还只是其冰山一角,这些插件都编写的非常专业,而且其中运用了各种免杀手段,由此可见黑产对怎样使用多开工具已经有了很多年的积累。在上期的热更新一文中,我们公布了最热门的应用中热更新的使用比例,而在这些应用中使用了Virtual App等多开工具也并不罕见,因此应用商店很难完全禁止这些技术在App中的使用,这就给予了黑产极大的便利,而普通的代码审核也很难检测到动态设定的恶意行为。
单纯的静态审核或动态沙箱都很难有效的检测到这些恶意行为,准对这种状况,Trustlook团队独立研发移动样本深度分析审核平台App Insight。用户可上传Android APK文件,并在几分钟内收到详细的安全分析报告。 App Insight使用了真实设备沙箱系统,通过静态和动态结合的分析方法发现各类隐藏的恶意和敏感行为,帮助安全人员和应用商店高效的审核移动样本,确保移动端用户的隐私和数据安全。