Android的安全机制包括如下几个方面:linux
Linux是一个多用户的操做系统,一个UID标识一个用户。用户之间是相互隔离的(这种隔离是创建在访问控制的基础上实现),用户有各自独立的所属资源和权限范围。当多用户登陆Linux系统时,每一个用户的活动都在各自独立的环境中进行,互不干扰。android
Android将Linux系统的用户隔离机制移植为应用程序隔离,应用程序在安装时被赋予独特的用户标识(UID),并永久保持;应用程序及其运行的Dalvik虚拟机运行于独立的Linux进程空间,与UID不一样的应用程序彻底隔离。 web
应用程序包(.apk文件)必须被开发者数字签名;shell
同一开发者可指定不一样的应用程序共享UID,进而运行于同一进程空间,共享资源。 浏览器
签名的过程:安全
• 生成私有、公共密钥和公共密钥证书服务器
• 对应用进行签名网络
• 优化应用程序框架
签名的做用:测试
• 识别代码的做者。
• 检测应用程序是否发生了改变。
• 在应用程序之间创建信任,以便于应用程序能够安全地共享代码和数据。
Android程序默认没法访问系统和资源,应用程序须要显式声明权限、名称、权限组与保护级别。不一样的级别要求应用程序行使此权限时的认证方式不一样:
Normal级申请便可用;
Dangerous级需在安装时由用户确认才可用;
Signature与Signatureorsystem则必须是系统用户才可用。
• 经过manifest文件中声明如下属性
<uses-permissionandroid:name="string" />
请求android:name对应的权限。
• 经过如下属性添加自定义权限
<permission xmlns:android="http://schemas.android.com/apk/res/android" android:name="com.test.android.ACCESS_FRIENDS_LIST" android:description="@string/permission_description" android:label="@string/permission_label" android:protectionLevel="normal" />
• 系统组件权限,如activity组件
<activity android:permission="com.test.android.ACCESS_FRIENDS_LIST">
Linux系统默认采用ACM(访问控制机制为DAC(自主访问控制)。
Android直接继承了Linux的访问控制机制传统的Linux访问控制机制确保系统文件与用户数据不受非法访问。
Linux用户与权限
• 超级用户(root):具备最高的系统权限,UID为0。
• 系统伪用户:Linux操做系统出于系统管理的须要,但又不肯赋予超级用户的权限,须要将某些关键系统应用,文件全部权赋予某些系统伪用户,其UID范围为1~ 499,系统的伪用户不能登陆系统。
• 普通用户:只具有有限的访问权限,UID 为 500 ~ 6000,能够登陆系统得到 shell
在Linux权限模型下,每一个文件属于一个用户和一个组,由UID与GID标识其全部权。针对于文件的具体访问权限
定义为可读(r)、可写(w)与可执行(x),并由三组读、写、执行组成的权限三元组来描述相关权限。
第一组定义文件全部者(用户)的权限,第二组定义同组用户(GID相同但UID不一样的用户)的权限,第三组定义其余用户的权限(GID与UID都不一样的用户)。
Binder进程通讯机制提供基于共享内存的高效进程通讯;
Binder基于Client-Server模式,提供相似COM与CORBA的轻量级远程进程调用(RPC);
经过接口描述语言(AIDL)定义接口与交换数据的类型,确保进程间通讯的数据不会溢出越界,污染进程空间。
Android内存管理机制基于标准Linux的低内存管理机制OOM(out of memory killer),设计实现了独特的低内存清理(LMK)机制,将进程按重要性分级、分组,当内存不足时,自动清理最低级别进程所占用的内存空间;
同时,引入不一样于传统Linux共享内存机制的Android独有共享内存机制Ashmem,具有清理再也不使用共享内存区域的能力。
SELinux 拥有三个基本的操做模式:
• Disabled:禁用SELinux策略
• Permissive:在Permissive模式下,SELinux会被启用但不会实施安全性策略,而只会发出警告及记录行动。Permissive模式在排除SELinux的问题时颇有用
• Enforcing:这个缺省模式会在系统上启用并实施SELinux的安全性策略,拒绝访问及记录行动
SELinux 拥有三种访问控制方法:
• 强制类型(TE):TE是针对型策略所采用的主要访问控制机制
• 基于角色的访问控制(RBAC):它以SELinux用户(未必等同Linux用户)为基础,但缺省的针对型策略并未采用它
• 多层保障(MLS):未被采用,并且常常隐藏在缺省的针对型策略内。
攻击面进行分类:
攻击者无需在物理位置接近目标,而能够直接经过计算机网络发动攻击,具备极大的危害性。
安全漏洞研究的圣杯,不须要与目标交互就能实施,并且可以得到系统的彻底访问控制权,在Android系统中,包含了对IP,TCP,UDP,ICMP等协议的实现。若是在IP包的处理过程当中出现能够用的缓冲区溢出漏洞,将成为最为严重的安全漏洞,能够远程执行内核中的任意代码。
无需目标交互的联网服务是第二位具备吸引力的攻击面。这些服务一般的用户空间执行,可是仍有一些潜在的网络服务,若是成功利用,仍然能够得到root权限,固然这类网络服务极少,能够经过nmap等端口扫描器得到,也能够经过netstat得到,当启动wifi,会有额外的网络服务。
移动设备经过移动通讯暴露了其余远程攻击面,包括经过短信服务(SMS)和多媒体消息服务(MMS),同时使用SMS和MMS消息做为攻击向量还能够达到其它攻击面。MMS消息中能够包含一些多媒体内容。而其它一些协议也实如今SMS之上。
因为网络的通常配置屏蔽了许多传统的远程的攻击面,并且客户端对与它通讯的服务器很是信任。因此,攻击者很大程度上将关注点转移到客户端软件攻击面中存在的安全漏洞。
现代Web浏览器做为功能最为强大的客户端应用表明,支持HTML,Javascript和丰富的web应用。除了渲染和执行应用逻辑以外还支持一些底层协议。如FTP,HTTP。这些都是有数量惊人的后台代码实现的。而其中的每一个组件都带有一个攻击面。能够经过诱导点击,“水坑”等方法进行攻击
每一个web驱动的移动应用暴露的攻击面都是不一样的。
广告网络因为嵌入嵌入式浏览器引擎(WebView),浏览器攻击对于这些应用都是存在的,但通常只能经过中间人攻击人向量。并且与传统浏览器攻击不一样,这种组件还会暴露额外的攻击面,能够利用Java类型的反射攻击进行远程攻破。并且,广告框架可能会对隐私构成显著威胁。
常见的文件格式漏洞
相对较少
Android设备都支持多种基于射频的无线技术,几乎都支持蓝牙和wifi和GPS,较新的还支持NFC(近场通讯),每种无线技术都具备特有的频率,且极易受到大量的攻击,包括主动攻击和被动攻击。其中,主动攻击包括阻塞,欺骗,中间人(MitM)等形式。因为wifi和蜂窝网络是用于访问整个互联网,所以能够达到很是丰富的攻击面。
1.GPS:一般指代Android中的位置信息,可让设备肯定自身在地球的位置。它经过卫星获取信号肯定自身位置。
2.基带:蜂窝调解器能够提供给基带处理器和移动网络通讯的功能。它是Android电话栈的软件组件,因为对它的攻击终端用户难以察觉,并且可以访问手机通话记录及传输数据,对它的攻击具备很是的吸引力。尽管属于远程攻击,但依旧须要在必定的范围内,近年来的“伪基站”攻击
3.蓝牙:蓝牙具备30多种协议,每种蓝牙都定义了蓝牙设备的一项特殊功能。如FTP(文件传输协议),HFP(免提协议),HSP(Handest Profile),HID(人机接口设备协议),DUN(拨号网络协议)。蓝牙协议功能首先须要配对。但一些设备使用硬编码的数字码,很是容易攻击。配对后,有可能劫持会话并进行滥用,可能的攻击方法包括BlueJacking,BlueSnarfing和BlueBugging。除了能够与一些免提设备配对,android设备之间还能互相配对,用于传输联系人列表,文件等。蓝牙设计时功能很是多样化,也提供了攻击者但愿的几乎全部的功能访问
4.Wi-Fi:Wi-Fi主要用于链接局域网,由局域网提供对互联网的访问。详情见于《黑客大曝光:无线网络安全》
5.NFC:NFC是创建与射频标示之上(RFID)的无线通讯技术,NFC在全部的无线技术中,做用范围最短,一般不超过20cm。Android设备上的NFC有三种典型场景。第一,标签被呈现给设备,设备读取标签的数据并进行处理。第二,两位用户将他们的Anddorid设备贴在一块儿传输数据。第三,用于非接触式的支付。最流行的消息格式是NFC数据交换格式(NDEF),解析时会致使执行一些动做。在某些状况下,无需用户交互。
除了无线通讯外,还有其它两个技术也与Android设备的总体攻击面相关。具体来讲为QR码(快速响应矩阵码)和语音指令
当得到对一个设备的任意代码执行后,逻辑上的下一步就是权限提高。终极目标是得到享有特权的代码执行,包括在内存空间执行。或者以root执行。然而只是得到少许权限,也能够暴露更多受限的攻击面。因为权限隔离,为了实现终极目标,须要结合使用多个小的提高目标。
Android的UNIX系统意味着许多攻击面都是经过文件系统条目暴露的
除了文件系统,其它的本地攻击面是有linux'内核暴露的,包括系统调用和套接字实现
1.系统调用:系统调用处理表明一个值得关注的攻击面
2.套接字:Android上运行的软件使用不一样类型的套接字进行ipc
3.Binder:Binder驱动以及它依赖的软件表明Android特有的一个攻击面。Binder驱动是Intent的基础,而Intent是用于在应用层Android组件进行通讯。Binder驱动自己在内核空间实现,并经过。/dev/binder字符设备暴露一个攻击面。
4.共享内存:一种定制的内存共享机制
5.基带接口:Android智能手机上包含第二个操做系统,就是基带
6.攻击硬件支持的服务:包括GPS接收器,光环境传感器,陀螺仪
须要物理接触设备的攻击被称为依赖于物理攻击面,物理面攻击与物理相邻不一样的是物理相邻不须要实际接触目标。
对目标设备进行拆解,就可以对目标设备中的硬件发起攻击。打开一个硬件设备一般会发现
1.暴露的串口,容许接收调试消息
2.暴露的JTAG调试端口,容许对设备的固件进行调试,重刷或访问
USB是Android设备与其它设备进行交互的标准化有线接口
包括手机SIM卡,SD卡,HDMI卡,暴露的测试点和对接链接器
参与生产Android设备的实体会修改操做系统的不一样组成部分,通常须要手工进行分析。