文章目录
  1. 1. 第三章 加密
    1. 1.1. 3.2 对数据的攻击
  2. 2. 第四章 代码签名 和 内存保护

[TOC]

第三章 加密

###3. 1 数据保护

静态数据保护(data-at-reset): Data Protection API
@数据保护秘钥分级

####3.1.1.如何实现数据保护
1>知道保护是分级别的

文件保护级别
|级别|描述|
|:—- |—–:|
|NSFileProtectionComplete|文件受保护,设备未锁定才可访问|
|NSFileProtectionCompleteUnlessOpen|文件受保护,设备未锁定是可打开,不过即使设备锁定已经打开的文件还可以继续读写|
|NSFileProtectionCompleteUntilFirstUserAuthentication|文件受到保护明知道设备启动且用户第一次输入密码|
|NSFileProtectionNone |文件未收保护,随时可读写(默认)|

实例 1— file`

1
2
3
4
5
6
7
// 创建NSProtectionComplete 属性
NSDictionary *protectionComplete =
[NSDictionary dictionaryWithObject:NSFileProtectionComplete
forKey:NSFileProtectionKey];
// 为<filePath>处的文件或者文件夹设置属性
[[NSFileManager defaultManager] setAttributes:protectionComplete
ofItemAtPath:filePath error:nil];

keychain项保护级别

保护级别 描述
kSecAttrAccessibleWhenUnlocked keychain项受保护,只在设备未锁定时访问
kSecAttrAccessibleAfterFirstUnlock keychain项受保护,用户启动并且一定次输入密码
kSecAttrAccessibleAlways keychain项未受保护,可随意访问(默认)
kSecAttrAccessibleWhenUnlockedThisDeviceOnly keychain项受保护,设备未锁定才可以访问,而且不可转移其他设备,此时使用的设备秘钥加密
kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly keychain项受保护,直到设备启动并且用户第一次输入密码,而且不可以转移到其他设备
kSecAttrAccessibleAlwaysThisDeviceOnly keychain项未受保护,但不能转移到其他设备

实例 2— keychain

1
2
3
4
5
6
7
8
9
10
11
12
NSMutableDictionary *query =
[NSMutableDictionary dictionaryWithObjectsAndKeys:
(id)kSecClassGenericPassword, (id)kSecClass,
@"MyItem", (id)kSecAttrGeneric,
username, (id)kSecAttrAccount,
password, (id)kSecValueData,
[[NSBundle mainBundle] bundleIdentifier], (id)kSecAttrService,
@"", (id)kSecAttrLabel,
@"", (id)kSecAttrDescription,
(id)kSecAttrAccessibleWhenUnlocked, (id)kSecAttrAccessible, nil];

OSStatus result = SecItemAdd((CFDictionaryRef)query, NULL);

3.2 对数据的攻击

####3.2.1 对用户密码的攻击

具体破解细节见文章

破解的keychain
Alt text

从越狱设备中可读取数据.

  1. 如果用户只设置了4位数字密码或者为设置密码,iOS中的数据很容易恢复.
  2. 如果用户设置了强密码,n那么只有保护级别为NSFileProtectionNone的文件和保护级别的kSecAttrAccessibleAlways的keychain项可以访问的.
  3. 目前iOS内置应用只有邮件使用了Data Protection API保护数据

第四章 代码签名 和 内存保护

Mandatory Code Signing强制代码签名
主要讨论 签名证书 授权描述文件(provisioning profile) 已签名代码 特权 以及对攻击者的影响

###4.1强制访问控制

iOS注册两项MAC策略:AMFI和沙盒

####4.1.1 AMFI钩子

AMFI代表AppleMobileFileIntegrity(苹果移动设备文件完整性)

###4.2 授权原理

  • 获取app签名信息
    1
    2
    //,app是ipa解压后的包
    codesign -dvvv test.app

查看到的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Identifier=com.brtc.brtcggyysss
Format=app bundle with Mach-O universal (armv7 arm64)
CodeDirectory v=20200 size=660 flags=0x0(none) hashes=13+5 location=embedded
Hash type=sha256 size=32
CandidateCDHash sha1=b91d7849cb099b4ba8be77df43c65ba8eb9d6b0a
CandidateCDHash sha256=159eaaefc64f2c7cca5f9c8a6367cd3da63f0ffc
Hash choices=sha1,sha256
CDHash=159eaaefc64f2c7cca5f9c8a6367cd3da63f0ffc
Signature size=4716
Authority=iPhone Distribution: Thundersoft America Corporation //签名机构
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA
Signed Time=2017年11月9日 下午5:21:53
Info.plist entries=26
TeamIdentifier=5AKB523DZ4
Sealed Resources version=2 rules=13 files=8
Internal requirements count=1 size=188

文章目录
  1. 1. 第三章 加密
    1. 1.1. 3.2 对数据的攻击
  2. 2. 第四章 代码签名 和 内存保护