Android安全[基础知识]

Android lifecycle:

 

1 - Boot ROM
按下开机键后,跳至硬件编码的BOOT ROM指定地址:加载Bootloader到内存中,开始执行Bootloader代码


2 - Bootloader
Bootloader 执行分为两个阶段:
检测外部RAM,初始化网络、内存等,为启动kernel做准备
Bootloader的核心代码在init.S.


3 - Kernel
Android的Kernel启动跟Linux Kernel启动过程很相似,在这个过程中主要是初始化cache, 内存保护,进程调度,驱动以及挂载root文件系统。初始化完成之后,开始加载 Android的第一个进程 init


4 - Init
init进程是Android所有进程的父进程,其主要有两个作用:
挂载系统目录:/sys, /dev/, /proc
执行初始化脚本init.rc
此阶段init进程会启动系统的必须的守护进程,如RILD,netd,vold,meadiaserver,installd,adbd等,然后通过 脚本命令:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

开始加载 Android系统VM以及核心服务。 上述脚本通过/android/frameworks/base/cmds/app_process/app_main.cpp 解析后,启动 zygote进程和system server核心服务。
有关 init.rc 的语法可以参看 AOSP 代码目录: /android/system/core/init/readme.txt
init 进程代码可以参看AOSP目录: /android/system/core/init/
init.rc 可参看 AOSP目录: /android/system/core/rootdir/init.rc


5 - Zygote/Dalvik
在Java中,不同的应用有不同的Virtual Machine(VM)实例,Android考虑到APP的加载速度,防止内存消耗过大,通过创建一个zygote进程,从而实现不同Dalvik VM之间的代码、数据共享。 zygote进程主要用于预加载并初始化Android的核心库类。
一旦init初始化完Android Runtime,zygote开始创建 第一个Dalvik VM实例,由此 zygote进程开始加载system server进程。 zygote的执行主要有几个关键步骤:
加载并执行 ZygoteInit 类
registerZygoteSocket(): 注册用于zygote命令链接的socket
preloadClasses(); preloadResources(): 预加载常用类以及系统资源(themes,layouts等)
至此,系统会有开机画面显示


6 - System Server/services
Zygote启动一个新的system server进程用于启动系统服务,需要启动的服务主要有两类:
(1) core services; 
(2) other services;


7 - 启动HOME Activity
ActivityManager 初始化完成后,会发送一个 CATEGORY_HOME 的Intent,从而启动HOME Screen,至此可以看到手机开机完成后的IDLE界面,Android系统启动完成。

Android system file introduce:

Init: 是系统启动到文件系统的时候第一个运行的程序
init.rc :系统初始化脚本
cache :是缓存临时文件夹
etc :指向 /system/etc ,众所周知的配置文件存放目录
system :是Android根文件系统中一个很重要的目录,系统中的大部分东西都在这里了
sys:用于挂载 sysfs文件系统。。
proc :
/proc 文件系统下的多种文件提供的系统信息不是针对某个特定进程的,而是能够在整个系统范围的上下文中使用。
一个虚拟的文件系统,由kernel提供,不是实际的存储空间,存在kenel管理的内存中,应用层可通过/proc下的文件动态获取kernel中系统进程(process)的运行信息.也可通过/proc/sys目录下可写文件修改kernel运行状态,实现与kernel的交互.
在init.c中挂载到/proc文件上.
其中比较常用的获取文件:/proc/cpuinfo/proc/meminfo /proc/mounts /proc/version ...
顾名思义.可以在shell使用cat*查看
设置/proc/sys/kernel状态值,init.rc中就有设置,可以参考,大部分设置在/proc/sys/kernel下
shell下可使用echo* > * 重定向设置状态值.

mnt:U盘等外部存储设备挂载路径
data :存放用户安装的软件以及各种数据。
dev :设备节点文件的存放地。
tmp:写权限最近在做一个项目,需要应用将一个程序(比如testcmd)放到/data/local/tmp中执行。
storage:外部SD卡所在目录
sbin : 存放root用户可执行文件的目录,一般存在这下面的就是adbd


Init作用:是一个内核启动的用户级进程,完成init.rc解析和初始化、属性服务(getprop)初始化、
进入无限for循环以建立子进程并对关键服务的异常进行重启和异常处理。
(1)、 创建一些linux根文件系统中的目录
(2)、读取并且解析init.rc文件
(3)、读取并且解析硬件相关的init.magellanbroad.rc脚本文件
(4)、初始化动态设备管理,设备文件有变化时反应给内核
(5)、启动系统属性服务: system property service
(6)、启动init.rc中定义的boot 等各种action和service

ADB进程分:ADB Client(5037端口)、ADB Server(5037端口)、ADB Daemon(模拟器守护进程)。VOLD(存储类守护)进程:负责CDROM、USB大容量存储等扩展存储挂载自动完成,支持外设的热插拔。Service Manager是用来管理系统中的Service如Input Method、Activity Manager Service,其中有两个比较重要的方法:add_service(系统服务的注册)、check_service(系统服务的检查)。

