20.1 Android安全机制

  • Android架构
    29.1.jpg
    • Linux Kernel(Linux内核层)
      • Android 的 Linux 核心为标准的 Linux 2.6-3.10内核,并加入移 动设备相关的驱动程序显示驱动、Flash 内存驱动、照相机驱动、音频驱动、WiFi 驱 动、键盘驱动、蓝牙驱动、Binder IPC 驱动、Power Management(能源管理)
    • Libaries(系统运行库层)
      • 运行库:以系统中间件的形式提供
      • Android 运行环境:Dalvik虚拟机
      • Dalvik虚拟机的区别:
        • 执行的不是 JAVA 标准的字节码 (bytecode )而是 Dalvik 可执行格式(.dex)中执行文件。 Java VM 是以基于栈的虚拟机,而 Dalvik 是基于寄存器的虚拟机。
        • JVM字节码中,局部变量会被放入局部变量表中,继而被压入堆栈供操作码进行运算。 Dalvik字节码中,局部变量会被赋给65536个可用的寄存器中的任何一个,Dalvik指令直接操作这些寄存器,而不是访问堆栈中的元素。
        • JVM字节码由.class文件组成,每个文件一个class。Dalvik程序只包含一个.dex文件,这个文件包含了程序中所有 的类。
    • Application Framework(应用框架层):为应用程序层的开发者提供API
      • 活动管理器( Activity Manager):用来管理应用程序生命周期并提供常用的导航回退功能。
      • 内容提供器(Content Providers):使得应用程序可以访问另一个应用程序的数据(如联系人数据库),或者共享它们自己的数据
      • 视图(View):可以用来构建应用程序,包括列表、网格、文本框、按钮、以及可嵌入的web浏览器等
      • 资源管理器(Resource Manager):提供非代码资源的访问,如本地字符串、 图形、布局文件等
      • 通知管理器 (Notification Manager):使得应用程序可以在状态栏中显示自定义的提示信息
    • Application(应用层)
      • 系统应用:主屏幕(Home),联系人(Contact), 电话(Phone),浏览器(Browsers)等
      • 其他应用:开发者使用应用程序框架层的 API 实现 的程序
  • Android组件模型
    • Activity(活动)
      • Activity 就是一个界面,一个应用程序由一个或者多个 Activity组成
    • Service(服务)
      • 运行在后台的没有可视化用户界面的功能模块
    • Broadcast Receiver(广播接收器)
      • 专注于接收广播通知信息,并做出对应处理的组件
      • 安卓系统的广播机制,只要注册就能接收到广播。
      1. 有序接收:前面丢弃后面就收不到了
      2. 无序接收:都能收到
    • Content Provider(内容提供器)
      • 应用程序间数据共享的一种标准接口,以类似于URI的方法将一些特定的应用程序数据供给其它应用程序使用
  • Android应用程序

    • 一个Android App包含在一个APK压缩文件夹中
      20.1.jpg
    • 权限
    1. Android默认应用是没有任何权限去操作其他应用或系统相关特性的,应用在进行某些操作时都需要显式地去申请相应的权限。
    2. APK包里面都包含有一个AndroidMainifest.xml 文件,会详细地罗列出该应用程序所需的系统访问权限。
      20.2.jpg
    3. 在应用安装的时候,package installer会检测该应用请求的权限,根据该应用的签名或者提示用户来分配相应的权限。
    • 权限级别
    1. normal:低风险权限,在安装的时候,系统会自动授予权限给app。
    2. dangerous:高风险权限,系统不会自动授予权限给 app,在用到的时候,会给用户提示。
    3. signature:签名权限,将权限授给具有相同数字签名的应用程序。
    4. signatureOrSystem:签名或系统权限,将权限授给具有相同数字签名的应用程序或系统类app,一般不推荐使用
    • 可用于设置自定义权限。如果开发者需要对自己的应用程序或服务 (尤其是对外部程序开放的)进行访问控制,则可以通过在 AndroidManifest.xml中添加标签,将其属性中的 protectionLevel设置为上述四类级别中的某一种来实现

