一些IOS app安全机制

发布于 2022-08-12  13 次阅读


IOS app安全机制

secure boot chain安全启动链

code signing 代码签名

process-level sandboxing 进程级沙盒

data-at-rest encryption 空闲数据加密

generic native language exploit mitigations:

address space layout randomization 地址排布随机化

non-executable memory 内存读写限制

stacksmashingprotection 栈覆盖保护

Secure boot chain 安全启动链

https://cloud.tencent.com/developer/article/1445936

BootROM→LLB→iBoot→iosKernel

设备生产时烧录Boot ROM,bootrom只读,设备默认信任bootRom。bootRom使用Apple Root CA public证书验证LLB并引导加载底层引导加载器LLB,验证成功加载iBoot,不成功则启动失败。

正是由于bootrom才导致iphone上是无法加载andriod的。

LLB (Low Level Bootloader, 底层引导加载器)负责定位并加载iBoot,是内嵌在ios系统中的,是一种被加密的IMG3格式文件,随着ios更新而更新。

iBoot负责加载操作系统内核。IBoot派生两个线程,main线程负责显示的logo并且根据环境变量进行系统引导。另一个uart reader线程用于调试。

正常情况下,在main线程中的其中一个环境变量boot-command环境变量被设置为fsboot,而fsboot()函数被iBoot调用用来挂载IOS系统分区。如果这一步引导失败,就会进入恢复模式引导。

系统加载完成后,就启动相关程序,第一个程序就是launchd,然后由launchd启动守护程序和代理程序,然后是桌面应用SpringBoard

Code signing

https://codertw.com/程式語言/660501/

首先认知几个名词

.certSigningRequest

然后会创造出一个.certSigningRequest文件,就是创建了一对公私钥,.certSigningRequest保存公钥、hash摘要、公钥加密算法。私钥保存在keychain中。

AppleWWDRCA

IOS以及macOS在安装Xcode时,会自动安装AppleWWDRCA.cer中间证书(Intermediate Certificates),也就是IOS开发证书的证书,即根证书(Apple Root Certificate)

IOS App Development

IOS开发证书,在开发阶段进行测试时需要用到的证书,需要上传之前的.certSigningRequest文件;Xcode自动创建

IOS Distribution

ios的发布证书,用于上传到App store测试,同样需要上传certSigningResquest文件

.p12

.p12包含了个人信息、公钥私钥。可以代替.p12代替证书来使用

每次运行程序都会校验程序签名,防止未授权的程序运行。

.ipa

IOS的app安装文件。用于上传Appstore的ipa文件中的Payload→X.app和appstore下载来的Payload→X.app是不同的。下面详细介绍一下有什么不同

.mobileprovision

也就是Provisioning Profile文件,包含可以使用的证书,APPID,可以安装该app设备的UUID,entitement授权管理文件,

.app

用于上传的.app中包含几个重要部分:

Mach-0格式的可执行文件(也就是图中的My-PROD),编写的源码都在其中。

.bundle、.framework、.dylib、.nib等等资源文件

_CodeResources存放签名信息

embedded.mobileprovision文件。对于没有上传的.app文件,包含embedded.mobileprovision,没有entitlements;下载.app文件包含.entitlements文件,没有embedded.mobileprovision

IOS app签名流程

