适用于iOS的OWASP:M1-平台使用不正确,第2部分

此故事描述了iOS开发人员如何应对OWASP Mobile Top 10 2016中的M1类别漏洞。该类别涵盖了平台功能的滥用或平台安全控件的使用失败。 在第2部分中,我们将介绍其他iOS功能,这些功能可能会错误地破坏应用程序的安全性。

缓存的应用程序快照

从iOS 7开始,系统会在您的应用程序进入后台时获取并缓存用户界面的屏幕截图。

屏幕截图以.ktx(iOS9)或.png(iOS10)格式存储在Library / Caches目录中(该目录未通过iTunes或iCloud备份):

(App Folder)/Library/Caches/Snapshots/com.bundle.id.of.your.app/

接口快照映像可以包含敏感数据。 为避免泄漏,请使用图像视图覆盖它,清除文本字段,隐藏标签等。使用applicationWillResignActive(_:) to hide information并使用applicationDidBecomeActive(_:) to restore original view

今日扩展缓存(仅适用于iOS10)

如果您的应用程序具有“今天”扩展名,则它将在/private/var/mobile/Containers/Data/PluginKitPlugin/具有UUID命名的目录

与应用程序的快照不同,Today扩展通过在/Library/Caches/com.bundle.id.of.your.app.with.widget.suffix/Cache.db缓存最后一个相关数据来保留其状态。

自动更正和安全的UITextField

UITextField符合UITextInputTraits协议,该协议具有以下属性:

  1. var autocorrectionType: UITextAutocorrectionType文本对象是否跟踪未知单词并向用户建议更合适的替换候选对象。 为了学习新单词,来自具有自动更正功能的文本对象的所有文本都缓存在路径/User/Library/Keyboard/dynamic-text.dat中
  2. var isSecureTextEntry: Bool判断文本对象是否应禁用文本复制,隐藏正在输入的文本并防止文本被缓存。

为了防止将诸如用户名和密码之类的敏感信息存储在dynamic-text.dat中,如果文本不可见,则将UITextFields设置为isSecureTextEntry状态,如果文本可见,则将autocorrectionType关闭。 副作用是,iOS尝试自动更正其名称不会使您的用户感到困惑。 相信我,那真的很痛。

粘贴板

在某些情况下,用户不希望在应用程序外部访问复制到粘贴板的文本。 iOS10和macOS Sierra甚至可以通过“ 通用剪贴板传递”功能彼此共享剪贴板的内容,这可能会将用户数据泄漏到(可能是受到破坏的)设备。

UIPasteboard类允许创建应用内粘贴板。 要从Handoff中排除纸板,请使用localOnly选项调用setItems(_:options:)方法。

网络缓存策略

通过URLSession加载的任何HTTP和HTTPS请求都将由URLCache处理后者提供内存和磁盘缓存机制。 缓存数据库存储在Library / Caches目录中(该目录未通过iTunes或iCloud备份):

(App Folder)/Library/Caches/com.bundle.id.of.your.app/Cache.db

URLRequest实例通过将缓存策略设置为NSURLRequest.CachePolicy值之一来指定如何使用本地缓存:

  1. useProtocolCachePolicy-默认
  2. reloadIgnoringLocalCacheData —不要使用缓存
  3. returnCacheDataElseLoad-使用缓存(无论过期如何),或者如果不存在缓存的响应,则从网络加载
  4. returnCacheDataDontLoad —脱机模式:使用缓存(无论如何过时),但不从网络加载

默认情况下,所有应用程序都使用共享URLCache.shared ,但是应用程序可以实例化其自己的缓存存储。

如果您使用的是URLSessionDataDelegate,则最简单的方法是在urlSession(dataTask:willCacheResponse:completionHandler:)的末尾使用nil调用完成处理程序urlSession(dataTask:willCacheResponse:completionHandler:)

应用组

当开发者帐户拥有的应用程序和扩展程序配置为应用程序组的一部分时,它们可以共享内容。 一旦配置为应用程序组的一部分,应用程序即可访问以下内容:

  • 共享磁盘上用于存储的容器,只要安装了该组中的至少一个应用程序,该容器便会保留在设备上
  • 共享的首选项
  • 共享钥匙串物品

Apple Developer Portal保证应用程序组ID在整个应用程序生态系统中都是唯一的。

记录中

无论使用系统命令还是第三方框架,均不应将任何敏感信息打印到日志中。 至少可以通过Console.app和Xcode工具访问设备的每个人都可以读取NSLogprint输出,即使没有完全访问文件系统的权限。

Apple System Log(iOS10之前的SDK) :OS C和iOS上提供的低级C API,并且具有手册页。 事实证明,您可以在日志中查询与特定应用相关的消息,也可以只记录整个过程。 由于iOS7应用只能查询自己的日志,因此。

统一日志记录(iOS10 SDK) :所有旧版API(NSLog,asl_log_message,syslog等)都重定向到新系统。 日志数据存储在/var/db/diagnostics/var/db/uuidtext中的二进制.tracev3文件中,可以由Apple的工具打开。

动态字符串,集合,数组假定为私有的,并且如果开发人员未覆盖此行为,则参数的描述将替换为字。 另一个故事中介绍了统一日志记录和活动跟踪的用法。

由于将Apple日志从设备中挤出的明显方法,经常使用第三方库(Crashlytics,Cocoalumberjack)。 他们的输出文件放在应用程序的目录中,因此可以使用取证工具轻松访问。