Android密钥库 - 如果用户密钥设置为该用户,则可以由root用户检索用户密钥吗?

Ido*_*Ido 7 security encryption android android-keystore

从Android 4.3开始,Android就拥有了自己的密钥库,我可以在其中存储密钥并在以后用于加密/解密.

据说这里这里每个键只能由其所有者进行检索,甚至没有根可以得到它.

我的问题是:我不能写一个程序,将我的uid切换到密钥的所有者,检索它,然后用它来解密我不应该访问的数据?

编辑:添加了对密钥库文档的引用.

小智 5

确实,通常密钥只能由存储它的用户检索。

参见例如: http: //nelenkov.blogspot.se/2011/11/using-ics-keychain-api.html

如果设备已获得 root 权限,除非攻击者也拥有密码,否则仍然无法检索密钥。

如果攻击者已获得设备 root 权限并拥有密码或设备已解锁,则游戏结束。


小智 5

距离原始帖子发布已经有一段时间了,因此链接中的内容可能已更改。

一个链接没有提到任何有关 root 的内容。但它确实提到:

如果 Android 操作系统遭到破坏或攻击者可以读取设备的内部存储,则攻击者可能能够使用 Android 设备上任何应用程序的 Android Keystore 密钥,但无法从设备中提取它们

这听起来可能是矛盾的:攻击者如何使用 KeyStore 密钥而不“从设备中提取它们”?这就是 Android KeyStore 的核心用途。

Android KeyStore 的主要特性之一是它通过使用可信执行环境 (TEE) 与操作系统分离。因此,如果攻击者可以破坏操作系统,那么他们就无法破坏密钥库的内容(对于软件支持的密钥库而言并非如此)。KeyStore 安全地存储密钥并(根据操作系统的请求)使用这些密钥加密/解密数据。如果攻击者能够破坏操作系统,那么攻击者还可以请求 KeyStore 解密设备上先前加密的数据。重要的特性是攻击者永远不会真正“看到”密钥本身;这意味着攻击者无法解密设备存储的数据。

第二个链接说:

这提供了一个创建或存储私钥的位置,即使在根或内核受到损害的情况下,也无法从设备导出私钥。

这呼应了我之前所说的。具有 root 权限的恶意程序无法从设备上物理“导出”密钥。但是,这并不意味着程序无法请求 KeyStore 解密设备上存储的数据。

回答你的问题:

难道我不能编写一个程序,将我的 uid 切换为密钥的所有者,检索它,然后使用它来解密我不应该访问的数据吗?

有了root权限,你基本上可以做任何不受硬件限制的事情。SELinux 有一些例外。但除此之外,我看不出 root 不能这样做的原因。这得到了以下答案的支持:

具有 root 访问权限的应用程序可以完全控制系统,并且可以做任何它想做的事情,因为它可以覆盖所有(DAC 类型 *)安全限制。所以简短的回答是“是”。

任何具有root权限的应用程序都可以冒充其他应用程序,并通过代表其他应用程序和系统发出合法请求来解密其敏感数据或由密钥库签名。

密钥存储的目的不是限制对应用程序或应用程序数据的访问,而是保护凭证在使用过程中不被泄​​露。由于密钥存储愿意利用其知识来加密数据或访问敏感应用程序信息,因此正如您在所有三种类型的许多故障中指出的那样,这对于攻击者来说并不是真正的挑战。

使用设备上存储的密钥加密数据并不能保护应用程序数据免受根用户的侵害。应用程序可以使用存储在设备外(例如服务器上或用户密码)的密钥进行加密,从而添加一层数据保护。此方法可以在密钥不存在时提供临时保护,但在某些时候必须将密钥提供给应用程序,然后根用户才能访问它。

最后一点是为了更通用地处理该问题。如果攻击者拥有root,则基本上无法防御。加密不会阻止攻击者,因为攻击者可以直接在设备上找到加密密钥,请求硬件支持的解决方案为其解密数据,或者等待应用程序本身解密数据,然后 root 可以转储进程的内存并访问未加密的数据。