ios 应用安全

一:安全模型
1.沙盒机制
(1)钥匙串API
Ios提供了钥匙串API来储存少量机密信息,开发者可以用来储存密码,加密秘钥以及那些不能被其他应用访问的敏感信息。调用钥匙串API主要通过securityd守护进程来完成,从SQLite数据库中提取数据,我们可以指定应用在什么情况下应用可以读取秘钥,这和数据保护API 类似。
(2)数据保护API
数据保护API利用文件系统加密,钥匙串和用户密码,提供了一个额外的文件保护层。这就限制了一些进程在系统层方面读取文件,这个API最常用的场景就是当设备锁定时确保数据不可用。
在项目中设置启用数据保护如图
在这里插入图片描述

(2)category的潜在问题
category机制可以在运行时给现有的类添加新的方法实现,而且不需要重新编译 。 category可以添加和替换类的方法实现,应用代码的任意位置,不需要重新实现这个类就可以轻松修改它的行为,
危害:
多个 category定义或重写相同的方法,最终只有一方被调用。一些框架的自身方法也是通过category来实现的,如果尝试覆盖他们那么自己项目写的可能调用,也可能不被调用。所以category确实方便,但尽量少用,它们可能会乱码并危害安全。

(3)swizzling
使用方法swizzling可以替换现有类方法和实例方法,swizzling类似category和子类化,但是更加强大也更加方便可以直接把原有的方法替换为新的方法而不是扩展原有的方法 项目中往往使用这项技术实现子类都需要通用的方法,

二:安全性测试
(1)测试设备

  • 仅支持WI-FI的iPad它价格低易于越狱

(2)使用测试设备和模拟器的区别

  • 大小写敏感,如果我们不主动操作的话模拟器不区分大小写敏感
  • 库,默写库模拟器的二进制链接是OSX系统和ios框架有些不同,两者在表现上有差异
  • 内存和性能
  • 摄像头,目前模拟器是不支持的
  • 短信和蜂窝网络:无法再模拟器上打电话和发短信

(3)Xcode构建和设置

  1. 把警告视为错误,大部分警告是由clang产生的,它属于xcode编译器的前端(frontend),值得人认真对待,这样可以减少代码的复杂度,确保语法正确,还可以捕捉
    2.Clang和静态分析
    calng是嵌入式静态分析语言,但有一些重要的特性Xcode是默认关闭的比如针对Strcpy默认关闭
    在这里插入图片描述

3.Address Sanitizer 和动态分析
要启动ASan在debug设置项中添加-fsanitize=address
在这里插入图片描述
对于任何危险的崩溃Asan将会在终端写入附加信息,从而帮我们确定问题的性质和严重性。

4.使用Instruments监控程序

无论是分析他人应用还是增强自己安全性,基于动态跟踪技术的工具Instruments对我们来说都非常有用,可以细粒观察应用程序的动态,这个动态还能来检测网络套字节(socket)的使用率,找出内存分配问题,监控文件系统的交互对于那些储存在本地用用,Instruments能轻易找出那部分敏感信息可能会被泄漏,我经常这么用。

5.用Watchdog检测系统活动
Instruments会执行可以捕获iOS模拟器的大部分动态,但是其他系统服务可能会执行一些文件写入或网络调用它们不会被工具检测,因此比较好的方式是手动检查ios模拟器的文件树,从而更好的理解iOS文件的结构和应用。

三:使用IIdb和其他进行调试

特性:
Xcode内置的调试器界面异常强大,它有命令行,但你可以使用图形用户界面来查看当前的线程状态,注释汇编以及对象细节,并执行交互操作。图形用户界面还包含一个带断点的窗口可以查看,启用或禁用断点。

四:cocoa API的安全怪癖

几乎所有的ios应用程序都会用到iOS的三个网络API,从抽象程度来看,依次是URL加载系统,Foundation NSStream接口和Core Foundaton CFStream 接口。URL加载系统用于获取和处理通过URL访问数据,如网络资源或文件。,Foundation NSStream提供了更底层的网络连接操作方法

