一、iOS逆向工程基础
- 苹果开发者计划
- 脱壳
- 重签名
- 日志打印
- 本地文件
- 网络通信
- Hook
1.苹果开发者计划
- 只有加入苹果开发者计划,才能对应用进行合法签名。
- Debug版本和Release版本。
- 开发者调式设备。
- iOS应用分为AppStore应用和企业应用。
- developer.apple.com
2.脱壳
- AppStore上架应用,都被苹果加了一层壳。
- 在越狱设备中运行,dump内存数据整合成未加密的可执 行文件。
- Clutch,DumpDecrypted,MonkeyDev
- Clutch -d com.company.app
3.重签名
- 代码签名机制
- 使用自己的开发者证书重新对修改后的应用进行签名,使之可 以运行在自己的调试设备中,以便后续动态分析。
- codesign,iOS App Signer,MonkeyDev
4.连接设备
- 可以通过USB、wifi连接mac和iOS设备。
- usbmuxd
- python tcprelay.py -t 22:2345 • ssh root@localhost -p 2345
5.日志打印
- 对应用的日志输出实时监控。
- idevicesyslog,Console,Xcode
6.本地文件
- ipa包资源文件
- data目录数据文件(用户数据、各种缓存数据)
- keychain数据
- ipa包可以直接解压
- 数据文件ssh到越狱设备查看
- keychaindumper
7.网络通信
- 监听、截获设备的网络通信数据。
- Burp Suite,Charles,WireShark
- 导入证书
- bypass证书验证 SSL Kill Switch
8.静态分析
- IDA Pro,Hopper,Ghidra,class-dump,strings
- 提取字符串、类、函数方法、导入函数等信息 • class-dump -s -H -S target -o outputDir
9.Hook
- 对关键函数方法进行Hook,打印关键信息或改变函数行为。
- Theos,MonkeyDev
- Logos语法
@hook Class
- (void)targetMethod {
NSLog(@”Hooked”);
@orig;
}
@end
二、iOS应用安全编码
- iOS系统安全机制简介
- iOS应用常见漏洞及问题点
- 如何编写安全的iOS应用
1.iOS系统安全机制简介
- 代码签名——防止未经授权的程序在设备上运行
- 沙盒机制——应用只能访问数据自己的数据
- KeyChain——安全存储本地数据
- 隐私信息权限控制——防止应用未授权访问用户隐私信息
2.iOS应用常见漏洞及问题点
- 本地存储问题——敏感信息不恰当地存储造成信息泄露
- 网络通信问题——通信方式、报文数据处理不当造成信息泄露
- 源码相关问题——敏感代码未混淆加密造成信息泄露
- 业务漏洞——权限控制不当导致攻击者有能力进行未授权操作
2.1本地存储文件一般可以在以下路径找到:
配置文件 /var/mobile/Containers/Data/Application/[UUID]/Library/Preference
缓存 /var/mobile/Containers/Data/Application/[UUID]/Library/Caches
数据库 /var/mobile/Containers/Data/Application/[UUID]/Documents
测试数据&证书数据 /var/mobile/Containers/Bundle/Application/[UUID]/APP.app
2.1.1本地存储
漏洞案例
使用NSUserDefaults明文存储用户设定的手势密码。利用工具提取设备中应用对应的用户配置plist文件后,即可查看相应字段,找到密码。
建议方案
对敏感信息加密后使用KeyChain存储
2.2网络通信
未使用https且明文通信
http通信内容可以被轻松截获、篡改。如果报文内容为明文,可导致信息泄露。
https服务端证书未认证
通信内容可以被截获、篡改,同样形成中间人攻击。
敏感参数弱加密
一旦被攻击,敏感信息容易被破解、泄漏。
未进行加签/验签
一旦被攻击,报文数据被篡改,如订单号、数量等。
外发不明数据
有问题的IDE或不明第三方SDK导致,敏感信息可能被泄漏。
2.2.1网络通信
漏洞案例
使用网络流量抓包工具监听设备的网络流量,可以看到未做全网络通信防护措施的应用通信明文数据。
建议方案
应用内全局使用https进行网络通信,并且对服务端证书做强校验,同时对报文中的敏感信息进行加密,对通信报文整体进行加签、验签,应用不私自接入第三方SDK或模块。
2.3源码相关问题
日志打印
通过日志打印的调试信息,攻击者可以还原业务逻辑。
关键源码未混淆
攻击者可以逆向应用,还原关键业务逻辑。
敏感字符串未加密
AppSecret、加解密使用的密钥等敏感字符串未加密造成信息泄露。
未检测设备运行环境
无法及时发现注入、调试等攻击行为。
2.3.1源码相关问题
漏洞案例
不论越狱与否,都可以通过工具查看实时日志打印。某应用打印了网络请求,可以看到报文中的明文数据。
建议方案
应用在开发完成上传App Store审核前,可以通过宏定义方式去掉Release版本中所有日志打印。
2.3.2源码相关问题
漏洞案例
通过工具导出了所有可执行文件中的方法名,通过搜索可以很容易地发现诸如loginWithPassword的关键方法名。
建议方案
对关键方法名使用宏定义进行随机数字符串替换,增加攻击难度和成本。
2.4业务漏洞
越权
攻击者获得了本不属于他的权限,可以查看、修改信息。
扫号、爆破
使用工具批量发送特定网络请求探测用户信息或密码信息。
认证绕过
通过修改网络通信数据包等操作修改认证判定结果。
短信漏洞
未对短信接口做限制造成短信轰炸或短信内容任意编辑。
重放
数据包未做签名、时间戳等机制,造成可以重放网络请求。
3.如何编写安全的iOS应用
原则:敏感信息的保护
避免一切可能造成敏感信息泄漏事件的发生。
WHY:为什么要保护敏感信息
避免上述漏洞和问题的发生,保护公司和客户的财产、信息安全。
WHAT:什么是敏感信息
业务信息、用户身份、调试信息等一切与公司、用户、程序行为相关的信息。
HOW:如何保护敏感信息
遵循敏感信息存取原则(迪米特法则),加密存储,按需提取。
3.1剪贴板
- 尽量避免使用系统剪贴板,建议使用自定义剪贴板
- 使用完成后尽快删除
- 禁用敏感信息TextField的复制/剪切
3.2截屏缓存
folder/to/AppData/Library/Caches/Snapshots/
- 监听应用退出前台事件
- 对当前页面进行截屏
- 进行模糊处理
- 覆盖到最上层
3.3键盘缓存
- 系统键盘默认会对非密码非数字进行缓存。
- 建议调整对应TextField的属性,关闭自动修正选项。
内存中的实例变量
- 不要将密码明文存放在实例变量中。
- 敏感数据及时加密和摘除。
3.4 网络请求缓存
设置网络请求缓存策略,不在本地缓存网络请求报文
NSURLRequestReloadIgnoringLocalCacheData
NSURLRequestReloadIgnoringCacheData
connection willCacheResponse{
return nil;
}
3.5网络通信安全
- 网络通信报文数据需要加密和加签。
- https服务端证书需要认证。
3.6使用NSURLConnection证书认证
connection didFailWithError:(NSError *)error;
该方法为连接失败的回调,若证书验证失败,会触发该方法。
connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace;
当收到HTTPS服务端认证的challenge时的回调方法,在该方法中实现对服务端证书的认证。
-(BOOL)shouldTrustProtectionSpace:(NSURLProtectionSpace *)protectionSpace;
证书认证的具体实现,非协议方法,须自行实现。
3.7AFNetworking证书认证
[AFHTTPSessionManager manager].securityPolicy = [self customSecurityPolicyWithCertName:@"myCer2020"];
设定安全策略未读取指定证书文件进行证书验证
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
进行SSL证书认证
3.8开发环境安全
XcodeGhost检查方法
- 开发者自查
- /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/路径下有无Library文件夹
- Target->Build Setting->Search Paths->Framework Search Paths 有无可疑Framework
- 在Gatekeeer打开的情况下执行spctl --assess --verbose /Applications/Xcode.app
2.ipa静态检测
- strings [executable file] grep "http://init.icloud-analysis.com"
3.9第三方组件安全
案例
2018年5月,盘古实验室对外披露了ZipperDown漏洞。漏洞主要原因是第三方组件,SSZipArchive或ZipArchive,在解压zip压缩包时未对符号链接过滤,导致攻击者利用"../"可以替换应用沙盒内任意资源文件
漏洞形成条件:
- 应用开发时使用了SSZipArchive或ZipArchive第三方库
- 应用在收取zip压缩包文件时未使用安全的网络协议
- 应用使用了JSPatch或类似的热更新机制
修复方案
- 更新SSZipArchive或ZipArchive第三方库,或开发人员依照漏洞原理自行修复。
- 所有流量走https并对证书严格、正确地进行校验。
- 移除热更新机制。