iOS Basics
权限分离和沙盒
在iOS中,用户可访问的应用程序和系统核心进程之间存在权限区别。应用程序在**mobile
用户标识下运行,而关键的系统进程则以root
**身份运行。这种分离由沙盒机制增强,该机制对应用程序可以执行的操作施加严格限制。例如,即使应用程序共享相同的用户标识,它们也被禁止访问或修改彼此的数据。
应用程序安装在特定目录(private/var/mobile/Applications/{随机ID}
)中,并且对某些系统区域和功能的读取访问受到限制,例如短信和电话呼叫。对受保护区域的访问会触发用户权限请求弹出窗口。
数据保护
iOS提供了建立在安全区域处理器(SEP)之上的数据保护API,安全区域处理器是专用的协处理器,用于加密操作和密钥管理。SEP通过嵌入其中的设备特定密钥——设备UID来确保数据保护的完整性。
在文件创建时,会生成一个唯一的256位AES加密密钥,用于加密文件内容。然后,将此加密密钥与类别ID一起使用类别密钥加密,并存储在文件的元数据中。解密文件涉及使用系统密钥访问元数据,检索带有类别ID的类别密钥,然后解密文件的唯一加密密钥。
iOS为数据安全定义了四种保护类别,确定何时以及如何访问数据:
完全保护(NSFileProtectionComplete):在使用用户密码解锁设备之前,数据是不可访问的。
除非打开保护(NSFileProtectionCompleteUnlessOpen):允许在设备锁定后访问文件,前提是在设备解锁时已打开文件。
直到首次用户身份验证前保护(NSFileProtectionCompleteUntilFirstUserAuthentication):在首次用户解锁后,数据可访问,即使设备再次锁定也保持可访问。
无保护(NSFileProtectionNone):数据仅由设备UID保护,便于快速远程数据擦除。
除了NSFileProtectionNone
,所有类别的加密都涉及从设备UID和用户密码派生的密钥,确保只能在具有正确密码的设备上解密。从iOS 7开始,默认保护类别为“直到首次用户身份验证前”。
开发人员可以使用FileDP,这是一个用于检查iPhone上文件数据保护类别的工具。
钥匙串
在iOS中,钥匙串充当一个安全的加密容器,用于存储敏感信息,只能被存储它的应用程序或明确授权的应用程序访问。这种加密由iOS生成的唯一密码加固,该密码本身使用AES加密。这种加密过程利用了一个PBKDF2函数,将用户的密码与从设备的UID派生的盐结合起来,这是只有安全区芯片组才能访问的组件。因此,即使用户的密码已知,钥匙串内容在除了最初加密它们的设备之外的任何设备上都是无法访问的。
对钥匙串数据的管理和访问由**securityd
守护程序**处理,基于特定的应用程序权限,如Keychain-access-groups
和application-identifier
。
钥匙串API操作
钥匙串API在苹果的钥匙串服务文档中详细介绍了安全存储管理的基本功能:
SecItemAdd
:向钥匙串添加新项目。SecItemUpdate
:更新钥匙串中的现有项目。SecItemCopyMatching
:从钥匙串检索项目。SecItemDelete
:从钥匙串中删除项目。
对钥匙串密码进行暴力破解涉及直接攻击加密密钥或尝试猜测设备本身的密码,受到安全区强制执行的失败尝试之间延迟的显著阻碍。
配置钥匙串项目数据保护
在创建或更新项目时,使用kSecAttrAccessible
属性设置钥匙串项目的数据保护级别。这些级别,由苹果指定,确定何时以及如何访问钥匙串项目:
kSecAttrAccessibleAlways
:无论设备锁定状态如何,都可以随时访问。kSecAttrAccessibleAlwaysThisDeviceOnly
:始终可访问,但不包含在备份中。kSecAttrAccessibleAfterFirstUnlock
:在重新启动后第一次解锁后可访问。kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
:与上述相同,但不能转移到新设备。kSecAttrAccessibleWhenUnlocked
:只有在设备解锁时才能访问。kSecAttrAccessibleWhenUnlockedThisDeviceOnly
:解锁时可访问,不包含在备份中。kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly
:需要设备密码,不包含在备份中。
**AccessControlFlags
**进一步细化访问方法,允许使用生物识别身份验证或密码。
越狱设备警告
在越狱设备上,钥匙串的保护措施受到损害,构成重大安全风险。
钥匙串数据的持久性
与应用程序卸载时删除的特定于应用程序的数据不同,钥匙串数据在设备上持久存在。这一特性可能使二手设备的新所有者通过简单地重新安装应用程序来访问上一个所有者的应用程序数据。建议开发人员在应用程序安装时或在注销时主动清除钥匙串数据以减轻这一风险。以下是一个Swift代码示例,演示如何在第一次启动应用程序时清除钥匙串数据:
应用程序功能
在应用程序开发领域,沙盒在增强安全性方面发挥着关键作用。该过程确保每个应用程序在其自己独特的主目录中运行,从而防止其访问系统文件或其他应用程序的数据。这些限制的执行是通过沙盒策略来实现的,这些策略是受信任的BSD(MAC)强制访问控制框架的一部分。
开发人员可以为他们的应用程序配置某些功能或权限,例如数据保护或钥匙串共享。这些权限在应用程序安装后立即应用。然而,为了访问某些受保护的资源,应用程序必须在首次尝试时获得用户的明确同意。这是通过使用_目的字符串_或_用途描述字符串_来实现的,这些字符串会显示在权限请求警报中供用户查看。
对于那些可以访问源代码的人,可以通过以下步骤验证Info.plist
文件中包含的权限:
在Xcode中打开项目。
定位并打开
Info.plist
文件。搜索以
"Privacy -"
为前缀的键,可以选择查看原始键/值以获得更清晰的视图。
处理IPA文件时,可以按照以下步骤操作:
解压IPA文件。
在
Payload/<appname>.app/
中找到Info.plist
文件。必要时将文件转换为XML格式,以便更轻松地检查。
例如,Info.plist
文件中的目的字符串可能如下所示:
设备功能
应用程序的 Info.plist
文件指定了帮助App Store筛选设备兼容性的设备功能。这些功能在 UIRequiredDeviceCapabilities
键下定义。例如:
权限
权限 是 iOS 应用开发的另一个关键方面,它们是键值对,授予应用执行某些操作的权限,超出运行时检查。例如,在应用中启用 数据保护 需要在 Xcode 项目中添加特定的权限,然后在应用的权限文件或 IPAs 的嵌入式移动配置文件中反映出来。
参考资料
最后更新于