1.使用iOS自带的URL加载系统
URL加载系统能够处理应用需要执行的大部分网络任务。常见使用方法是构建一个NSURLRequest对象与URL API进行交互。通过它实例化一个NSURLConnection对象,配合使用。

正确使用传输安全协议

传输安全协议作为取代安全套字节(SSL)的现代规范,对网络来说至关重要,正确使用TLS在数据发送端与已经验证的远程端点会一直保密链接,IOS设备它会拒绝所有不受信任的证书或无效证的端点链接,不过通常来说开发者会因为各种原因禁用TLS/SSL端点,从而把应用程序的流量暴露给攻击者。

各种方式禁用禁用ios的TLS

  • 私有方法 setAllowsAnyHTTPSCertificate(苹果拒绝应用)

注意ios9之后默认情况下系统不可以应用程序非TLS链接,取而带之,开发人员要求在info.plist文件中添加,然而也不能阻止开发者故意禁用TLS

实际上有一个官方的API可以绕过TLS验证
实例化一个NSURLConnection 的委托对象,遵循NSURLConnectionDelegate 协议,改委托对象必须实现- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
方法,这时当前最新的方法,

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust])
    {
        NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
        [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
  
    }
    else
    {
            [[challenge sender] continueWithoutCredentialForAuthenticationChallenge:challenge];
    }
}

这段代码看起来用心良苦,尤其它频繁使用了:保护(protection)证书(credential)授权(authenticationMethod)信任(Trust)而它实际要做的事情就是绕过(TLS)验证,代价就是网络连接被截获。

NSURLConnection 的基本身份验证策略

HTTP本身的身份验证机制并不强大,可以使用NSURLSession或NSURLConnection来实现HTTP的基本身份验证。

challenge.protectionSpace.host

在NSURLConnection中实现TLS认证
客户端身份验证的最佳方法之一使用客户端证书和私有秘钥
实例化一个实willSendRequestForAuthenticationChallenge的委托对象,使用
NSURLAuthenticationMethodClientCertificate 方法进行身份验证,通过检索加载证书和私钥,并创建一个凭证传递给challenge对象,不幸的是cocoa并未提供任何管理证书的API所以必须借助Core Foundation的属性

修改重定向行为
默认情况下NSURLConnection会在遇到http重定向的时候会自动处理,遇到重定向时NSURLConnection将发送一个使用NSURLHTTPRequest类封装的http报头给目标地址,不幸的是这意味着原始域的cookie信息被发送到新的目标地址,一旦攻击者重定向你的应用程序请求道欺骗的地址,就能窃取到用户的信息。同时号包括储存在http报头的敏感数据
我们就修改行为

  • 可以检查是否和网址一样
    5.使用第三方网络API风险
    1.AFNetworking是基于NSOperation和NSHTTPRequest封装的网络库,非常受欢迎,它提供了很多便捷的方法与不同网络类型API交互,同时也支持自定义HTTP网络任务。
    和其他网络框架一样确保TLS安全机制不被禁用是一个至关重要的任务.

.AFNetworking提供了一个特别有用的证书锁定功能,只需要在项目.pch

typedef NS_ENUM(NSUInteger, AFSSLPinningMode) {
AFSSLPinningModeNone,//不执行证书锁定
AFSSLPinningModePublicKey,//锁定证书的公钥
AFSSLPinningModeCertificate,//精确锁定提供的证书
};

第五进程间的通讯
官方为iOS提供了一套进程间通讯机制:URL scheme。
在ios 开发中可以定义一个应用希望响应的URL scheme 。其他应用

定义URL scheme

在项目中info.plist文件自定义URL scheme
在这里插入图片描述

发送和接收 URL/IPC 请求
如果你想要通过URL scheme 发送邮件,先简单创建一个NSURL 对象,其中包含你想调用的字符串类型的地址,接着使用[UIApplication sharedApplication] 获取单利对象。
代码如下:

+ (BOOL)goToAppSettings_cmbc
{
    /*
    if (&UIApplicationOpenSettingsURLString == NULL) {
        return NO;
    }
     */
    NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
    if (!url) {
        return NO;
    }
    
    return [[UIApplication sharedApplication] openURL:url];

}

验证URL和发送者

使用UIActivity共享数据

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值