ios逆向与安全攻防

一、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.网络通信

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检查方法

  1. 开发者自查
  • /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并对证书严格、正确地进行校验。
  • 移除热更新机制。

你可能感兴趣的:(逆向工程,ios)