在QCon纽约2016大会上, Trail of Bits 首席执行官兼安全专家 Dan Guido 阐述了如何确保iOS应用安全,包括正确地使用所有iOS安全配置,而且不要忘记,应用可能运行在一部已经越狱的手机上。
如Guido所言,iOS应用安全取决于操作系统层,后者提供了应用程序代码签名和一个沙箱模型。代码签名让追踪每个4KB页的所有者成为可能,而沙箱模型会限制应用访问其他的应用,保护系统文件和资源,这样,即使是恶意应用也很难制造任何麻烦。
据Guido介绍,iOS安全的基础是Secure Enclave,这是一个在制造时分配的单独的设备密匙,在应用层无法访问,也就是说,无法在Secure Enclave外面读取安全密钥。这项技术被用于iOS上所有的加密操作以及Apple Pay和Keychain保护。
按照Guido的说法,开发人员应该遵循三个基本的iOS应用安全原则。
https
来实现。在这种情况下, NSURLConnection
和 NSURLSession
会使用 App Transport Security
(ATS),这可以保证你恰当地使用了TLS 1.2、证书验证等。此外,Guido建议使用 TrustKit
,该框架让你可以轻松地部署绑定到任意iOS或OS X应用的SSL公共密钥,监控绑定验证失败。 使用加密:应该使用 DPAPI 和Keychain加密所有的文件、密码和令牌。Guido用一些时间介绍了DPAPI提供的选项:
NSFileProtectionComplete
、 NSFileProtectionCompleteUnlessOpen
、 NSFileProtectionCompleteUntilFirstAuth
; NSDataWritingProtectionComplete
、 NSDataWritingProtectionCompleteUnlessOpen
、 NSDataWritingProtectionCompleteUntilFirstAuth
。 Stack Overflow上有个 帖子 提供了有关它们的一些值得注意的细节。
NSURLIsExcludedFromBackupKey
密钥向iCloud或iTunes同步。此外,在 UIPasteboard
、URL或者键盘缓存、iOS自动获取的应用后台快照、cookies、NSLog记录等地方,应用通常会留下一定量未加密的潜在敏感数据。所有这些风险都可以通过遵循恰当的策略来避免,例如,重写 applicationDidEnterBackground
,将 hidden
设为 YES
;使用 secureTextEntry
,禁用自动更正,从而规避键盘缓存,等等。
Guido总结道,做完这些基本工作后,就可以考虑消除其他层面的风险,比如自定义URL处理器、 UIWebView
中的XSS、XML解析、SQL注入,等等。
不过,当应用运行在已经越狱的手机上时,所有那些配置就都不是很有效了。越狱是禁用了基本安全机制的漏洞利用程序。它们可以被用来攻击手机,并取得手机的控制权,但有趣的是,用户因为种种原因自愿越狱,比如访问第三方应用商店,替换默认应用,自定义操作系统外观,解锁设备。按照Guido的说法,多达700万iPhone用户已经越狱了他们的手机,也就是说,运行在这些手机上的恶意应用可以绕过所有的设备安全机制,比如 Keyraider 就窃取了225000台设备的Apple ID证件用于应用内购买。
对于运行在已经越狱的手机上的应用,有几种方法可以提升它的安全性。
fork()
系统调用, 等等
。 sysctl
找出谁是应用的属主来实现:如果它不是 launchd
或内核,就可以退出或更改执行。 最后一点,Guido强调了全面实施上述所有配置的重要性,借助一个LLVM的修改版本在编译时修改代码,不依赖个体程序员在必要的地方增加检查。
感兴趣的读者可以在InfoQ上观看完整视频。
查看英文原文: Modern iOS Application Security