iOS安全机制

    iOS的系统安全性要比Android系统要高,其中有几个主要的原因,一是对应用安装源的限制,iOS设备必须从App Store上下载应用或者使用企业证书做分发,而Android系统的设备可以安装任何安装包(Android Package,APK)。这样会导致恶意应用可以很轻易地被安装到手机上。二是iOS上的应用有着严格的“沙盒”机制。每个应用都只能访问自己沙盒目录下的数据,没有公共的读写区域,而Android系统存在公共读写区域,容易造成信息泄露。三是iOS应用被限制在只能在后台运行,只要点击Home键,应用的所有线程都会被挂起。只有一些必须运行在后台的服务才能被执行(如实时位置、播放音乐等),而Android应用可以创建在后台服务,即使应用被切换到后台,代码还是可以执行的,用户很难察觉到。

  1.1 应用的安装源

      App Store是苹果的应用市场,苹果手机上使用的微信、QQ和支付宝等应用都是从App Store上下载的。同样,如果你想开发一款应用并上架App Store,必须提交给苹果公司进行审核,审核通过以后,应用才能在App Store上被搜索、下载。除了从App Store上下载应用外,还有其他安装应用的方法,其中一种方法上使用企业证书做分发,价格为每年299美元。这种方法不限制安装设备的数量,但是安装完成后想要打开软件时,会出现“为首企业信任的企业级开发者”提示,如图1-1所示

      这时我们就需要点击“设置”->“通用”->“设备管理”,信任安装的应用。(只有安装过企业级应用的设备才会显示“设备管理”选项,如果没有安装过企业级应用,就不会显示这个选项。)

      还有一种方法就是使用个人/公司证书进行开发及测试,价格为99美元。这种方法首先需要将设备的UDID(Unique Device Identifier,设备唯一标识符)添加到开发者账号中,最多可以添加100台设备,然后下载配置文件,在Xcode上添加配置文件并编译相应的程序,最后就能安装在这台设备上了。Xcode9 有自动注册设备的功能,当我们使用Xcode进行真机调试,这个新设备的时候就会进行自动注册。如图1-2所示。

     

      正是App Store严格的审核以及应用安装源的限制,比较有效地控制了恶意程序的传播。

       1.2 沙盒

       沙盒(sandbox)是iOS的一个防御机制,每个应用都会有一个自己的沙盒。应用只能在自己的沙盒目录下读写数据,应用A不能访问应用B的沙盒,它们之间是互相隔离的。正因为如此,攻击者上传恶意程序后,即使侥幸通过了App Store的审核,被安装到用户的手机之后也不能获取其他应用的数据。获取沙盒目录的方法如下:

                     

 

    沙盒机制限制了应用只能读写沙盒之内的文件,而我们在有些情况下需要访问一些公共资源(如通讯录、短信照片和位置等),这些是存在沙盒之外的。苹果提供了公开的API去访问这些公共资源,不过都会弹出申请权限提示框,用户必须允许才能操作成功,比如微信访问照片提示需要用户授权,如图1-3所示。

         1.3 代码签名

       代码签名(code signing)是iOS一个重要的安全机制,所有的二进制文件都必须经过签名才能被执行。在内存中,只有签名来源为自己的页才会被执行,这样应用就不能自我升级或者动态改变行为。我们可以使用codesign命令来验证应用的签名纤细是否被破坏。输入下面的命令后,如果没有输出信息,就表示签名信息没有被破坏过:

        codesign --verify testSandbox.app/

     此外,使用下面的命令还可以查看签名的相关信息:

       codesign -vv -d testSandbox.app/

               

        1.4  用户权限隔离

        iOS使用了用户权限进行隔离。系统中的浏览器、电话、短信以及从 App Store上下载的应用,这些都是以mobile用户权限运行,只有重要的系统进程才以root权限运行。这样一来,即使恶意软件安装成功,也会用于存在权限设置,而使攻击的可能性变小。我们打开“电话”应用(MobilePhone),通过ps命令查看相关的进程信息,可以看到它是以mobile的身份运行的。

       

       1.5  数据执行保护

      iOS中存在数据执行保护(Data Execution Prevention,DEP)机制,这一机制能够区分内存中哪些是可执行的代码,哪些是数据。该机制不允许执行数据,只允许执行代码。在默认情况下,数据段的属性是可读、可写、不可执行的。如果我们通过vm_protect函数把数据段的属性修改为可读、可写、可执行,就会打印错误,代码如下:

     

     1.6 地址随机化

       地址空间布局随机化(Address Space Layout Randomization,ASLR)能够让二进制文件、动态库文件、代码段以及数据段的内存地址在每次加载的时候都是随机的。使用_dyld_get_image_vmaddr_slide函数可以获取模块的ASLR偏移地址,使用_dyld_get_iamge_header函数可以获取模块的基址。我们编写如下代码:
     

       1.7 后台程序

          Android应用能够在后台创建可执行代码的服务,这些服务可能会偷偷下载文件消耗流量,造成扣费的情况。iOS应用不能在后台执行代码,只要用户点击Home键,前台应用的所有线程都会被挂起,只有播放音乐、获取实时位置等必须在后台执行的操作才能执行。不过在iOS中,也可以是有后台程序的,被称为daemon(守护程序)。比如在打开safari(浏览器)上网时,突然有来电打进来,接听电话的页面就会显示在前台,如果没有后台程序,怎么处理来电显示呢?只是苹果并没有给开发者开放后台程序,只有越狱之后,才能编写后台程序。

          iOS的系统进程launchd会在系统自动检测/System/Library/LaunchDaemons和/Library/LaunchDaemons这两个目录中的.plist文件,而.plist文件描述了daemon程序的路径。

         

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值