读《Android安全架构深究》:企业安全

2017年3月6日 没有评论

设备管理:

Android2.2引入设备管理API,以支持开发可执行系统安全策略,并基于设备当前级别,动态调整相关特性的应用。这种应用被称为设备管理员(device administrator)。设备管理员必须在设备安全设置中显式打开,并且如果处于激活状态将无法被卸载。被打开之后,设备管理员可以获取系统特殊权限:锁定设备、改变锁屏密码,甚至擦除整个设备。设备管理员一般会搭配一个特殊的企业账户,允许企业管理员设置只有符合安全策略的设备才能获取企业数据。安全策略可以静态植入设备管理程序,也可以作为配置或同步协议的一部分在服务端进行设置后推送到设备。
Androdi4.4支持的策略类型如表9-1所示,策略常量定义在DeviceAdminInfo类中。

实现方法:
使用管理类DeviecePolicyManager来暴露下层DevicePolicyManagerService系统服务的部分功能。DeviecePolicyManager外观类仅仅定义了一些常量,并将服务异常转换为错误码,并没有添加任何实际功能。
DevicePolicyManagerService由system_server启动,以system用户运行。该服务可以帮助第三方应用(不需要特殊权限)获取到相关的特权操作(如修改锁屏密码)。
特权管理:
DevicePolicyManagerService运行时,将会在内存中为每个设备用户维护一个内部的策略结构体。每个策略结构体中包含对特定用户的当前策略,以及所有激活的设备管理员元数据清单。因为每个用户可以打开多个拥有设备管理员功能的应用,所以需要从中选择出最严格的作为当前策略。每个激活的设备管理员应用的元数据中包含有应用信息和相关策略清单。
应用若想请求策略,那么需要添加一个XML资源文件,该文件在标签下添加所有欲使用的策略。在设备管理员应用激活前,系统处理这个XML文件,并显示对话框,令用户在启动前检查其请求的策略。
策略保存:
设备管理员被激活后,关闭的操作或策略的更新会被记录到目标用户的device_policies.xml文件中。设备所有者被保存到/data/system/目录下,其他用户保存到用户系统目录/data/users//下。device_policies.xml文件中包含每个激活管理员(active administrator)及其策略信息,以及一些当前锁屏密码的全局信息。
策略执行:
设备管理员策略可以有不同的颗粒,能够选择仅仅对当前用户或者对设备上的所有用户执行。
添加设备管理员:
实现设备管理员:
需要声明一个需要BIND_DEVICE_ADMIN权限的广播接收者,列出使用策略的一个XML资源文件,和处理ACTION_DEVICE_ADMIN_ENABLED intent的intent-filter。
设置设备所有者:
如果一个设备管理员应用是系统镜像的一部分,那么可以通过调用setDeviceOwner(String packageName, String ownerName)隐藏方法,将其设定为系统拥有者。虽然这个方法不需要特殊权限,但是只有设备被准备(Settings.Global.DEVICE_PROVISIONED为0)好之前才能够被调用(只有负责系统初始化的系统应用才有机会调用)。
成功调用这个函数会在/data/system/目录下写入一个device_owner.xml文件。
托管设备:
安装着所有者管理员的设备(owner administrator)被称为托管设备(managed device),对影响设备安全配置的修改与非托管设备有很多不同。
企业账户集成:。。。

阅读全文…

分类: Android, VPN, WIFI, 未分类 标签: ,

读《Android安全架构深究》:在线账户管理

2017年3月3日 没有评论

AccountManager和AccountManagerService:
AccountManager是完成实际工作的AccountManagerService的外观类(facade)。AccountManager服务并不实现特定账户的认证,而是维护一组可扩展的账户类型(Google,Twitter,Microsoft Exchange等)认证模块。