非app store情况

  1. 首先,mac本机创建.certSigningRequest文件,也就生成了一对公私钥,称为公钥L,私钥L是因为在本地生成。根据之前所说的,.certSigningRequest文件保存公钥L。
  2. IOS和macos上保存的appleWWDRCA.cer证书保存中间证书公钥A(图中右上角),私钥A保存在苹果后台。
  3. 开发时上传.certSigningRequest文件就是把公钥L上传到苹果后台。然后用私钥A去签名公钥L,得到证书,再把证书下载安装,和私钥L绑定并保存在钥匙串中
  4. 为了获取Provisioning Profile。所以需要在开发者网站上设置App的bundle ID,UUID,权限,使用的证书(第三步),私钥A会把上述数据都签名,组成provision profile,格式为.mobileprovision。
  5. app安装到设备上之前,都需要把ios项目打包成app文件,前提就是需要设置app的provisioning profile,需要证书对编译后的文件进行签名。
    1. 通过macos的公钥A验证provisioning profile获取信息
    2. 用provision profile信息验证app的bundle ID是否对应,app权限是否对应
    3. 用公钥A验证证书,判断其中一张证书是否在本机中
    4. 通过验证后,会从macos的钥匙串中取出符合条件的最新证书,拿到私钥L
      1. 私钥L对.framework文件、dylib文件、插件、watch目录下的extension进行签名
      2. 把provisioning profile改名为embedded.mobileprovision存放在.app中
      3. 私钥L对整个app签名,得到的签名信息codeResources(防篡改)
    5. 把.app放在payload文件夹里,把payload和其他一些信息文件压缩成.ipa
  6. 当ipa或者app安装在ios设备上时
    1. 先使用ios设备上的ios公钥A对.app里面的embedded.mobileprovision进行验证,获取权限
    2. 使用公钥a再对embedded.mobileprovision中的证书进行验证,取出证书得到公钥L
    3. 使用公钥L对app里所有信息进行验证,如果验证通过,证明合法未篡改。
    4. 获取embedded.monileprovision的UUID列表,判读本机是否可以安装。
    5. 通过则安装

app store的情况

在上传到app store前,已经经过上述验证;

  1. 苹果使用私钥A对app文件需要签名的文件重新签名;
  2. 安装时,IOS设备上公钥A对app所有的签名文件进行验证

Process-level sendboxing

所有的IOS应用程序运行在系统沙箱中,所有程序都使用mobile用户运行。

沙盒目录

<ios 8 — /var/mobile/Application/<app bundle id>

IOS 8 + /var/mobile/Containers/Bundle/Application/<app bundle id>

/var/mobile/Containers/Data/Application/<app bundle id>

IOS 9.3.+ /var/containers/Bundle/Application/<app bundle id>

Date-at-Rest Encryption

默认使用filesystem密钥对文件进行aes加密,密钥在第一次启动生成。

个人文件和keychain通过数据保护接口DataProtection API使用PIN码作为密钥进行本地加密

程序目录结构

.app目录下包含

可执行文件、静态资源文件、.plist、.nib、.bundle、.lproj、.db、.mobileprovision、_CodeSignature

Info.plist

Bundle display name 程序显示名

Bundle versions string,short 版本号

MinimumOSVersion 最低系统版本号

Executable file 可执行程序

IOS工具

动态分析工具:IOS SSL Kill switch、iNalyzer、idb、snoop-it、introspy、Xsecurity

IOS逆向引擎:iSpy、Logify、iRET、cycript

forensic tools:sleuthkit、mac-robber、oxygen forensics suite、mobilyze、paraben device seizure、iphone analyzer、mobile sync browser、iphone backup browser

disassemblers tools:class dump z、IDA pro、hopperApp、otool、strings、nm

ssh访问:cydia安装openssh、使用usbmuxd进行usb端口转发、

砸壳:kjcracks/clutch

LLDB调试

IOS数据安全(仅做摘要)

app的数据存储:

NSUserDefaults

/library/preferences/<Bundle_Identify>.plist

可以使用plutil -convert xml1 file.plist 进行转换

其中会存储一些明文的密码

coredate & sqlite 文件

以db结尾的sqlite数据库文件

.db-wal 数据库操作的缓存

数据库中存储敏感文件

keychains

在系统中保存,没有实际文件,需要使用keychaindumper打开

在越狱的情况下可以获得数据

binarycookies

Cookies.binarycookies是二进制文件,文件结构有个魔术头:字符串:“cook”,二进制为636f6f6b。用于保存程序半永久的cookie,可以用shyingbinarycookieReader.py进行读取

如果涉及AES加密,RNCryptor用于对资源进行AES加解密,建议从服务端进行获取密钥或者采用用户身份信息作为加解密密钥

针对数据库泄漏,可以使用sqlcipher加密数据库,并且sqlcipher无法加密系统生成的数据库,无法加密shm,wal数据库缓存。

mem-check查看是否有内存泄漏


间桐桜のお菓子屋さん