IOS平台APP安全Checklist

#1. 前言
IOS平台APP安全风险相关的一般性Checklist,保障IOS客户端安全评估的质量与效率。
#2. 数据安全
##2.1 传输安全
该类漏洞的审查场景:APP通过网络发送或接收敏感信息,比如用户口令、用户隐私信息等,或者通过网络下发的数据执行某些敏感操作
**漏洞类型说明:**由于移动设备通常是通过wifi上网,因而面临网络窃听、网络劫持等中间人攻击行为,因此对于敏感信息需要加密传输,并且对接收到的重要数据也需要进行完整性校验。如果APP自身实现了加密及完整性校验的机制,需要确认机制是否存在安全缺陷,比如算法是否足够强壮、实现是否存在逻辑缺陷、密钥管理是否安全等。通常的做法是通过HTTPS来保障网络传输安全,同时APP客户端需要严格校验服务器端证书的合法性;而HTTPS通信要求服务端有CA签发的证书,有些产品线做不到这一点,就会采用自签名证书的方式进行HTTPS请求,这里需要确保校验逻辑正确无法被绕过。下面提供一种使用自签名证书进行HTTPS请求,并正确校验服务端域名和证书合法性的方法:
```objc
static NSString *url = @"https://tcpper.baidu.com/"; 
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; 
NSURLConnection conn =
[[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];
```
其中,delegate:self指定了self对象实现NSURLConnectionDelegate协议,该协议中包含鉴定证书及hostname的回调,开发者可以选择实现

```objc
(void)connectionNSURLConnection *)connection willSendRequestForAuthenticationChallenge
NSURLAuthenticationChallenge *)challenge
{
NSURLProtectionSpace *protectionSpace = [challenge protectionSpace]; SecTrustRef trust = [protectionSpace serverTrust];
SecCertificateRef *pServerCert = SecTrustGetLeafCertificate(trust);
NSURLCredential *credential = [NSURLCredential credentialForTrust:trust];
NSString *path = [[NSBundle mainBundle] pathForResource:@"rootcert" ofType:@"der"];
NSData *data = [NSData dataWithContentsOfFile:path];
SecCertificateRef clientCert = SecCertificateCreateWithData(NULL, CFBridgingRetain(data));
CFDataRef clientCertData;
CFDataRef serverCertData;
clientCertData = SecCertificateCopyData(clientCert);
serverCertData = SecCertificateCopyData(pServerCert);
success = CFEqual(clientCertData, serverCertData);
CFRelease(clientCertData);
CFRelease(serverCertData);
if (success) {
if ([challenge.protectionSpace.host
isEqualToString:@"tcpper.baidu.com"])
{
[[challenge sender] useCredential:credential
forAuthenticationChallenge:challenge];
return;
}
}
[[challenge sender]
cancelAuthenticationChallenge:challenge];
}
```
在上面的代码中,我们分别从challenge和本地取到了Server和Client持有的证书,并对证书进行了比较确定相同,接着又验证了使用该证书签名的host,确定与我们想要的Host相同这才通过了验证。 
**审核点及方法:**黑盒审核方法通过网络分析工具Fiddler等分析APP发送接收的数据包,观察其中是否存在明文传输敏感信息;同时如果有加密传输敏感信息的情况,需要进一步分析加密算法的强壮性及密钥管理机制,比如简单通过base64加密传输。如果是通过HTTPS传输,观察是否可被Fiddler解密,如果可以则代表可进行中间人攻击。白盒审核方法为检查HTTP传输部分的代码,主要关注是否校验服务端证书及校验逻辑正确性是否可被绕过等。使用HTTPS协议未校验服务端证书合法性示范1:[ NSURLRequest setAllowsAnyHTTPSCertificate: YES forHost:[WebserverURL host ]];使用HTTPS协议未校验服务端证书合法性示范2:[self.httpsRequest setValidatesSecureCertificate:NO]