20.2 Android安全现状

  • Android系统漏洞
    • 拒绝服务、权限绕过、代码执行、信息获取、权限提升等
  • Android软件漏洞
    • 代码执行、数据泄漏、组件暴露、校验漏洞
  • Android恶意程序
    • 资费消耗(流量、短信等)、诱骗欺诈、流氓行为(推送广告等) 、隐私获取、恶意扣费、远程控制、系统破坏、恶意传播
  • APK重打包
    • 重打包是指将正常的APK程序文件解压缩/反编译后进行修改,然后重新打包签名,攻击者常常利用重打包技术将恶意代码注入到正常 APK文件中
  • Android僵尸网络
    • SMS僵尸网络:短信僵尸网络,费钱
    • HTTP僵尸网络:流量
    • IRC僵尸网络:网络聊天协议
    • P2P僵尸网络:一台僵尸网络给另一台发,容易发现异常
    • 云推送僵尸网络:采用智能终端特有的推送服 务,长连接,隐蔽性高
  • Android恶意广告危害
    • 影响手机操作体验
    • 消耗流量
    • 窃取隐私
  • Android用户隐私泄漏

20.3 Android漏洞

  • 大量低级的Android恶意代码是容易察觉的
    • 使用了高危权限
    • 行为不隐蔽(推送广告)
  • 利用Android系统漏洞能够形成具有高隐蔽性的恶意代码
  • 短信伪造漏洞(SMS Phishing,Smishing)
    • 识别和拦截欺诈短信的最广泛方法使用的方法是检查发件人号码和短信内容
    • 常规的短信伪造方法
      • 向短信数据库(content://sms/inbox)插入一条记录
        • 需要声明android.permission.WRITE_SMS
        • 安装时系统会提示用户程序具有编辑短信的权限
        • 可能会被安全防护软件判定为危险程序
    • 举例:
      • Android smishing漏洞:允许不具有WRITE_SMS的程序进行短信伪造
        • 漏洞原理:出现该漏洞的原因是Android系统的com.android.mms.transaction.SmsReceiverService系统服务未判断启动服务的调用者,攻击者可以通过该应用发送伪装短信到用户收件箱。SmsReceiverService被导出的时候没有使用permission声明 (signature或signatureOrSystem或Dangerous),在代码中也没有 显式调用checkPermission,这违反了android开发规范,使得组件暴 露导致权限绕过(permission redelegation)
      • Permission redelegation
        • 很多第三方软件也存在大量permission redelegation漏洞,例如:小米MIUI错误报告程序( bugreport):可以被任意程序调用,并将结果保存至/sdcard/MIUI/debug_log/bugreport—.log文件中,该log文 件可以被任意第三方应用软件读取
        • 组件暴露导致越权行为执行
          • 友盟SDK Service组件暴露导致越权调用包含友盟SDK的APP的任意组件(360 Vulpecker团队),存在一个导出的UmengIntentService,且无权限控制
          • 友盟SDK Service组件暴露导致越权调用包含友盟SDK的APP的任意Service,接收intent携带的body数据,如果display_type为“pullapp”,可启动通过 pulled_package和pulled_service参数指定的任意service(包括未导出的service)
          • 友盟SDK Service组件暴露导致越权调用包含友盟SDK的APP的任意Activity,通过未导出的UmengDownloadResourceService进一步利用,可构造能够执行任 意Activity的通知
  • 活动劫持漏洞 Activity Hijacking
    • Android活动栈
      • Android运行时,会在很多活动(Activity)中进行切换。系统维护着一个Activity的历史栈,用于在用户点击后退时, 恢复前一个Activity,栈顶指向当前显示的Activity。最上层就是用户看到的界面。
        20.3.jpg
    • Android活动劫持
      • 启动一个后台服务(Service),不停枚举当前进程中是否有预设的进程启动
      • 如果发现有预设进程,则使用Intent开启钓鱼Activity,并使用 FLAG_ACTIVITY_NEW_TASK选项使得这个 Activity位于栈顶
      • 不需要任何权限
  • 通知滥用漏洞 Notification Abuse
    • 伪造通知,成本比使用漏洞更低
    • Android通知
    1. 通知标题(Title)
    2. 大图标
    3. 通知内容(Text)
    4. 其他信息(Info)
    5. 小图标
    6. 通知时间
    • 通知滥用
      • Android系统在显示通知消息的时候并不指明该通知是由哪个应用发出的
      • 用户通常通过通知消息中的图标和内容来想当然地判定通知消息的发起者
      • 恶意程序可以通过模仿正常应用的通知消息来误导用户,从而发起钓鱼等攻击
  • 输入法监听 Input Hack
    • Android输入法机制
    1. 所有的输入法应用都需要继承特定的service。Android平台的输入法框架为输入法应用定义了一个基类InputMethodService。
    2. 当用户触发输入法显示的时候(客户端控件获得焦点),InputMethodService启动,调用onCreate() 函数做一些初始化的设置;
    3. 调用onCreateInputView()函数,在该函数中创建KeyboardView;
    4. 调用onCreateCandidatesView()函数,在该函数中创建候选区;
    5. 调用onStartInputView()函数来开始输入内容,
    6. 输入结束后调用onFinishInput()函数来结束当前的输入,如果移动到下 一个输入框则重复调用onStartInputView和onFinishInput函数;
    7. 在输入法关闭的时候调用onDestroy()函数。
    • InputMethodService
      • getCurrentInputEditorInfo() 可以获得当前编辑框的一组对象属性EditorInfo,有如下的关键属性
        • EditorInfo.hintText:编辑框的默认值
        • EditorInfo.packageName:所属的apk的包名
      • getCurrentInputConnection()这个方法可以获得当前的编辑框的一个 InputConnection对象,而这个对象则有多个强大的方法可以调用
      • commitText(CharSequence text, int newCursorPosition),用来向编辑框写入值
    • 输入法监听
      • 可以自己实现一个输入法,在输入每一个字符的时候记录,最后在onFinishInput方法处把输入框的 值发送到特定服务器
      • 或者利用重打包的方法修改一个现有的输入法 (例如搜狗),在commitText和onFinishInput处插入恶意代码,将输入的内容通过自定义的监听类发送到特定服务器
  • 第三方软件漏洞
    • 外部数据存储导致数据泄漏
      • 小米MIUI备份程序用户数据泄漏
        • 在MIUI中,用户通过备份程序(Backup.apk)将个人数据、应用程序和应用数据保存在本地,以便升级或刷机以后恢复。该应用将备份内容以明文方式 保存在SD卡上。
      • 网易手机邮Android客户端帐户密码明文存储 /data/data/com.netease.rpmms/shared_prefs/config.xml明文
    • 传输问题导致数据泄露
      • 陌陌 登陆数据明文传输
    • 数据验证导致服务端注入
      • 金山词霸:手机客户端Feedback XSS漏洞注入管理员后台
    • 数据验证问题导致客户端注入
      • 利用恶意二维码攻击快拍:识别出来的二维码以html形式展示, 可以执行html和JS脚本,用以读取 本地文件和XSS跨站脚本攻击

20.4 Android恶意代码分析

  • 存在的地方
    • 第三方电子市场、论坛是恶意代码重灾区
    • 很多第三方ROM中也会内置的恶意代码以牟利
    • 通过手机刷机预装软件也是广告型恶意代码的主要传播手段之一
  • 常见Android恶意代码分类
    • 资费消耗(流量、短信等)
    • 推送广告
    • 窃取用户隐私
    • 诱骗欺诈
    • 恶意扣费
    • 远程控制
    • 系统破坏
    • 下载恶意程序
  • 典型恶意代码
    • Trojan/Android.FakePlayer.a:首个Android木马,后台发送扣费短信
    • Trojan/Android.Geinimi.a:广泛传播的Android远控木马
    • Trojan/Android.Zbot.a:跨平台僵尸网络Zbot的Android版本
    • Trojan/Android.Stiniter.a:首个利用elf文件在linux层安装的木马
    • Trojan/Android.smishing.a:利用短信伪造漏洞的Android木马
    • Trojan/Android.Oldboot.a:首个Android上的bootkit木马,通过刷机植入 - CoinKrypt家族木马:手机僵尸网络“挖矿”
    • simplelock家族:将移动设备加密锁屏后,对用户进行勒索;
    • shutdownhack家族木马:伪造关机,实际上在后台窃听;
  • Android Bot
    • 在用户不察觉的情况下接收和执行控制者发出的指令:
      20.4.jpg
    • Android bot种类 (按通信方式)
      • 传统Bot:HTTP Bot、TCP Bot(IRC BOT )
      • SMS Bot
      • 消息推送Bot
    • IRC BOT
      20.5.jpg
    • SMS BOT
      20.6.jpg
    • 消息推送BOT
      • 使用Android特有的消息推送服务,例如Google的GCM
        20.7.jpg
    • Bot特点比较
      • HTTP BOT
        • 需要定时连接C&C服务器检查新命令,会耗费大量的网络流量
        • 周期性连接可能会暴露C&C服务器
      • TCP BOT
        • 时刻保持在线,响应命令快
        • 长时间连接容易暴露C&C服务器
      • SMS BOT
        • 不需要与服务器保持连接,响应命令快
        • 发送短信会产生一定费用
        • 需要使用敏感权限:Receive_SMS, Send_SMS
      • 消息推送BOT
        • Bot和C&C Server之间的通信隐蔽在消息推送服务中,不容易被发现和检测
        • 耗费流量少,不需要单独的keep-alive机制,接收命令耗时短
        • 一旦被发现,容易被阻断
  • 使用消息推送的木马
    • Trojan-SMS.AndroidOS.FakeInst.a
    • Trojan-SMS.AndroidOS.OpFake.a
  • 恶意代码的传播:重打包
    20.8.jpg
  1. 编写恶意代码
    20.9.jpg
  2. 反编译原app, 修改其AndroidManifest.xml
  3. 反编译恶意代码的APK,将其smali和资源文件拷贝到原APK的反编译目录中
  4. 修改恶意代码Main Activity类的smali代码,将“startactivity”变量设置为原app的main activity
  5. 重打包、签名
  • Android恶意代码分析
    • 静态分析
      • 分析AndroidManifest.xml
      • 分析dex文件:反汇编(将dex字节码转换为smali格式的汇编码)、反编译(将dex字节码转换为Java源代码)
    • 动态分析
      • 行为分析
  • APK文件格式
    • APK文件是一个ZIP格式的压缩文件,解压之后可以得到 :
      • META-INF directory: 包括manifest, certificate等 - Res directory: 资源文件
      • Resources.arsc: 编译后的资源文件
      • AndroidManifest.xml:程序全局配置文件,包括 app的package infos, activities, receivers, permissions等
      • Classes.dex: dex格式的Dalvik虚拟机执行码
  • 恶意代码分析常用工具
    • APKTool
      • 反编译得到程序的源代码、图片、XML配置、语言资源等文件
      • 反编译命令
        • apktool d target_app.apk target_folder
      • 重打包命令
        • apktool b target_folder
    • Dex2Jar和JD-GUI
      • 解压apk,得到 classes.dex 文件
      • 使用Dex2Jar将dex转换为jar文件:dex2jar.bat classes.dex
      • 使用JD-GUI查看jar文 件
    • 静态分析工具
      • AndroGuard:Linux环境下Android静态分析工具包
      • Androlyze:AndroGuard中的一个工具
      • APKInspector:图形化的Android静态分析工具
      • Santoku Linux:集成了很多移动安全分析工具的定制化Linux系统
    • 动态分析工具
  • GEINIMI分析
    • GEINIMI常被采用重打包的方式隐藏在众多第三方市场中的游戏等应用中
  • Xxshenqi分析