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情况

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

在上传到app store前,已经经过上述验证;
- 苹果使用私钥A对app文件需要签名的文件重新签名;
- 安装时,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查看是否有内存泄漏
Comments | NOTHING