System 目录结构分析
\system\app
这个里面主要存放的是常规下载的应用程序,可以看到都是以APK格式结尾的文件, 在这个文件夹下的程序为系统默认的组件,自己安装的软件将不会出现在这里,而是\data\app。

\system\bin
这个目录下的文件都是系统的本地程序,从bin文件夹名称可以看出是binary二进制的程序,里面主要是Linux系统自带的组件

\system\etc
从文件夹名称来看保存的都是系统的配置文件

\system\fonts
字体文件夹,除了标准字体和粗体、斜体外可以看到文件体积最大的可能是中文字库

\system\framework
framework主要是一些核心的文件,从后缀名为jar可以看出是是系统平台框架

\system\lib
lib目录中存放几乎所有的共享库(.so)文件

\system\media
铃声音乐文件夹,除了常规的铃声外还有一些系统提示事件音

\system\xbin
系统员管理工具
build.prop

系统全局属性
特别说明:
build.prop 是一个属性文件,在Android系统中.prop文件很重要,记录了系统的设置和改变,类似於/etc中的文件。
1、查看build.prop
# getprop
# getprop ro.sf.lcd_density  //查看单个属性
2.设置属性
#setprop ro.sf.lcd_density  240

Activity lifecycle:

App system file introduce:

AndroidManifest.xml
该文件是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息[ , ],如要把apk上传到Google Market上,也要对这个xml做一些配置。在apk中的AndroidManifest.xml是经过压缩的,可以通过AXMLPrinter2工具[ , ]解开,具体命令为:java -jar AXMLPrinter2.jar AndroidManifest.xml

META-INF目录
META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。在eclipse编译生成一个apk包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。这就保证了apk包里的文件不能被随意替换。比如拿到一个apk包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系统的安全。

res目录
res目录存放资源文件。包括图片,字符串等等。

lib目录
lib目录下的子目录armeabi存放的是一些so文件。这个地方多讲几句,都是在开发过程中摸索出来的。eclipse在打包的时候会根据文件名的命名规则(lib****.so)去打包so文件,开头和结尾必须分别为“lib”和“.so”,否则是不会打包到apk文件中的。其他非eclipse开发环境没有测试过。如果你是用SDK和NDK开发的话,这部分很重要,甚至可以通过把一些不是so文件的文件通过改名打包到apk中,具体能干些什么那就看你想干什么了。

assets目录
assets目录可以存放一些配置文件,这些文件的内容在程序运行过程中可以通过相关的API获得。具体的方法可以参考SDK中的例子:在sdk的 \SDK\1.6\android-sdk-windows-1.6_r1\platforms\android-1.6\samples\ApiDemos 例子中,有个com.example..android.apis.content 的例子,在这个例子中他把一个text文件放到工程的asset目录下,然后把这个txt当作普通文件处理。处理的过程在ReadAsset.java中。同理,asset也可以放置其他文件。

classes.dex文件
classes.dex是java源码编译后生成的java字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。目前常见的java反编译工具都不能处理dex文件。Android模拟器中提供了一个dex文件的反编译工具,dexdump。用法为首先启动Android模拟器,把要查看的dex文件用adb push上传的模拟器中,然后通过adb shell登录,找到要查看的dex文件,执行dexdump xxx.dex。

resources.arsc
编译后的二进制资源文件

1.安卓架构

    安卓应用层: apk

    安卓框架层: DEX

    Dalvik虚拟机层: DEX

    本地用户空间层: system service, network service

    linux内核层: device driver

 

2.安卓安全边界和策略

    android sandbox: unix process separate[uid,gid]

    android permission: api, file, ipc

 

3.安卓应用层

    main of module:

        AndroidManifest: permission,package name,third package, sharedUserID define. etc

        Intent: for module communication[for example: click on the link in the email to launch a browser to notify the message app get the information]

        Activity: UI

        Broadcast Receiver: receive an implicit intent

        Service: no UI module; use the IPC mechanism to receive and send information

        Content Provider: generally or share of data provide access interface

 

4.安卓框架层:

    main of server:

        Acitivity manager: manage Intent parse and goal, application/activity start. etc

        view system: manage activity view

        program package manager: manage information of packages that are entering the installation queue on the administration system

        phone manager: phone server, wirelesss status, network and information about registration and task

        resource manager: images, character string. etc

        location manager: gps, wifi location information

        notification manager: voice notice, vibration notice, LED light notice. etc

 

5.Dalvik虚拟机层:

    based on stack

    develop flow: .class file -- Dalvik byte code  -- DEX -->launch

    zygote: Dalvik loader, launch system_server process

 

