iOS钥匙串安全

56
我们希望在iPhone上使用证书来进行MS Exchange同步的身份验证。我们不确定安全概念是如何实现来保护这些证书的。
例如,如果没有启用屏幕锁定(或者使用越狱的iPhone),是否可能在iPhone上获得完整的钥匙串访问权限?
有人有相关链接吗?

1
这个问题适合在http://security.stackexchange.com上提问。 - user23743
9
对于经常访问 Stack Overflow 的我们 iOS 开发者来说,这仍然非常相关。也许我们都应该更频繁地访问 security.stackexchange.com? :) - Nicolas Miari
4个回答

50

Fraunhofer对iOS钥匙串安全性的研究:

据我所知,iOS钥匙串使用两个加密级别。第一级别使用锁屏密码作为加密密钥。第二级别使用由设备生成并存储的密钥。弗劳恩霍夫研究人员已经找出如何绕过第二级别加密。这是“更容易”绕过的级别,因为加密密钥存储在设备上。因此,在iOS4上,他们的方法仅适用于不使用kSecAttrAccessibleWhenUnlocked或kSecAttrAccessibleWhenUnlockedThisDeviceOnly的钥匙串条目,因为这些条目在内存中具有第一级别的解密--即使手机被锁定。从iOS 4开始,具有kSecAttrAccessibleWhenUnlocked和kSecAttrAccessibleWhenUnlockedThisDeviceOnly的密钥受到额外的加密保护。在iOS 3.x及更早版本中,无论使用哪种可访问性属性,都可以使用弗劳恩霍夫的方法解密所有密钥。完全没有密码的设备仍然会有漏洞。密码较弱的设备(少于六位数字)仍然会有一定的漏洞。
约50毫秒每个密码尝试; → ≈20次/秒; → ≈1.7年猜测正确的6位字母数字代码(基于36进制)的正确密码,更改50%。标准简单代码的4个数字位将在不到9分钟内被强制执行。假设可以绕过iOS中错误尝试的计数器,因为它不是基于硬件的。

苹果公司WWDC 2010,Core OS,Session 209“保护应用程序数据”,幻灯片24

底线:如果必须存储敏感数据,请使用自己的加密方式。而且不要将密钥存储在设备上。

编辑:有许多新闻文章引用Fraunhofer研究并向读者保证,除非他们的设备被盗,否则不用担心,因为只有物理接触才能进行此攻击。

我有点怀疑。研究人员使用物理访问手机来测试似乎只是简化问题的一种方式,而不是限制性措施。这是他们解密钥匙链条目的描述:

使用越狱工具后,我们可以获得命令行访问权限,并运行一个小脚本来访问和解密在钥匙链中找到的密码。解密是通过操作系统本身提供的函数完成的。

作为使用过jailbreak.me的人都知道,越狱不需要物理接触设备。从理论上讲,修改jailbreak.me代码并使其自动化以下步骤应该是微不足道的:
  1. 像平常一样进行越狱(这只需要用户打开一个恶意制作的PDF文件)
  2. 在越狱完成后运行Fraunhofer的脚本
  3. 将密码通过网络发送到攻击者可以读取的位置
因此,再次强调要谨慎存储关键信息。

1
@AbhiBeckert:我认为你误解了物理访问的含义。链接的新闻文章中说:“攻击需要拥有手机...”。但实际上,没有理由说明在设备上运行的远程攻击不能做同样的事情。 - pepsi
2
@AbhiBeckert - 其实这一点也不难想象——这正是 jailbreak.me 的工作原理。用户只需访问一个网站即可开始越狱过程,无需将设备连接到计算机上。如果我没记错的话,它实际上使用了多个漏洞来完全获取手机的 root 权限。我的观点是,如果访问一个网站就能越狱你的手机,那么一个恶意网站几乎可以为所欲为。 - pepsi
当然可以,但是jailbreak.me在最新版本的iOS上无法使用。每当他们发现一个新的安全漏洞,苹果就会关闭它。看起来JailBreak.me在过去十一个月发布的任何iOS版本上都无法使用。 - Abhi Beckert
1
jailbreak.me针对iOS 4证明了这种攻击方式的概念。只需要一组新的漏洞就可以实现。苹果事后修补这些漏洞并不是很相关。 - pepsi
关于这些发现和未来 iOS(7-8)的发布,有任何新信息吗? - Petar
显示剩余4条评论

4

通常,钥匙串是存储此类证书的推荐方式。然而,已经发现越狱可以用来绕过钥匙串的安全性(文章)。


3
我理解的是,只有具有特定保护等级的钥匙串项目可以使用所描述的技术访问。这些等级包括“kSecAttrAccessibleAlways”和“kSecAttrAccessibleAlwaysThisDeviceOnly”。有关详细信息,请参见http://forum.agile.ws/index.php?/topic/2003-security-question-ios-keychain/page__view__findpost__p__20369。 - Jean Regisser
是的,该文章仅确认您不应使用属性kSecAttrAccessibleAlways存储敏感项目,请参阅http://developer.apple.com/library/ios/#DOCUMENTATION/Security/Reference/keychainservices/Reference/reference.html。 - gheese

3

2
我可以回答你问题的一部分,但由于另一部分还不确定,所以我会投票支持这个问题,因为我也渴望知道答案。
我能回答的部分是:“如果没有启用屏幕锁定,应用程序是否可以获得完整的钥匙串访问权限”。不行,每个应用程序在iPhone上都有自己的钥匙串区域,这意味着应用程序只能访问自己的密钥。对于应用程序本身来说,这些密钥不是被锁定的,因此无法将钥匙串条目从应用程序本身隐藏起来。因此,总结一下:应用程序可以读取自己的条目,但不能读取其他条目。
然而,我感兴趣的是,在越狱设备上会发生什么。一旦设备越狱,所有应用程序的钥匙串是否都会暴露?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接