认证模块:
认证模块是由应用定义并拥有的,且每个模块都实现了android.account.IAccountAutherticator的AIDL接口的一个特定服务。这个接口中包含增加账户、请求用户输入账户凭据、获取一个认证令牌、更新账户元数据等方法。工程中,应用不直接实现这个接口,而是继承android.accounts.AbstractAccountAuthenticator类,它会将实现函数和内部AIDL的存根(stub)关联起来。
AbstractAccountAuthenticator类还确保了AIDL存根的调用者拥有ACCOUNT_MANAGER的权限。这个权限是系统签名权限,只有系统组件才可以直接调用认证模块。其他客户端都必须间接通过AccountManagerService类进行调用。

认证缓存模块:
AccountAuthenticatorCache类提供了“可插拔性”,会在系统中扫描已经定义的认证模块包,将其与AccountManagerService关联。该缓存建立在与PackageManagerService服务的,关于本机已安装包的注册的Intent动作,和元数据情况的协商通信,的基础上。会不断通过广播接收来保持更新:当增加、更新或删除一个包的时候,会触发这个广播接收者的方法,并将缓存写入/data/system/registed_services/目录下,并以相应的intent动作命名。 在多用户设备上,每个用户都会有各自的缓存文件。

账户管理服务的操作和权限:
AccountManagerService类利用权限组合、调用者UID、签名校验等方法,实现访问控制。

列出和认证账户:
管理账户:
使用账户凭证:

账户数据库:
位于/data/system/users/<user ID >/accounts.db。包含6个表:accounts、extras、authtokens、grants、shared_users、和 meta。
密码安全:
虽然凭据(通常是用户名和密码)集中存储在/data/system/目录下的数据库中,且只有系统应用才能够访问到,但是凭据并没有被加密;如果需要的话,加密或者其他保护凭据的方法,需要认证器模块自行实现。为了避免密钥包含在备份或者系统转储中的风险,应用可以使用与设备相关的密钥,对密码进行加密,或者在初始登录完成后,将密码替换为可作废的主令牌。

增加一个认证器:
认证器模块是一个实现了android.accounts.IAccountAuthenticator AIDL接口的绑定服务,并且可以使用android.accounts.AccountAuthenticator intent动作绑定。
大多数认证器逻辑在Android提供的AbstractAccountAuthenticator基类派生的认证器类中进行实现:包括添加账户、检查用户提供的凭据、获取认证令牌等。
当实现账户认证器后,可以简单的创建一个响应android.accounts.AccountAuthenticator intent动作的服务。为了支持AccountAuthenticatorCache和AccountManagerService的调用,这个Service需要声明android.accounts.AccountAuthenticator intent动作并匹配元数据;访问账户和令牌需要的权限也需要添加到manifest中;最后,账户类型、标签和图标都必须在引用的XML资源文件中进行声明。

Google账户支持:

读《Android安全架构深究》:凭据存储

2017年3月3日 没有评论

Android的凭据库不仅可以用来存储系统内置特性(如WIFI和VPN连接)的凭据,也可以被第三方应用使用。应用可以使用标准SDK的API访问凭据库来安全管理它们的密钥。

VPN和WIFI EAP凭据:

VPN的实现由于隧道技术的哦不同而有所区别,但是都需要建立在安全连接之前对客户端进行认证。一些VPN使用共享密钥或密码作为验证方法,但企业级的解决方案一般都依赖于基于PKI的客户端认证。扩展认证协议(EAP)是一个经常被用于无线网络和P2P连接的认证框架,在企业环境中推荐使用的方法是EAP-TLS,特别是已经部署好PKI的公司。

认证密钥和证书:
对于EAP-TLS和基于PKI的VPN来说,客户端会保存一个认证密钥,并被签发一个对应的证书(经常是公司的CA)。当安全策略允许使用非物理设备保护的认证密钥时,密钥和对应的证书一般会使用标准的PKCS#12文件格式保存。