6.本地用户空间层

    program library:

        call by JNI

        vendor path: /vendor/lib or /system/vendor/lib

        no vendor path: /system/lib

    core system server:

        init : /etc/init.d or /init.rc

        property: "getprop" command can check something

        wireless:

        adb:

        volume deamon:

        debugggerd:

        other:

 

7.linux内核层

 

Binder: 

    it is a frame: server, client

    one process can call multi process

    use UID and PID identification process 

    main funtion: Binder.getCallingUid , Binder.getCallingPid, checkCallingPermission

 

8.安卓root

    partition:  boot loader to handle zone[由引导器处理分区]

    usual NAND flash memory layout:

        boot loader: boot android core

        start splash screen[开机闪屏] :  embed start screen

        boot zone:  save boot image, linux core[zImage], root RAM disk[initrd]

        recovery zone:  save android boot mapping use for repair

        system zone: /system

        user data zone:  /data

        cache zone: save log, update pack

        wireless zone: save base system image

    view partition: 

        use "cat /proc/partitions" command

        /etc/vold.fstab, /cache/recovery/last_log, /proc/kmsg, mount /proc/mounts

    boot flow:

        boot loader -- boot zone [zImage,initrd] -- init process -- zygote -- Dalvik -- system server

    download pattern:

        1.different machine  has different download pattern and use different keyboard entrance.

                for example:

                        sunsang Galaxy Nexus:  fastboot pattern, ODIN pattern

    root machine[simple introduce]:

        1. entrance boot zone destory lock[unlock]  

                fastboot pattern:  use "fastboot oem unlock"

        2.root system

                it need a set-uid permission of binary program 

 

9.安卓应用安全

    1.preliminary analysis:function,configuration

    2.static analysis:hard-coded,url link,secret key,auth key/ etc — by so/smali/java[ida/od] analysis

    3.dynamic analysis:information leak — by drozer

    4.application analysis:bussiness vuln

    permission: ##

    sensitive information leak: ##

    unsafe data storage: ##

    leak by log: ##

    unsafe IPC: ##

 

威胁建模[思维导图]

 

相关知识

安卓app模型:

  • 基于linux uid,gid的进程隔离
  • 基于权限机制的资源及数据访问控制
    • -enforceCallingPermission
  • 基于签名和证书的校验
  • selinux


测试途径:

  • 网络链路
  • 本地应用
  • 远程URL
  • ADB

 

漏洞产生的原因:

  • 系统/框架API使用不当和配置不当(最常见)
  • 敏感信息泄露
  • 组件权限设置不当/输入数据处理不当
  • 应用逻辑和API(本地及远端)设计不当
  • 三方组件
  • 敏感场景弱保护
     

linu内核: 负责配置应用沙盒和规范权限。 一个apk包由 Dalvik 可执行文件dex,资源,本地库和清单文件组成,并由开发者签名来签名。[权限]
    linux内核层配置应用沙箱如下:
        1.在安装过程中,每个包都会被分配一个唯一的用户标识符(UID)和组标识符(GID),在设备的应用生命周期内不会更改。因此,在Android 中每个应用都有一个相应的 Linux 用户。 用户名遵循格式 app_x ,并且该用户的UID等于Process.FIRST_APPLICATION_UID + x ,其中 Process.FIRST_APPLICATION_UID 常量对应于 10000
        2.在 Linux 中,内存中的所有文件都受 Linux 自定义访问控制(DAC)的约束。访问权限由文件的创建者或所有者为三种用户类型设置:文件的所有者,与所有者在同一组中的用户和所有其他用户。
        使用相同证书签名的应用能够在彼此之间共享数据,可以拥有相同的 UID 或甚至可以在相同的进程中运行。


本地用户空间层:在 Android 操作系统的安全配置中起到重要作用。 [流程和目录]


框架层:应用程序框架级别上的安全性由 IPC 引用监视器实现。使用 Binder 框架的客户端和服务之间的所有通信,都通过 Linux 内核驱动程序 /dev/binder 进行。 [AndroidManifest.xml]


应用层安全:Android 应用由四个组件类型的几个组件组成:活动(Activity),服务(Service),广播接收器(Boardcast Reciver)和内容供应器(Content Provider)。
 

安卓签名过程:在应用程序签名过程中, jarsigner 创建 META-INF 目录,在 Android 中通常包含以下文件:清单文件( MANIFEST.MF ),签名文件(扩展名为 .SF )和签名块文件( .RSA 或 .DSA ) 。

参考

http://bobao.360.cn/learning/detail/122.html

http://www.droidsec.cn/category/mobilesecuritybook/

http://www.droidsec.cn/%E5%B8%B8%E8%A7%81app%E5%8A%A0%E5%9B%BA%E5%8E%82%E5%95%86%E8%84%B1%E5%A3%B3%E6%96%B9%E6%B3%95%E7%A0%94%E7%A9%B6/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值