9. Android安全机制
Android安全机制
Android的安全机制包括以下几个方面:
- 进程沙箱隔离机制
- 应用程序签名机制
- 权限声明机制
- 访问控制机制
- 进程通信机制
- 内存管理机制
- SELinux
进程沙箱隔离机制
Linux是一个多用户的操作系统,一个UID标识一个用户。用户之间是相互隔离的(这种隔离是建立在访问控制的基础上实现),用户有各自独立的所属资源和权限范围。当多用户登录Linux系统时,每个用户的活动都在各自独立的环境中进行,互不干扰。
Android将Linux系统的用户隔离机制移植为应用程序隔离,应用程序在安装时被赋予独特的用户标识(UID),并永久保持;应用程序及其运行的Dalvik虚拟机运行于独立的Linux进程空间,与UID不同的应用程序完全隔离。
应用程序签名机制
应用程序包(.apk文件)必须被开发者数字签名;
同一开发者可指定不同的应用程序共享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
SELinux 拥有三个基本的操作模式:
• Disabled:禁用SELinux策略
• Permissive:在Permissive模式下,SELinux会被启用但不会实施安全性策略,而只会发出警告及记录行动。Permissive模式在排除SELinux的问题时很有用
• Enforcing:这个缺省模式会在系统上启用并实施SELinux的安全性策略,拒绝访问及记录行动
SELinux 拥有三种访问控制方法:
• 强制类型(TE):TE是针对型策略所采用的主要访问控制机制
• 基于角色的访问控制(RBAC):它以SELinux用户(未必等同Linux用户)为基础,但缺省的针对型策略并未采用它
• 多层保障(MLS):未被采用,而且经常隐藏在缺省的针对型策略内。
Android攻击面
攻击面进行分类:
远程攻击面
攻击者无需在物理位置接近目标,而可以直接通过计算机网络发动攻击,具有极大的危害性。
网络协议栈
安全漏洞研究的圣杯,不需要与目标交互就能实施,而且能够获得系统的完全访问控制权,在Android系统中,包含了对IP,TCP,UDP,ICMP等协议的实现。如果在IP包的处理过程中出现可以用的缓冲区溢出漏洞,将成为最为严重的安全漏洞,可以远程执行内核中的任意代码。
暴露的网络服务
无需目标交互的联网服务是第二位具有吸引力的攻击面。这些服务通常的用户空间执行,但是仍有一些潜在的网络服务,如果成功利用,仍然可以获得root权限,当然这类网络服务极少,可以通过nmap等端口扫描器获得,也可以通过netstat获得,当启动wifi,会有额外的网络服务。
移动技术
移动设备通过移动通信暴露了其他远程攻击面,包括通过短信服务(SMS)和多媒体消息服务(MMS),同时使用SMS和MMS消息作为攻击向量还可以达到其它攻击面。MMS消息中可以包含一些多媒体内容。而其它一些协议也实现在SMS之上。
客户端攻击面:
由于网络的一般配置屏蔽了许多传统的远程的攻击面,而且客户端对与它通信的服务器非常信任。所以,攻击者很大程度上将关注点转移到客户端软件攻击面中存在的安全漏洞。
浏览器攻击面
现代Web浏览器作为功能最为强大的客户端应用代表,支持HTML,Javascript和丰富的web应用。除了渲染和执行应用逻辑之外还支持一些底层协议。如FTP,HTTP。这些都是有数量惊人的后台代码实现的。而其中的每个组件都带有一个攻击面。可以通过诱导点击,“水坑”等方法进行攻击
web驱动的移动应用程序
每个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
USB是Android设备与其它设备进行交互的标准化有线接口
其它物理攻击面
包括手机SIM卡,SD卡,HDMI卡,暴露的测试点和对接连接器
第三方修改
参与生产Android设备的实体会修改操作系统的不同组成部分,一般需要手工进行分析。