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静态检测

3.9第三方组件安全

案例
2018年5月,盘古实验室对外披露了ZipperDown漏洞。漏洞主要原因是第三方组件,SSZipArchive或ZipArchive,在解压zip压缩包时未对符号链接过滤,导致攻击者利用"../"可以替换应用沙盒内任意资源文件

漏洞形成条件:

  • 应用开发时使用了SSZipArchive或ZipArchive第三方库
  • 应用在收取zip压缩包文件时未使用安全的网络协议
  • 应用使用了JSPatch或类似的热更新机制

修复方案

  • 更新SSZipArchive或ZipArchive第三方库,或开发人员依照漏洞原理自行修复。
  • 所有流量走https并对证书严格、正确地进行校验。
  • 移除热更新机制。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 前言 本文是自己对iOS逆向工程领域所学的一个总结,文中所用的例子仅为学习研究使用。 1. 逆向工程是什么? 从i...
    JimmyCJJ阅读 5,341评论 3 14
  • iOS安全攻与防 本地数据攻与防 https UIWebview 第三方sdk与xcode 反编译与代码混淆 越狱...
    天机否阅读 10,589评论 8 66
  • 前言 最近看了一篇关于逆向实战的文章:来谈谈iOS逆向工程之App脱壳[https://juejin.cn/pos...
    秃头少女_阅读 685评论 0 1
  • 1. HASH算法简介 1.1 HASH是什么? Hash算法(也叫散列算法) Hash,一般翻译做“散列”,也有...
    孔雨露阅读 526评论 0 5
  • 0x00 序 由于IOS是一种闭源的操作系统,源码恐怕也只有几个人见过,其安全性究竟如何我们不得而知,突然想起一段...
    JBright_Lee阅读 3,326评论 1 13