跳过内容

MASTG-TEST-0058: 测试备份中的敏感数据

此测试即将更新

此测试目前可使用,但将作为新的 OWASP MASTG v2 指南 的一部分进行全面修订。

请提交 PR 来帮助我们:MASTG v1->v2 MASTG-TEST-0058:敏感数据备份测试 (ios)

发送反馈

概述

静态分析

安装了移动应用程序的设备的备份将包括 应用程序私有目录中的所有子目录(Library/Caches/ 除外)和文件。

因此,请避免将敏感数据以明文形式存储在应用程序私有目录或子目录中的任何文件或文件夹中。

虽然 Documents/Library/Application Support/ 中的所有文件默认情况下始终会被备份,但您可以通过使用 NSURL setResourceValue:forKey:error: 方法和 NSURLIsExcludedFromBackupKey将文件从备份中排除

您可以使用 NSURLIsExcludedFromBackupKeyCFURLIsExcludedFromBackupKey 文件系统属性将文件和目录从备份中排除。需要排除许多文件的应用程序可以通过创建自己的子目录并标记该目录为排除来做到这一点。应用程序应创建自己的排除目录,而不是排除系统定义的目录。

这两种文件系统属性都优于直接设置扩展属性的已弃用方法。所有在 iOS 5.1 及更高版本上运行的应用程序都应使用这些属性从备份中排除数据。

以下是 在 iOS 5.1 及更高版本上从备份中排除文件的 Objective-C 示例代码

- (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *) filePathString
{
    NSURL* URL= [NSURL fileURLWithPath: filePathString];
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

    NSError *error = nil;
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
                                  forKey: NSURLIsExcludedFromBackupKey error: &error];
    if(!success){
        NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
    }
    return success;
}

以下是在 iOS 5.1 及更高版本上从备份中排除文件的 Swift 示例代码,有关更多信息,请参阅 Swift 从 iCloud 备份中排除文件

enum ExcludeFileError: Error {
    case fileDoesNotExist
    case error(String)
}

func excludeFileFromBackup(filePath: URL) -> Result<Bool, ExcludeFileError> {
    var file = filePath

    do {
        if FileManager.default.fileExists(atPath: file.path) {
            var res = URLResourceValues()
            res.isExcludedFromBackup = true
            try file.setResourceValues(res)
            return .success(true)

        } else {
            return .failure(.fileDoesNotExist)
        }
    } catch {
        return .failure(.error("Error excluding \(file.lastPathComponent) from backup \(error)"))
    }
}

动态分析

为了测试备份,您显然需要先创建一个备份。创建 iOS 设备备份的最常见方法是使用 iTunes,它适用于 Windows、Linux 和 macOS(直到 macOS Mojave)。通过 iTunes 创建备份时,您始终只能备份整个设备,而不能只选择单个应用程序。确保 iTunes 中的“加密本地备份”选项未设置,以便备份以明文形式存储在您的硬盘驱动器上。

从 macOS Catalina 开始,iTunes 不再可用。包括更新、备份和恢复在内的 iOS 设备管理已移至 Finder 应用程序。该方法与上述描述相同。

备份 iOS 设备后,您需要检索备份的文件路径,该路径在每个操作系统上的位置都不同。Apple 的官方文档将帮助您查找 iPhone、iPad 和 iPod touch 的备份

当您想要导航到 High Sierra 之前的备份文件夹时,您可以轻松地执行此操作。从 macOS Mojave 开始,您将收到以下错误(即使作为 root 用户)

$ pwd
/Users/foo/Library/Application Support
$ ls -alh MobileSync
ls: MobileSync: Operation not permitted

这不是备份文件夹的权限问题,而是 macOS Mojave 中的一项新功能。您可以通过按照 OSXDaily 上的解释授予终端应用程序完全磁盘访问权限来解决此问题。

在访问目录之前,您需要选择包含您设备 UDID 的文件夹。请查看 “获取 iOS 设备的 UDID”部分,了解如何检索它。

一旦您知道 UDID,您就可以导航到此目录中,您将找到整个设备的完整备份,其中包括图片、应用程序数据以及可能已存储在设备上的任何内容。

查看备份文件和文件夹中的数据。目录和文件名的结构是混淆的,看起来像这样