##2.2 存储安全
**漏洞类型说明:**数据存储安全指APP本地数据存储的安全,这里主要指APP应用主目录文件的安全存储,高度敏感的数据禁止明文存储在APP客户端,比如用户密码、BDUSS、ptoken、stoken等,或者经过简单加密也是不允许的,比如base64加密。APP应用主目录文件路径为/private/var/mobile/Application[GUID]/,这里主要关注以下文件夹内容:
1. Documents文件夹:主要是用户存档文件,可以使用iToolsGUI工具查看;
2. Library/Preferences文件夹:主要是偏好设置文件,一般为plist格式,可以使用plist editor pro for windowsGUI工具打开;
3. Library/Caches文件夹:主要保存应用的持久化数据,用户应用升级或应用关闭后的数据保存,一般为sqlite3格式,可以使用SQLite Database BrowserGUI工具或sqlite3命令行工具查看;
4. Library/Cookies文件夹:主要保存Safari浏览器和APP应用的持久化cookie,一般文件名为Cookies.binarycookies,可以使用SecurityLearn提供的python脚本工具BinaryCookieReader读取其内容,参照链接:
[http://www.securitylearn.net/2012/10/27/cookies-binarycookies-reader/](http://www.securitylearn.net/2012/10/27/cookies-binarycookies-reader/)
5. Library/Webkit文件夹:主要保存webkit本地存储文件,不是所有APP都存在该文件夹。 
**审核点及方法:**黑盒审核方法通过上面介绍的工具检查上述文件夹中文件是否明文存储或base64编码存储APP敏感信息或个人隐私内容,比如用户密码等。

##2.3 密钥管理
该类漏洞的审查场景:APP对数据进行了加密存储、传输,但未采用安全的密钥管理方法导致密钥泄露,数据被解密
**漏洞类型说明:**APP在本地数据存储或网络数据传输时,针对敏感的数据都需要进行加密,加密算法分为对称加密和非对称加密,对称加密算法常用的有AES、3DES等,非对称加密算法一般采用RSA等。此时如果未采用安全的密钥管理方案,就容易导致密钥泄露。常见的不安全密钥管理方法包括:将对称密钥或私钥写死在配置文件或代码中,整个APP应用都使用唯一相同的一个对称密钥对数据进行加密解密,如果攻击者逆向分析出密钥,就可以对整个应用的数据进行解密,导致敏感信息泄露;通过网络明文传输对称密钥或私钥,攻击者通过网络窃听获取密钥,同时可以对后续传输的加密数据进行解密,从而导致敏感信息泄露。 **审核点及方法:**黑盒审核方法通过Introspy等动态分析工具观察运行时加解密或创建key等信息,观察APP所使用的加解密算法及密钥,如果对称密钥一直固定,就很有可能写死在配置文件或代码中,此时可进一步搜索代码或配置文件,分析密钥生成机制。同时结合Fiddler等网络分析工具分析传输的数据,观察是否存在明文传输密钥等情况。
#3 信息泄露
##3.1 NSLog信息泄露
该类漏洞的审查场景:日志记录中泄露了敏感信息
**漏洞类型说明:**在IOS开发中,RD经常需要实时输出一些运行数据来判断程序是否正确的运行,一般就采用NSLog输出,但是输出的数据可能会暴露APP里面的保密数据,所以发布Release版本时需要把这些输出全部屏蔽掉,不然就会造成敏感信息泄露。将NSLog输出屏蔽掉的方法,可以将所有NSLog语句注释掉,但这样比较笨拙耗时,比较好的解决办法是在项目的-Prefix.pch文件中加入一段代码,定义NSLog只在Debug模式下输出,Release版本下不输出,代码类似:
```objc
#ifndef _*OPTIMIZE*
_#define NSLog(…) NSLog(_*VA_ARGS*_)
#else
#define NSLog(…){}
#endifRelease模式通常会定义_*OPTIMIZE*_,
而debug模式下则不会,编译器通过宏判断是否编译输出NSLog信息,
或者通过判断是否已经定义DEBUG宏,来决定编译器是否输出NSLog信息:
#ifdef DEBUG#define NSLog(…) NSLog(_*VA_ARGS*_)#else#define NSLog(…){}#endif 
```
**审核点及方法:**白盒审核方法通过查看源代码中-Prefix.pch文件是否定义以上宏定义来决定编译器是否编译输出NSLog日志信息,如果没有定义,则通过查看源代码看代码文件中是否存在未注释掉的NSLog语句。

##3.2 Background Snapshot
该类漏洞的审查场景:APP进入后台缓存了当前UI截图
**漏洞类型说明:**IOS的后台任务处理比较独特,在APP进入后台时,系统会自动截取当前APP显示的UI的一张截图缓存到Library/Caches/Snapshots目录下,以便在APP回到前台时可以快速的显示界面,因此对于一些显示敏感信息的UI,Snapshot机制就会造成信息泄露,
```objc
如果想阻止IOS的snapshot机制,可以使用类似如下代码:
(void)applicationDidEnterBackground(悲伤)UIApplication *)application
{
if (appHasPasscodeOn){
UIImageView *splashView = [[UIImageView alloc]
initWithFrame:CGRectMake(0,0, 320, 480)];
splashView.image = [UIImage imageNamed:@"Default.png"];
[window addSubview:splashView];
[splashView release];
}
}
```
**审核点及方法:**黑盒审核方法通过iFunBox等工具查看应用的Library/Caches/Snapshots目录下是否缓存了应用进入后台时的UI的截图,以及当前缓存的截图是否存在敏感信息泄露等问题。
#4. IPC安全
##4.1 URLScheme
该类漏洞的审查场景:不同APP之间通过URLScheme进行交互**漏洞类型说明:**IOS使用沙箱机制来限制应用程序的行为,通过该种限制可以控制恶意软件的行为,也减轻了行为良好的APP被突破后的危害;在sandbox中运行的APP在访问资源时,会经过内核的审查,只有在通过检查的情况下APP才能访问请求的资源。IOS中的APP是相互隔离的,有时候为了实现不同APP之间简单的交互需要使用URLScheme,使用URLScheme在一定程度上打破了APP之间的隔离,如果处理不当就会出现URLScheme劫持和恶意注入数据的风险。经过试验发现后安装APP的URLScheme优先,因此后安装的APP通过注册相应的URLSchemes就可以劫持其他APP之间交互传输的数据,如下所示:
Source APP:
![](https://thumbnail0.baidupcs.com/thumbnail/d0772d93e252a5bed5dd1dab2ff32549?fid=1962957030-250528-81532063416250&time=1471518000&rt=pr&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-UHx3%2f2Eol6eQEvYHA1jB18bVV2k%3d&expires=8h&chkbd=0&chkv=0&dp-logid=5353378216595906670&dp-callid=0&size=c10000_u10000&quality=90)
Target APP:
![](https://thumbnail0.baidupcs.com/thumbnail/9cd563251f9b3ed16ee0e151b5c3c4a2?fid=1962957030-250528-307917286063562&time=1471518000&rt=pr&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-xVsDVQTJ4y6oN1X9DBGEHxfwNBU%3d&expires=8h&chkbd=0&chkv=0&dp-logid=5353378216595906670&dp-callid=0&size=c10000_u10000&quality=90)
![](https://thumbnail0.baidupcs.com/thumbnail/2cda710c74933669ed230b9670ac7cfc?fid=1962957030-250528-820419784013259&time=1471518000&rt=pr&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-8iQXdkx%2bvIUFRoVl%2f0y9TNPpdpE%3d&expires=8h&chkbd=0&chkv=0&dp-logid=5353417911269716952&dp-callid=0&size=c10000_u10000&quality=90)
劫持结果:
![](https://thumbnail0.baidupcs.com/thumbnail/be1ebb55a5874c56c301fe48d7be3a36?fid=1962957030-250528-697658547206349&time=1471518000&rt=pr&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-kY4Gr87VmJA5Xaz40q3smZFmvTA%3d&expires=8h&chkbd=0&chkv=0&dp-logid=5353417911269716952&dp-callid=0&size=c10000_u10000&quality=90)
同时如果URLScheme的目的端对源端输入的数据校验不充分,目的端根据源端所提交的数据进行相关的逻辑处理,则可能会由于注入恶意数据导致非预期的缓冲区溢出或逻辑缺陷等,如下所示:
![](https://thumbnail0.baidupcs.com/thumbnail/c13cafe1de270162abd7ef86be2611db?fid=1962957030-250528-720657742127005&time=1471518000&rt=pr&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-iNsL4oOx8pWO%2bIU51LxEqssIW6w%3d&expires=8h&chkbd=0&chkv=0&dp-logid=5353417911269716952&dp-callid=0&size=c10000_u10000&quality=90)
验证URLScheme的输入可以放在下面这个AppDelegate中:
```objc
– (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
//Validate input from the urlreturn YES;

```
**审核点及方法:**白盒审计方法先通过iFunbox工具等在应用主目录下查看Info.plist文件,找到key为CFBundleURLTypes这个键值,确定应用注册的所有URLScheme,如下所示:
![](https://thumbnail0.baidupcs.com/thumbnail/97a8f545ba0dfc970470a1070368afcc?fid=1962957030-250528-1015475913625221&time=1471518000&rt=pr&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-JvvDyhTej%2fZ1vNw84Ss3cVZJVrg%3d&expires=8h&chkbd=0&chkv=0&dp-logid=5353417911269716952&dp-callid=0&size=c10000_u10000&quality=90)
然后在源代码中针对具体的每一个URLScheme的实现逻辑进行审计,看是否可以恶意注入数据或者是否传输了敏感信息。
##4.2 Pasteboard
该类漏洞的审查场景:APP使用剪贴板实现应用程序之中或应用程序之间数据的共享
**漏洞类型说明:**在IOS中,可以使用剪贴板实现应用程序之中及应用程序之间数据的共享,剪贴板主要分为系统级和应用程序级,系统级使用UIPasteboardNameGeneral和UIPasteboardNameFind创建,当应用程序关闭或卸载时,数据都不会丢失。应用程序级通过pasteboardWithName:create创建,可以让数据在应用程序关闭之后仍然保存在剪贴板中,但是应用程序卸载之后数据就会丢失。APP进入后台或者退出的时候如果未清除剪贴板,并且APP通过剪贴板传输敏感信息,则导致敏感信息泄露风险;APP进入后台清除剪贴板内容可以放在AppDelegate中,如果你使用自定义的剪贴板,用自定义的剪贴板替换[UIPasteboard generalPasteboard]即可。
```objc
(void)applicationDidEnterBackground:(UIApplication *)application{
// If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
[UIPasteboard generalPasteboard].items = nil;
}
```

**审核点及方法:**黑盒审计方法通过Introspy动态分析工具观察APP是否使用pasteboard传输数据及传输数据的重要性;白盒审计方法就是通过上面介绍的pasteboard创建函数定位到具体pasteboard,然后跟踪分析代码。

#5 UIWebView
该类漏洞的审查场景:APP使用UIWebView展示来自URL的内容**漏洞类型说明:**UIWebView使用webkit内核,并且支持javascript,目前没有公开的API可以用来禁用UIWebView中的javascript,因此如果用户控制的任何输入被用作UIWebView的内容,它就可以被操纵在运行时在UIWebView中执行javascript代码,如下所示:
![](https://thumbnail0.baidupcs.com/thumbnail/02de037d0287ab3383ac956656de0bfa?fid=1962957030-250528-188911265477837&time=1471518000&rt=pr&sign=FDTAER-DCb740ccc5511e5e8fedcff06b081203-sfkHywU2FzHjpX10xfodwXsfF9E%3d&expires=8h&chkbd=0&chkv=0&dp-logid=5353417911269716952&dp-callid=0&size=c10000_u10000&quality=90)
UIWebView的内容只要依赖了用户的输入,就可能会出现传统web安全中出现的安全问题,比如XSS、URL跳转、CSRF等,这些都属于web安全的延伸。

**审核点及方法:**白盒审计方法通过查找代码定位到具体的UIWebView,看UIWebView的内容是否存在依赖于用户的输入,出现的传统web安全风险的检测方法同web端检测思路是相同的。黑盒审计方法就是针对所有的用户输入点,提交相应payload查看或对比程序的响应即可判断是否存在相应安全风险。

时间: 2024-08-05 11:17:01

IOS平台APP安全Checklist的相关文章

为啥大多数创业者在APP开发时更青睐iOS平台

现在是移动互联网的时代,APP创业已属常见,那么在APP开发的时候,为何不首先选择开发Android版APP,而选择iOS版,这其中的原因在哪? 1.APP开发难度与时间成本 打造并发布一款 Android APP 所花费的成本是在iOS APP的3到4倍.这是由多种原因造成的:复杂的开发工具.繁琐的 API.难以捉摸的高级性能以及大量 QA 问题带来的开发时间碎片化.根据经验来看,一个iOS工程师能够完成的开发工作如果转移到 Android 平台上,你就需要用两个Android工程师来完成,或

学习笔记:APP切图那点事儿–详细介绍android和ios平台

学习笔记:APP切图那点事儿–详细介绍android和ios平台 转载自:http://www.woofeng.cn/articles/168.html   版权归原作者所有 作者:亚茹有李 原文地址:http://blog.boocss.com/app-android-ios/ 一.android版 在做android版本设计的时候,尺寸有很多种,这时我们要以一种尺寸为基准,那这个基准尺寸是480px*800px,设计图完成之后就开始切图了 需要注意的: A:android主要有3种屏,即:

iOS运营级B2B服务平台App、自定义图标库、个人中心页面、识别身份证Demo、瀑布流等源码

iOS精选源码 简单的个人中心页面-自定义导航栏并予以渐变动画 一个近乎完整的可识别中国身份证信息的Demo 可自动快速... iOS可自定义图表库 - PNChart 开源一款曾是运营级的B2B服务平台APP<云采> 使用ffmpeg解码最简iOS播放器 注释得非常清楚的瀑布流,和自己的一些想法 iOS日志框架学习分享 在iOS App中录制MP3和AMR:ZWAudioRecordTool 一套应用于swift项目的空白页组件EmptyPage 2.0 扫雷简单实现 iOS优质博客 iOS

iOS平台内存使用原则

2 iOS平台内存使用原则 2.1 对象的所有权与销毁 2.1.1 谁创建,谁释放: 如果是以alloc,new或者copy,mutableCopy创建的对象,则必须调用release或者autorelease方法释放内存: 如果没有释放,则导致内存泄漏! 2.1.2 谁retain,谁释放: 如果对一个对象发送 retain消息,其引用计数会+1,则使用完必须发送release或者autorelease方法释放内存或恢复引用计数: 如果没有释放,则导致内存泄漏! 2.1.3 没创建且没reta

【如何快速的开发一个完整的iOS直播app】(原理篇)

一.个人见解(直播难与易) 直播难:个人认为要想把直播从零开始做出来,绝对是牛逼中的牛逼,大牛中的大牛,因为直播中运用到的技术难点非常之多,视频/音频处理,图形处理,视频/音频压缩,CDN分发,即时通讯等技术,每一个技术都够你学几年的. 直播易:已经有各个领域的大牛,封装好了许多牛逼的框架,我们只需要用别人写好的框架,就能快速的搭建一个直播app,也就是传说中的站在大牛肩膀上编程. 二.了解直播 热门直播产品 映客,斗鱼,熊猫,虎牙,花椒等等 直播效果图 直播效果.jpeg 1.一个完整直播ap

【如何快速的开发一个完整的iOS直播app】(播放篇)

前言 在看这篇之前,如果您还不了解直播原理,请查看上篇文章如何快速的开发一个完整的iOS直播app(原理篇) 开发一款直播app,集成ijkplayer成功后,就算完成直播功能一半的工程了,只要有拉流url,就能播放直播啦 本篇主要讲解的是直播app中,需要用到的一个很重要的开源框架ijkplayer,然后集成这个框架可能对大多数初学者还是比较有难度的,所以本篇主要教你解决集成[ijkplayer]遇见的各种坑. 很多文章,可能讲解的是如何做,我比较注重讲解为什么这样做,大家有什么不明白,还可以

【转】iOS平台的应用程序调试与分析

转自:看雪学院的文章 iOS平台的应用程序调试与分析 作者:zhuliang转载请保证文章完整并注明来自看雪或cd-team 本文阐述如何在iOS平台上对应用程序进行调试与分析,旨在指导新手分析iOS程序,高手请无视.内容包括软件硬件的准备.代码的解密.符号信息的获取.用gdb调试等,最后以京东LeBook为例子进行演示.1.为什么要进行调试与分析研究iOS程序有很多用处,比如:找bug或者漏洞,想知道某程序有没有漏洞或者bug.某程序能实现某功能,我想知道如何实现,如ios6发短信功能,还有比

iOS平台快速发布HT for Web拓扑图应用

iOS平台一直是封闭的生态圈,iOS开发者要缴纳年费加入开发者计划才可进行iOS平台的APP开发测试,所开发的APP需要上传到App Store经过苹果审核以后才可对外发布.如果要开发企业内部应用,则要缴纳更高的费用购买企业账户才可以. 对于现在火如荼的HTML5应用,我们可以借助PhoneGap对其打包,然后像原生APP一样发布它们:或者要求用户直接通过浏览器访问.前一种方式的优点是用户体验好,用户可以像使用原生APP那样使用它们,缺点是发布很繁琐,而且要等待苹果审核.后一种方式则完全不用考虑

iOS平台快速发布HTML5拓扑应用

iOS平台一直是封闭的生态圈,iOS开发者要缴纳年费加入开发者计划才可进行iOS平台的APP开发测试,所开发的APP需要上传到App Store经过苹果审核以后才可对外发布.如果要开发企业内部应用,则要缴纳更高的费用购买企业账户才可以. 对于现在火如荼的HTML5应用,我们可以借助PhoneGap对其打包,然后像原生APP一样发布它们:或者要求用户直接通过浏览器访问.前一种方式的优点是用户体验好,用户可以像使用原生APP那样使用它们,缺点是发布很繁琐,而且要等待苹果审核.后一种方式则完全不用考虑