iOS 钥匙串安全性

Posted

技术标签:

【中文标题】iOS 钥匙串安全性【英文标题】:iOS Keychain Security 【发布时间】:2011-04-03 06:18:13 【问题描述】:

我们希望使用 iPhone 上的证书来验证 MS Exchange Sync。我们不确定如何实施安全概念来保护此证书。

例如如果未启用 ScreenLock,是否可以在 iPhone 上获得“完整”钥匙串访问权限? (或使用越狱的 iPhone)。

有人有这方面的链接吗?

【问题讨论】:

这个问题适合security.stackexchange.com 不过,对于我们所有频繁使用 Stack Overflow 的 ios 开发人员来说,这仍然非常重要。也许我们都应该更频繁地访问 security.stackexchange.com? :) 【参考方案1】:

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

http://sit.sit.fraunhofer.de/studies/en/sc-iphone-passwords.pdf http://sit.sit.fraunhofer.de/studies/en/sc-iphone-passwords-faq.pdf

据我所知,iOS 钥匙串使用了两个级别的加密。第一级使用锁屏密码作为加密密钥。第二级使用设备生成并存储在设备上的密钥。

弗劳恩霍夫的研究人员已经找到了绕过第二层的方法。这是“更容易”绕过的级别,因为加密密钥存储在设备上。所以在 iOS4 上,他们的方法只适用于不使用 kSecAttrAccessibleWhenUnlocked 或 kSecAttrAccessibleWhenUnlockedThisDeviceOnly 的钥匙串条目,因为这些条目驻留在内存中,第一级解密 - 即使手机被锁定。

从 iOS 4 开始,具有 kSecAttrAccessibleWhenUnlocked 和 kSecAttrAccessibleWhenUnlockedThisDeviceOnly 的密钥受到额外加密级别的保护 在 iOS 3.x 及更早版本上,所有密钥都可以使用 Fraunhofer 方法解密,无论使用何种可访问性属性 根本没有密码的设备仍然容易受到攻击 密码较弱(少于六位数)的设备仍然容易受到攻击

≈50ms 每次密码尝试; → ≈每秒 20 次尝试; → ≈1.7 年,50% 更改猜测 6 位字母数字的正确密码 以 36 为基数的代码。4 位数字的标准简单代码将 在不到 9 分钟的时间内被暴力破解。基于以下假设 可以绕过 iOS 中错误尝试的计数器,因为它不是 基于硬件的

Apple Inc. WWDC 2010,Core OS,第 209 节“保护应用程序数据”,幻灯片 24

底线: 如果您必须存储敏感数据,最好使用您自己的加密。并且不要将密钥存储在设备上。

编辑: 有许多news articles 引用了弗劳恩霍夫的研究,并让他们的读者放心,除非他们的设备被盗,否则这种攻击只能通过对设备的物理访问来完成。

我有点怀疑。研究人员通过物理访问手机进行测试的事实似乎只是简化问题的一种方式,而不是限制。这是他们对解密钥匙串条目所做的描述:

使用越狱工具后,为了访问命令 shell,我们 运行一个小脚本来访问和解密在 钥匙链。解密是在提供的功能的帮助下完成的 由操作系统本身。

任何使用过 jailbreak.me 的人都知道,越狱不需要对设备进行物理访问。从理论上讲,修改 jailbreak.me 代码并让它自动执行以下操作应该是微不足道的:

    正常越狱(用户只需打开恶意制作的 PDF) 越狱完成后运行 Fraunhofer 的脚本 通过网络将密码发送到攻击者可以读取的位置

因此,再次提醒您注意钥匙串中的内容。

【讨论】:

需要对设备进行物理访问,因为主板上的某处存储了一个密钥,根本无法通过任何方式访问或读取。此密钥对于每个制造的 iOS 设备都是唯一的,这意味着只有特定设备能够解密设备的数据。因此,解密需要物理访问,因为您必须实际指示设备自行解密。以任何其他方式解密设备几乎是不可能的(例如,暴力攻击需要数十亿年)。这不适用于在没有设备密钥的情况下加密的备份 @AbhiBeckert:我认为您误解了物理访问的含义。链接的新闻文章说“需要拥有手机的攻击......”。但事实上,在设备上运行的远程漏洞利用没有理由不能做同样的事情。 远程代码漏洞利用(不太可能在完全修补的手机上)仍然以与被利用应用程序相同的权限运行,并且所有应用程序都在沙箱中运行 - 没有对单个目录之外的文件的读取权限系统专门为其创建(默认为空)。对于获得任意文件系统访问权限的远程代码漏洞利用,需要用户已经根植了他们的手机(整个根植点)或权限提升漏洞利用。再一次,如果你应用补丁,你就很安全了。两个零日攻击是一个延伸。没有越狱,只有 USB 允许完整的文件系统访问。 @AbhiBeckert - 实际上一点也不费力 - 这正是 jailbreak.me 的工作原理。用户所要做的就是访问一个网站来开始越狱过程。用户不必将他们的设备连接到他们的计算机。如果我没记错的话,它实际上确实使用了多个漏洞来完全植根手机。我的观点是,如果访问一个网站可以越狱你的手机,那么恶意网站几乎可以为所欲为。 jailbreak.me for iOS 4 证明了这种攻击的概念。所需要的只是一组新的漏洞利用。 Apple 在事后修补它们的事实并不真正相关。【参考方案2】:

通常,推荐使用钥匙串来存储此类证书。但是,已经发现越狱可以用来绕过钥匙串的安全性(article)。

【讨论】:

我的理解是,只有具有特定保护等级的钥匙串项目才能使用所描述的技术进行访问。这些类是kSecAttrAccessibleAlwayskSecAttrAccessibleAlwaysThisDeviceOnly。详情请见forum.agile.ws/index.php?/topic/…。 是的,那篇文章只是确认您不应该存储具有属性 kSecAttrAccessibleAlways 的敏感项目,请参阅developer.apple.com/library/ios/#DOCUMENTATION/Security/…【参考方案3】:

Franhofer 对 iPhone 钥匙串的安全性做了研究:

http://www.sit.fraunhofer.de/Images/sc_iPhone%20Passwords_tcm501-80443.pdf

【讨论】:

【参考方案4】:

我可以回答你的部分问题,但由于另一部分仍然未知,所以我投票赞成这个问题,因为我也很想知道答案。

我可以回答的部分是:“如果未启用屏幕锁定,应用程序能否获得完整的钥匙串访问权限”。不,每个应用程序在 iphone 上都有自己的钥匙串区域,这意味着应用程序只能访问自己的秘密。这些秘密不会为应用程序本身锁定,因此无法从应用程序本身隐藏钥匙串条目。总结一下:应用可以读取自己的条目,而不能读取其他条目。

不过,我很想知道越狱设备上会发生什么。设备越狱后,所有应用的钥匙串都会暴露吗?

【讨论】:

以上是关于iOS 钥匙串安全性的主要内容,如果未能解决你的问题,请参考以下文章

iOS在钥匙串中存储IAP标志,所以它是安全的

PhoneGap 构建 iOS 钥匙串访问?

将 Pin 码(字符串)值保存到 iOS 钥匙串是不是足够安全?

钥匙串项目的默认 kSecAttrAccessible 值?

iOS APP 密码保存到钥匙串

iOS:新设备或恢复设备上的钥匙串