iOS独立开发|分析iOS15隐私访问记录:原理

6,534 阅读6分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战

Hi 👋

我的个人项目扫雷Elic 无尽天梯梦见账本隐私访问记录
类型游戏财务工具
AppStoreElicUmemi隐私访问记录

更多专栏:

Lawliet的独立开发碎碎念

Lawliet的iOS游园会

Lawliet的iOS底层实验室

Lawliet的iOS逆向实验室

Lawliet的刷题小本本

前言

iOS15 发布后,系统的 记录App活动 的功能和 隐私洞见 也是火了一小把。当然我也抱着学习SwiftUI(蹭热度)的态度,用 SwiftUI 速成了一个分析工具:隐私访问记录

这里需要结合 ActionExtension 来进行日志文件导入,其中我也有遇到一些问题,后面会再输出一篇文章和大家分享。

概述

iOS 15.2iPadOS 15.2watchOS 8.3 或更高版本中,用户可以查看应用程序的隐私访问报告:

  • 访问某些类型的用户数据,如照片联系人
  • 访问敏感的设备资源,如摄像头麦克风
  • 联系人网络域,包括用户从应用程序中访问的网站(仅限 iOSiPadOS)。

检查应用程序为此摘要提供的数据,以了解报告向用户显示的内容,并确保应用程序按预期运行。

开始记录应用活动

用户可以通过选择隐私>记录App活动,然后点击“打开记录App活动,从设置应用在其设备上启用应用活动记录。

系统会记录最近7天的应用活动记录——仅存储在用户的设备上。 在自己的设备上打开此功能后,使用应用程序对其数据、资源和网络访问进行全面测试。 请务必使用该应用程序足够长的时间以允许任何延迟访问。 多长时间取决于应用程序的行为。

获取应用活动数据

运行应用一段时间后,可以通过点击应用隐私报告屏幕上的共享按钮来获取有关应用活动的报告:

03-01.png

03-03.png

03-02.png

将报告保存到可以检查的位置。 例如,可以使用 AirDrop 将其发送到附近的 Mac。

该报告使用换行符分隔的 JSON 格式 (NDJSON),可以使用任何文本编辑器打开该格式,并包含由换行符分隔的 JSON 字典集合。 类型键的值设置为 access 的字典提供有关资源访问的信息,而类型键的值设置为 networkActivity 的字典提供有关网络活动的信息:

{..., "type":"access", ...}
{..., "type":"access", ...}
...
{..., "type":"networkActivity", ...}
{..., "type":"networkActivity", ...}
...

检查资源访问数据

文件中的每个访问字典都代表特定应用程序访问的开始或结束。

下面显示了此字典的示例,其中添加了空格、换行符和注释以提高可读性:

{
  "accessor" : { 
    "identifier" : "com.example.calendar", // The app accessing the resource.
    "identifierType" : "bundleID"
  },
  "broadcaster": { // Only present for screen recording.
    "identifier" : "com.apple.springboard", // The app broadcasting the screen.
    "identifierType" : "bundleID"
  },
  "category" : "screenRecording", // The accessed resource.
  "identifier" : "8A4054BB-1810-4F8B-8163-483409E2D35C", // A unique identifier.
  "kind" : "intervalBegin", // Whether this the beginning or end of an interval.
  "timeStamp" : "2021-08-06T15:46:13.532-07:00", // The time of the access.
  "type" : "access" // This is resource access data.
}

要查找应用程序进行的访问,请查找具有访问器键的所有访问字典,该访问器键的字典值包含应用程序的包标识符。 使用 category 字段确定应用访问了哪些资源,并使用 timeStamp 字段将访问与生成访问的活动相关联。 可能会遇到以下任何类别值:

CategoryResource
cameraThe device’s camera
contactsThe user’s contacts
locationLocation data
mediaLibraryThe user’s media library
microphoneThe device’s microphone
photosThe user’s photo library
screenRecordingScreen sharing

每次资源访问都发生在一个时间间隔内,并生成一对访问字典以指示:

  • 区间的开始,kind 字段设置为 intervalBegin ,如上例所示。
  • 间隔结束,kind 字段设置为 intervalEnd

绑定访问间隔的两个字典具有相同的标识符键值。

对于 screenRecording 类别,字典还包含一个广播键,其值指示应用程序将屏幕广播到访问器,通常是 Springboard

检查网络活动

iOSiPadOS 导出的文件包含另一组字典,这些字典的类型键和值设置为 networkActivity 以报告网络访问。 每个字典都描述了由指定应用程序与特定域建立的连接。 下面显示了这个字典的一个例子,为了清楚起见,再次添加了空格和换行符:

{
  "domain" : "api.example.com",
  "firstTimeStamp" : "2021-06-06T16:15:48Z",
  "context" : "",
  "timeStamp" : "2021-06-06T16:15:59Z",
  "domainType" : 2,
  "initiatedType" : "AppInitiated",
  "hits" : 10,
  "type" : "networkActivity",
  "domainOwner" : "",
  "bundleID" : "com.example.App1"
}

字典包括以下描述网络活动的关键字:

  • domain
    • 域名
  • firstTimeStamp
    • 首次访问的时间
  • context
    • 建立连接的网站(如果适用)。
  • timeStamp
    • 最近访问的时间
  • domainType
    • 当值为 1 时,域已被识别为可能跨应用程序和站点收集信息,并可能分析用户。
    • 当值为 2 表示尚未识别该域。
  • initiatedType
    • 是应用(AppInitiated)还是用户(NonAppInitiated)发起了连接。
  • hits
    • 应用在过去 7 天内联系域的次数。
  • type
    • networkActivity 的关联值表示该字典描述网络活动数据。
  • domainOwner
    • 域的所有者(如果适用)。
  • bundleID
    • bundleID

在决定如何设置初始类型键的值时,系统会将来自应用程序中的 Web 浏览器的连接(例如实例化 SFSafariViewController 时)归因于用户。否则,系统会将应用与 URL 加载系统或网络框架等低级接口建立的任何连接视为应用启动。这包括从服务器加载以直接响应用户操作的用户数据。

当通过设置一个属性进行一般网络请求时,可以更改此键的关联值。比如创建一个URLRequest的时候,设置attribution属性;使用 NWConnection 实例时,调用 nw_parameters_set_attribution(::) 函数。但是,仅更改用户直接完全控制的连接的归因,例如当用户输入 URL 或点击或单击他们可以阅读的 URL 时。有关网络归因的更多信息,请参阅指明网络活动的来源。

考虑应用程序是否需要更改

如果发现应用建立了无法识别的网络连接,或访问了不该访问的资源,请检查应用。 仔细检查集成的任何第三方框架或模块,因为它们可能会产生意外连接。