MASTG-TECH-0059: 访问应用数据目录
安装应用后,还有更多信息需要探索。让我们简要概述一下 iOS 应用上的应用文件夹结构,以了解哪些数据存储在哪里。下图表示应用程序文件夹结构
在 iOS 上,系统应用程序可以在 /Applications
目录中找到,而用户安装的应用可以在 /private/var/containers/
下找到。但是,仅通过浏览文件系统来找到正确的文件夹并非易事,因为每个应用的目录名称都会分配一个随机的 128 位 UUID(通用唯一标识符)。
为了轻松获取用户安装应用的安装目录信息,您可以按照以下方法操作
连接到设备上的终端,并使用 ipainstaller 安装 iGoat-Swift,如下所示
iPhone:~ root# ipainstaller -l
...
OWASP.iGoat-Swift
iPhone:~ root# ipainstaller -i OWASP.iGoat-Swift
...
Bundle: /private/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67
Application: /private/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app
Data: /private/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693
使用 objection 的命令 env
也会显示该应用的所有目录信息。在 objection for iOS 中描述了如何使用 objection 连接到应用程序。在这种情况下,我们连接到 iGoat-Swift
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # env
Name Path
----------------- -------------------------------------------------------------------------------------------
BundlePath /var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app
CachesDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library/Caches
DocumentDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Documents
LibraryDirectory /var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/Library
如您所见,应用有两个主要位置
- Bundle 目录(
/var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/
)。 - Data 目录(
/var/mobile/Containers/Data/Application/8C8E7EB0-BC9B-435B-8EF8-8F5560EB0693/
)。
这些文件夹包含在应用程序安全评估期间必须仔细检查的信息(例如,分析存储的数据以获取敏感数据时)。
Bundle 目录
- AppName.app
- 这是 Application Bundle,如之前在 IPA 中看到的,它包含基本应用程序数据、静态内容以及应用程序的编译二进制文件。
- 此目录对用户可见,但用户无法写入。
- 此目录中的内容不会备份。
- 此文件夹的内容用于验证代码签名。
Data 目录
- Documents/
- 包含所有用户生成的数据。应用程序最终用户启动此数据的创建。
- 对用户可见,用户可以写入。
- 此目录中的内容会被备份。
- 应用程序可以通过设置
NSURLIsExcludedFromBackupKey
来禁用路径。
- Library/
- 包含所有非用户特定的文件,例如缓存、首选项、cookie 和属性列表 (plist) 配置文件。
- iOS 应用通常使用
Application Support
和Caches
子目录,但应用程序可以创建自定义子目录。
- Library/Caches/
- 包含半持久缓存文件。
- 对用户不可见,用户无法写入。
- 此目录中的内容不会备份。
- 当应用程序未运行且存储空间不足时,操作系统可能会自动删除此目录的文件。
- Library/Application Support/
- 包含运行应用程序所需的持久文件。
- 对用户不可见,用户无法写入。
- 此目录中的内容会被备份。
- 应用程序可以通过设置
NSURLIsExcludedFromBackupKey
来禁用路径。
- Library/Preferences/
- 用于存储即使在应用程序重新启动后也可以持久存在的属性。
- 信息以未加密的方式保存在应用程序沙箱内的名为 [BUNDLE_ID].plist 的 plist 文件中。
- 使用
NSUserDefaults
存储的所有键/值对都可以在此文件中找到。
- tmp/
- 使用此目录写入应用程序启动之间不需要持久存在的临时文件。
- 包含非持久缓存文件。
- 对用户不可见。
- 此目录中的内容不会备份。
- 当应用程序未运行且存储空间不足时,操作系统可能会自动删除此目录的文件。
让我们仔细看看 iGoat-Swift 的 Application Bundle (.app) 目录(位于 Bundle 目录中 /var/containers/Bundle/Application/3ADAF47D-A734-49FA-B274-FBCA66589E67/iGoat-Swift.app
)
OWASP.iGoat-Swift on (iPhone: 11.1.2) [usb] # ls
NSFileType Perms NSFileProtection ... Name
------------ ------- ------------------ ... --------------------------------------
Regular 420 None ... rutger.html
Regular 420 None ... mansi.html
Regular 420 None ... splash.html
Regular 420 None ... about.html
Regular 420 None ... LICENSE.txt
Regular 420 None ... Sentinel.txt
Regular 420 None ... README.txt
Directory 493 None ... URLSchemeAttackExerciseVC.nib
Directory 493 None ... CutAndPasteExerciseVC.nib
Directory 493 None ... RandomKeyGenerationExerciseVC.nib
Directory 493 None ... KeychainExerciseVC.nib
Directory 493 None ... CoreData.momd
Regular 420 None ... archived-expanded-entitlements.xcent
Directory 493 None ... SVProgressHUD.bundle
Directory 493 None ... Base.lproj
Regular 420 None ... Assets.car
Regular 420 None ... PkgInfo
Directory 493 None ... _CodeSignature
Regular 420 None ... [email protected]
Directory 493 None ... Frameworks
Regular 420 None ... embedded.mobileprovision
Regular 420 None ... Credentials.plist
Regular 420 None ... Assets.plist
Regular 420 None ... Info.plist
Regular 493 None ... iGoat-Swift
您也可以从 Grapefruit 中可视化 Bundle 目录,方法是单击Finder -> Bundle
包括 Info.plist
文件
以及 Finder -> Home 中的 Data 目录
有关安全存储敏感数据的更多信息和最佳实践,请参阅 iOS 上的数据存储 章节。