系统凭据库:
系统的凭据库是Android的一个系统服务,它会把在导入的凭据保存到外存之前将其进行加密。加密的密钥由用户提供的一个密码生成。凭据库系统服务保证了只有明确申请了访问权限的应用才能够访问存储的凭据。
访问系统凭据库的API在Android4.0中第一次被引入。系统凭据库之后被扩展支持了基于硬件的凭据存储,并且不仅提供了共享系统密钥,也支持应用私有密钥

阅读全文…

分类: 未分类 标签: ,

读《Android安全架构深究》:网络安全与PKI

2017年2月28日 没有评论

PKI与SSL概述

TLS和SSL是点对点的安全通讯协议,旨在为在TCP/IP上的通信提供身份认证、消息机密性和消息完整性服务。其身份认证功能主要依赖于公钥证书。
为了建立加密通信,客户端和服务器徐亚协商出一个两者共同支持的密码套件,然后通过证书互相确认对方的身份,最后双方协商出一个对称加密算法,并计算出一个共享密钥,用于加密双方所有的通信数据。尽管SSL协议支持双向身份认证,一般在实际使用中只进行服务器端的身份认证。

公钥证书:
公钥证书是一个将身份和公钥绑定的结构。对于X.509证书来说(应用于SSL协议),“身份”指的是一组属性值,主要包括一个主体的特征名(主题常用名、组织单位、国家),其他的主要属性包括签发者的特征名、有效期和一系列扩展字段。

直接信任和Private CA:
一般而言,客户端都会被配置一系列的信任锚,其中包含知名的签发者(Public CA)。不同浏览器和操作系统西安则默认信任锚的方式还是存在很大差别。

公钥基础设施:
在证书被Public CA签名之前,需要进行一些身份认证。认证过程差别很大,从最简单的邮箱地址认证(简易服务器证书),到需要多种形式的政府签发ID和公司注册文档(EV证书)都有可能。
Public CA为了实施实体认证服务,创建、管理和发布证书,需要依赖于很多人、系统、程序和策略,这些实体和系统被称为公钥体系结构(Public Key Infrastructure,PKI)。PKI结构十分复杂,但就安全通讯(尤其是SSL)而言,最重要的元素就是CA证书。因为CA证书扮演信任锚的角色,用于认证通讯实体的身份。

		在PKI中,拥有证书的个人或服务器称之为终端实体(end-entity,EE)。
		为了获得证书,EE需要给下注册机构(registration authority,RA)发送请求。RA需要从EE获取身份证明信息,并根据CA的策略要求对信息进行认证。当RA确认EE的身份后,检查EE的身份信息是否符合证书请求的条件,如果满足,RA会转发请求到负责签发的CA。
		然后CA对EE的证书请求进行签名,生成EE证书,并维护证书的撤销信息。
		根CA并不会直接对EE证书进行签名,只是对签发CA的证书进行签名,并维护签发CA证书的撤销信息。根CA的使用频率非常低,为了增加密钥的安全性,一般离线保存。
		

证书撤销:
撤销证书包括将证书的序列号和撤消原因,加入到CA定期发布的证书撤销清单(CRL)中。实体通过查找相应的证书序列号是否在CRL中,来判断证书状态。许多SSl客户端或者根本不检查撤销链信息,或者即使连接中的证书已经被撤销,任允许所有连接。SSL客户端这种宽容行为的原因主要是基于对获取当前撤销信息开销的考虑,从而确保连通性。

阅读全文…

分类: Android, 未分类 标签: , ,

读《Android安全架构深究》:加密服务

2017年2月26日 没有评论

JCA Provider结构:
JCA(Java加密体系结构)提供了一个可扩展的加密服务提供程序框架,和一组API,它覆盖了当今在用的主要密码学原语(分组密码、消息摘要、数字签名等)。

