苹果程序与安卓程序安全机制的区别
iOS安全机制
(1)安全沙箱
进程隔离,每个程序都有自己的虚拟地址空间。应用程序在安装之后,系统就通过计算得到一个标识,然后基于应用程序的根目录和这个标识构件一个指向应用程序目录的路径,其他应用程序都不能进行访问。iOS 的沙箱是基于TrustBSD策略框架的内核扩展模块,针对每个进程都可以制定特殊的沙箱配置文件,沙箱配置文件编译后以2进制的方式保存在KernelCache文件中(iOS下),需反汇编成可读的文本格式来查看内核中的沙盒规则
(2)代码签名
apple需要所有开发人员对自己的iPhone应用程序使用数字签名技术。这个签名用来标识应用程序的开发者以及保证应用程序在签名之后不被更改和损坏。开发者证书由apple提供(这是与android最大的区别,android是自
签名),有以下两类证书:
Developer Certificate:用于本机测试
Distribution Certificate:Ad-hoc用于100台设备以内的测试和共享;app store用于发布应用程序所有的可执行文件、库文件都需要Apple签名后才可以运行在iOS中,内核会在调用execve之前检测Mach-o文件中的LC_CODE_SIGNATURE段是否有效和可信任的,iOS启动的时候同样也会检测KernelCache的签名是否有效代码签名的破坏可见《iOS平台游戏安全之IPA破解原理及防御》
(3)ASLR(address space layout randomisation)/DEP
PIE: position independent executable
iOS 4.3后开始支持该功能,iOS上的预装应用都开启了该功能
ASLR的其他信息可见《ASLR》
DEP(Data execution Prevention),内核不允许将页面保护标志设置为RWS,并在ARMv6引入XN(executenever)标志位,从而在硬件上支持执行保护。
(4)文件系统加密
Data protection APIs
NSFileProtectionNone
NSFileProtectionComplete
NSFileProtectionCompleteUnlessOpen
NSFileProtectionCompleteUntilUserAuthentication
KSecAttrAccessibleAlways
KSecAttrAccessibleWhenUnlocked
KSecAttrAccessibleAfterFirstUnlock
KSecAttrAccessibleAlwaysThisdeviceOnly
KSecAttrAccessibleWhenUnlockedThisDeviceOnly
KSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
timg.jpg
安全机制
(1)安全沙箱
每一个Android应用程序(apk文件)会在安装时分配一个独有的linux用户ID(即一个用户id识别一个应用程序),这就为它建立了一个沙箱,使其不能与其他应用程序进行接触。这个用户ID在安装时分配,并在该设备上一直保持同一个数值。所有存储在应用程序中的数据都会赋予该应用程序的用户ID,使其他应用程序无法访问
这些数据(如需要访问,见(4)文件访问控制)。
(2)代码签名
采用自签名机制,不需要权威机构签名和审核,完全由用户自行判断是否信任该程序(与iOS区别很大)。签名是为了:识别代码的作者
检测应用程序是否发生了变化
在应用程序之间建立信任:使用相同数字签名签署的两个应用程序可以相互授予权限来反问基于签名的API,如果他们共享用户ID,那么也可以运行在同一进程中,从而允许访问对方的代码和数据(见(4)文件访问控制。
代码签名的详细机制可见《Android签名与签名校验》
(3)manifest权限管理
Android要求用户在使用API时进行申明,称为permission,对一些敏感API的使用在安装时就可以给用户风险提示,由用户确定是否安装,例如READ_CONTACTS为读取通讯录数据权限。权限在AndroidManifest.xml文件里进
行设置,通过元素添加子元素,如下图所示
permission分为4个保护等级:normal,dangerous,signature,signatureorsystem。不同的保护级别代表程序要使用此权限时的认证方式。
normal:只要申请就可以使用
dangerous:在安装时需要用户确认才可以使用,最经常使用的权限
signature:告诉android系统这个权限只能授予拥有同样数字签名并且定义了该权限的应用程序
signatureorsystem:需要开发者的应用和系统使用同一个数字证书,即需要系统或者平台签名,真实手机中的系统签名只有厂商知道
应用程序也可以定制权限以保护自己的资源,当前ita应用程序想要访问一个应用程序的受保护资源时,就必须通过它们自己的manifest文件请求适当的权限
(4)文件访问控制
因为安全沙箱的存在导致不同应用程序之间的数据(文件)是隔离的。在通过
getSharedPreferences(filename,operatingMode)
openFileOutput(filename,operatingMode)
openOrCreateDatabase(filename,operatingMode, SQLiteDatabase.CursorFactory)
等方法来创建一个新文件时,可以通过指定文件的存储方式operationMode来进行文件的访问控制,android文件存储有以下4种方式:
Context.MODE_PRIVATE:默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容Context.MODE_APPEND:代表该文件是私有数据,只能被应用本身访问,在该模式下,会检查文件是否存在,存
在就往文件追加内容,否则就创建新文件
Context.MODE_WORLD_READABLE:表示当前文件可以被其他应用读取
Context.MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
除了使用Context.MODE_WORLD_READABLE/Context.MODE_WORLD_WRITEABLE标识位来使两个程序相互访问对方的资源。还可以通过设置AndroidManifest.xml文件的manifest标签中的sharedUserId属性,来使得不同的应用程序共用同一个用户ID,并且这些应用程序还使用同一个签名签署,在满足以上两个条件(共同的sharedUserID,共同的签名)的情况下就可以实现不同应用程序相互资源的访问了,如下图所示
(5)ASLRandroid 4.1后才开始支持完整版功能