$ pwd
/Users/foo/Library/Application Support/MobileSync/Backup/416f01bd160932d2bf2f95f1f142bc29b1c62dcb/00
$ ls | head -n 3
000127b08898088a8a169b4f63b363a3adcf389b
0001fe89d0d03708d414b36bc6f706f567b08d66
000200a644d7d2c56eec5b89c1921dacbec83c3e

因此,直接导航它并不容易,并且您不会在目录或文件名中找到您想要分析的应用程序的任何提示。您可以考虑使用 iMazing 共享软件实用程序来提供帮助。使用 iMazing 执行设备备份,并使用其内置的备份资源管理器轻松分析应用程序容器内容,包括原始路径和文件名。

如果没有 iMazing 或类似软件,您可能需要求助于使用 grep 来识别敏感数据。这不是最彻底的方法,但您可以尝试搜索在使用应用程序后在进行备份之前键入的敏感数据。例如:用户名、密码、信用卡数据、PII 或应用程序上下文中被认为是敏感的任何数据。

~/Library/Application Support/MobileSync/Backup/<UDID>
grep -iRn "password" .

如静态分析部分所述,您能够找到的任何敏感数据都应从备份中排除,使用 Keychain 正确加密或首先不存储在设备上。

要识别备份是否已加密,您可以检查位于备份目录根目录的文件 "Manifest.plist" 中的名为 "IsEncrypted" 的键。以下示例显示了一个表明备份已加密的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
...
 <key>Date</key>
 <date>2021-03-12T17:43:33Z</date>
 <key>IsEncrypted</key>
 <true/>
...
</plist>

如果您需要使用加密备份,DinoSec 的 GitHub 仓库中有一些 Python 脚本,例如 backup_tool.py 和 backup_passwd.py,它们将作为一个良好的起点。但是,请注意,它们可能不适用于最新的 iTunes/Finder 版本,可能需要进行调整。

您还可以使用工具* iOSbackup 轻松读取和提取来自密码加密的 iOS 备份的文件。

概念验证:使用篡改的备份删除 UI 锁

正如前面讨论的,敏感数据不仅限于用户数据和 PII。它也可以是影响应用程序行为、限制功能或启用安全控制的配置或设置文件。如果您查看开源比特币钱包应用程序 Bither,您将看到可以配置 PIN 来锁定 UI。经过几个简单的步骤后,您将看到如何通过在非越狱设备上修改备份来绕过此 UI 锁。

启用 PIN 后,使用 iMazing 执行设备备份

  1. 从“可用”菜单下的列表中选择您的设备。
  2. 单击顶部菜单选项“备份”。
  3. 按照提示使用默认值完成备份。

接下来,您可以打开备份以查看目标应用程序中的应用程序容器文件

  1. 选择您的设备,然后单击右上角菜单中的“备份”。
  2. 单击您创建的备份,然后选择“查看”。
  3. 从“应用程序”目录导航到 Bither 应用程序。

此时,您可以查看 Bither 的所有备份内容。

您可以在此处开始解析文件,查找敏感数据。在屏幕截图中,您将看到包含 pin_code 属性的 net.bither.plist 文件。要删除 UI 锁限制,只需删除 pin_code 属性并保存更改即可。

从那里,可以使用 iMazing 的许可版本轻松地将修改后的 net.bither.plist 版本恢复到设备上。

但是,免费的解决方法是在 iTunes/Finder 生成的混淆备份中找到 plist 文件。因此,请配置 Bither 的 PIN 码来创建设备备份。然后,使用前面描述的步骤,找到备份目录并 grep 搜索“pin_code”,如下所示。

$ ~/Library/Application Support/MobileSync/Backup/<UDID>
$ grep -iRn "pin_code" .
Binary file ./13/135416dd5f251f9251e0f07206277586b7eac6f6 matches

您将看到二进制文件上有一个匹配项,该文件具有混淆的名称。这是您的 net.bither.plist 文件。继续并重命名该文件,为其提供 plist 扩展名,以便 Xcode 可以轻松打开它。

再次,从 plist 中删除 pin_code 属性并保存您的更改。将文件重命名回原始名称(即,不带 plist 扩展名)并执行备份恢复。恢复完成后,您将看到启动 Bither 时不再提示您输入 PIN 码。