加密服务Provider:
JCA将密码功能分成若干抽象的服务,也叫做引擎(engine),并且以引擎类的形式,对每个服务定义了API。(Eg:数字签名通过Signature引擎类表示;加密操作由Cipher类表示)
在JCA环境中,一个加密服务提供程序(CSP)提供了某些加密服务具体实现的一个包或一组包。每个Provider通告其实现的服务及算法,允许JCA框架维护一个所支持算法及相关实现的Provider注册表。 阅读全文…

分类: Android, 未分类 标签: , ,

读《Android安全架构深究》:用户管理

2017年2月23日 没有评论

用户类型:

主用户(持有者):第一个用户,默认创建,一直存在。userID是0,具有所有权限,可以创建、删除其他用户,更改影响所有用户的设置。
次要用户:除受限用户所有后添加的用户。
受限用户:受限用户基于主用户,以特定限制条件共享它的应用、数据和账号。主用户控制哪个应用对手向用户可用。
访客用户:支持一个访客用户,默认禁用。具体用途不明。

阅读全文…

分类: 未分类 标签:

读《Android安全架构深究》:包管理机制

2017年2月22日 没有评论

代码签名
签名解决完整性和可靠性,即确保程序没有被篡改(完整性),并且由它所称的创建者所创建(可靠性)。
代码签名不能解决代码签名者能否被信任,不能解决被签名代码是否安全。

应用程序包与数据的位置
系统应用:系统应用在只读分区/system,在量产设备上不能被修改或卸载。因此被认为是可信的,并赋予了更多权限,还会放松一些签名检查。
大部分系统中,可在/system/app/目录下找到系统应用,在/system/priv-app/下保存特权应用(可被授予signatureOrSystem保护级别),/system/vendor/app/目录是厂商专有的应用。
用户应用:用户应用存放在读写分区userdata,可以被任意卸载或替换,大部分用户安装应用被安装在/data/app/目录下。
数据目录:同时为系统应用和用户应用准备,创建在userdata分区的/data/data目录下。同时存放:一些为用户安装应用优化过的DEX文件(/data/dalvik-cache)、系统包数据库(/data/system/packages.xml)、以及其他系统数据库和设置文件。 阅读全文…

Android源码编译II:错误列表

2017年2月21日 没有评论

一、目标:

完成Android源码编译

二、环境:

桌面环境:Win7系统,Git bash,Chrome浏览器(插件:代理助手),ShadowSocks

三、步骤:

阅读全文…

分类: 未分类 标签:

读《Android安全架构深究》:权限

2017年2月21日 没有评论

权限的保护级别

一个权限的保护级别(Permission Protection Levels)是:暗示权限中隐含的潜在风险,并且指出当决定是否赋予权限时,系统应遵循的校验程序的流程。
normal级别:权限保护级别的默认值,定义了访问系统或其它应用程序的低风险权限。它无需用户确认,会自动授权。
dangerous级别:可以访问到用户数据,或者在某种形式上控制设备。在赋予dangerous级别的权限前,Android会弹出一个确认对话框,显示所请求的权限信息。
signature级别:只会赋予那些与声明权限使用相同证书的应用程。通常被用于执行设备管理任务的系统应用。
signatureOrSystem级别:某种形式上是一种折中方案:他可被赋予系统镜像的部分应用,或者与声明权限具有相同签名密钥的应用程序。这允许厂商无需共享签名密钥,即可预装自己的应用来共享一个需要权限的特定功能。Android4.4版本之后,安装在/system/priv-app/目录下的应用,才能被赋予这个级别的保护权限。

阅读全文…

分类: Android, 未分类 标签: , ,

Android中图片在内存中的大小

2017年2月21日 没有评论

Android中一张图片(Bitmap)占用的内存由以下三个因素决定:

1.图片的像素点个数

2.单位像素占用的字节数

图片占用的内存值为:

图片长度  *  图片宽度  *  单位像素占用的字节数

单位像素所占用的字节数与图片的解码方式有关。 阅读全文…

分类: Android, 数字, 未分类 标签: ,