Post

iOS 隐私保护全解析|Apple 隐私原则与历年功能调整详解

深入剖析 Apple iOS 隐私原则与多项功能调整,解决开发者与用户对隐私泄漏的疑虑,掌握 Private Relay、IDFA 管控、剪贴簿警示等技术,提升隐私安全与使用体验。

iOS 隐私保护全解析|Apple 隐私原则与历年功能调整详解

Click here to view the English version of this article.

點擊這裡查看本文章正體中文版本。

基于 SEO 考量,本文标题与描述经 AI 调整,原始版本请参考内文。


iOS 隐私与便利的前世今生

Apple 隐私原则及 iOS 历年对隐私保护的功能调整

Theme by [slidego](https://slidesgo.com/theme/cyber-security-business-plan#search-technology&position-3&results-12){:target="_blank"}

Theme by slidego

[2023–08–01] iOS 17 Update

对于之前演讲的最新 iOS 17 隐私相关调整补充。

Safari 会自动移除网址的 Tracking Parameter 参数 (e.g. fbclidgclid …)

  • 举例: https://zhgchg.li/post/1?gclid=124 点击后会变 https://zhgchg.li/post/1

  • 目前测试 iOS 17 Developer Beta 4, fbxxxgcxxx . .等等会被移掉, utm_ 是有保留的;不确定正式版 iOS 17 或日后 iOS 18 会不会再加强。

  • 如果想知道最严格情况下的效果可安装 iOS DuckDuckGo 浏览器进行测试。

  • 详细测试细节请参考「 iOS17 Safari 的新功能会把网址里的 fbclid 跟 gclid 砍掉 」大大的这篇文章。

Privacy Manifest .xprivacy & Report

开发者需把使用到的 User Privacy 宣告在内, 并也需要要求有使用到的 SDK 提供该 SDK 的 Privacy Manifest。

*另外也增加第三方 SDK Signature

XCode 15 能透过 Manifest 产生 Privacy Report 供开发者在 App Store 上做 App 隐私设定。

Required reason API

为避免部分有机会得出 fingerprinting 的 Foundation API 被滥用,苹果开始针对部分 Foundation API 做管控; 需要在 Mainfest 中宣告为何要使用

目前比较有影响的是 UserDefault 即属于要宣告的 API。

1
2
3
从 2023 年秋季开始,如果你上传到 App Store Connect 的新 App 或 App 更新使用了需要声明原因的 API (包括来自第三方 SDK 的内容),而你没有在 App 的隐私清单中提供批准的原因,那么你会收到通知。从 2024 年春季开始,若要将新 App 或 App 更新上传到 App Store Connect,你需要在 App 的隐私清单中注明批准的原因,以准确反映你的 App 如何使用相应 API。

如果目前批准原因的涵盖范围内并未包含某个需要声明原因的 API 的用例,且你确信这个用例可让你的 App 用户直接受益,请告诉我们。

Tracking Domain

发送 Tracking 资讯的 API Domain 需宣告在 privacy manifest .xprivacy 并在使用者同意追踪后才能发起网路请求,否则此 Domain 的网路请求全部都会被系统拦截。

可从 XCode Netowrk 工具中检查 Tracking Domain 是否被拦截:

目前实测 Facebook、Google 的 Tracking Domain 都会被侦测到,需要照规定列入 Tracking Domain 并询问权限。

因此请注意 FB/Google 数据统计在 iOS 17 后可能会大幅流失,因为未询问权限、不允许追踪,会完全收不到数据;根据以往实作询问追踪的成效,大约有 7 成的使用者都会按不允许。

  • 开发者自己的打 API 送 Tracking 方式,苹果也说需要同上列管 Tracking Domain

  • 如果 Tracking Domain 跟 API Domain 相同则需分开一个独立的 Tracking Domain (e.g. api.zhgchg.li -> tracking.zhgchg.li)

  • 目前暂时无法知道苹果如何控管开发者自己的 Tracking,用 XCode 15 测试自家的没有被发现。

  • 不清楚官方是否会用工具检测行为、或是审核人员人工查看

fingerprinting 依然禁止。

前言

这次很荣幸能参加 MOPCON 演讲 ,但因疫情关系改成线上直播形式蛮遗憾的,无法认识更多新朋友;这次演讲的主题是「iOS 隐私与便利的前世今生」主要想跟大家分享 Apple 关于隐私的原则及这些年来 iOS 基于这些隐私原则所做的功能调整。

[iOS 隐私与便利的前世今生](https://mopcon.org/2021/schedule/2021028){:target="_blank"} \| [Pinkoi, We Are Hiring!](https://www.pinkoi.com/about/careers){:target="_blank"}

iOS 隐私与便利的前世今生 \| Pinkoi, We Are Hiring!

相信这几年开发者或是 iPhone 用户应该都对以下功能调整并不陌生:

  • iOS ≥ 13: 所有支援第三方登入的 App 都需要多实作 Sign in with Apple,否则无法成功上架 App

  • iOS ≥ 14: 剪贴簿存取警告

  • iOS ≥ 14.5: IDFA 必须允许后才能存取,几乎等同封杀 IDFA

  • iOS ≥ 15 :Private Relay,使用 Proxy 隐藏使用者原始 IP 位址

  • iOS ≥ 16 :剪贴簿存取需使用者授权

  • ….还有很多很多,会在文章后跟大家分享

Why?

如果不清楚 Apple 的隐私原则,甚至会觉得为何 Apple 这几年不断地在跟开发者、广告商作对?很多大家用得很习惯的功能都被封锁了。

再追完「 WWDC 2021 — Apple’s privacy pillars in focus 」及「 Apple privacy white paper — A Day in the Life of Your Data 」两份文件后如梦初醒,原来我们早已在不知不觉中泄漏许多个人隐私并且让广告商或社群媒体赚的盆满钵满,在我们的日常生活中已经达到无孔不入的境界。

参考 Apple privacy white paper 改写,以下以虚构人物哈里为例;为大家讲述隐私是如何泄漏的及可能造成的危害。

首先是哈里 iPhone 上的使用纪录。

首先是哈里 iPhone 上的使用纪录。

左边是网页浏览纪录: 可以看到分别造访了跟车子、iPhone 13、精品有关的网站

右边是已安装的 App: 有投资、旅游、社交、购物、还有婴儿摄影机…这些 App

哈里的线下人生

哈里的线下人生

线下活动会留下记录的地方例如:发票、信用卡刷卡纪录、行车记录器…等等

组合

你可能会想说,我浏览不同的网站、装不同的 App (甚至根本没登入)、再到线下活动怎么可能有机会让某个服务串起所有资料?

答案是:就技术手段是有的,而且「可能」或是「已经」局部发生。

如上图所示:

  • 未登入时网站与网站之间可以透过 Third-Party Cookie、IP Address + 装置资讯算出的 Fingerprint 在不同网站中识别出同个浏览者。

  • 登入时网站与网站之间可以透过注册资料,如姓名、生日、电话、Email、身分证字号…串起你的资料

  • App 与 App 之间可以透过取得 Device UUID 在不同 App 中识别出同个使用者、URL Scheme 嗅探手机上其他已安装的 App、Pasteboard 在 App 与 App 间传递资料;另外一样也可在使用者登入后用注册资料串起资料。

  • App 与网站之间同样可以用 Third-Party Cookie、Fingerprint、Pasteboard 传递资料

  • 线上与线下活动的串连可能发生在,银行端搜集信用卡消费记录、记帐 App、发票搜集 App、行车记录器 App…等等,都有机会把线下活动与线上资料串接在一起

事实证明,技术上是可行的;那究竟躲在所有网站、App 之后的第三方是谁呢?

诸如家大业大的 Facebook、Google 都靠个人广告获得不少收益;许多网站、App 也都会串接 Facebook、Google SDK…所以一切都很难说,这还是看得到,更多时候我们根本不知道网站、App 用了哪些第三方广告、数据搜集服务,在背后偷偷纪录著我们的一举一动。

我们假设哈里所有的活动,背后都偷藏著同一个第三方在默默收集他的资料,那么在它的眼里,哈里可能的轮廓如下:

左边是个人资料,可能来自网站注册资料、外送资料;右边是依照哈里的活动纪录打上的行为、兴趣标签。

在它眼中的哈里,可能比哈里还更了解自己;这些资料用在社交媒体,可以让使用者更加沈沦;用在广告上,可以刺激哈里过度消费或是营造鸟笼效应(EX: 推荐你买新裤子,你买了裤子就会买合适的鞋子来穿搭,买了鞋子就会再买袜子…没完没了)。

如果你觉得以上已经够可怕了,还有更可怕的:

有你的个人资料又知道你的经济状况…要做恶的话不敢想像,例如:绑架、窃盗…

目前的隐私保护方式

  • 法律规范 (EX: SGS-BS10012 个资验证、CCPA、GDPR…)

  • 隐私权协议、去识别化

主要还是透过法规约束;很难确保服务 100% 随时遵守、网路上恶意程式也很多也难保证服务不会被骇造成资料外泄;总之还是「 要做恶技术上都可行,单靠法规跟企业良心约束 」。

除此之外更多时候,我们是「被迫」接受隐私权条款的,无法针对个别隐私授权,要马整个服务都不用,要马就是用但要接受全部隐私权条款;还有隐私条款不透明,不知道会怎么被收集及应用,更不知道背后有没有还躲著一个第三方在你根本不知道情况下搜集你的资料。

另外 Apple 还有提到关于未成年人的个人隐私,多半也都在监护人未同意的情况下被服务搜集。

Apple’s privacy principles

知道个人隐私泄露带来的危害之后,来看一下苹果的隐私原则。

节录自 Apple Privacy White Paper 苹果的理想不是完全封杀而是平衡,例如这几年很多人都会直接装 AD Block 完全阻断广告,这也不是苹果想看到的;因为如果完全断开就很难做出更好的服务。

贾伯斯在 2010 年的 All Things Digital Conference 说过:

我相信人是聪明的,有些人会比其他人更想分享数据,每次都去问他们,让他们烦到叫你不要再问他们了,让他们精准的知道你要怎么使用他们的资料。 — translate by Chun-Hsiu Liu

苹果相信隐私是基本人权

苹果的四个隐私原则:

  • Data Minimization:只取用你需要的资料

  • On-Device Processing:Apple 基于强大的处理器晶片,如非必要,个人隐私相关资料应在本地执行

  • User Transparency and Control:让使用者了解哪些隐私资讯被搜集?被用在哪?另外也要让使用者能针对个别隐私资料分享开关控制

  • Security:确保资料储存、传递的安全

iOS 基于保护个人隐私的历年功能调整

了解到个人隐私泄露的危害及苹果的隐私原则后,回到技术手段上;我们可以来看看 iOS 这些年来针对保护个人隐私的功能调整有哪些。

网站与网站之间

前面有提到

🈲,在 iOS >= 11 后的 Safari 都实装了 Intelligent Tracking Prevention ( WebKit )

预设启用,浏览器会主动辨识用于追踪、广告的第三方 Cookie 加以阻挡;并且在每年的 iOS 版本不断地加强辨识程式防止遗漏。

透过 Third-Party Cookie 跨网站追踪使用者这条路,在 Safari 上基本上已经行不通了。

第二种方法是用 IP Address + 装置资讯算出的 Fingerprint 在不同网站中识别出同个浏览者:

🈲,iOS >= 15 Private Relay

尤其在 Third-Party Cookie 被禁之后,有越来越多服务采用这个方法,苹果也知道…所幸在 iOS 15 连 IP 资讯都给你混淆了!

Private Relay 服务会将使用者的原始请求先随机送到苹果的 Ingress Proxy,再由苹果随机分派到合作 CDN 的 Egress Proxy,再由 Egress Proxy 去请求目标网站。

整个流程都经过加密只有自己 iPhone 的晶片解的开,也只有自己同时知道 IP 与请求的目标网站;苹果的 Ingress Proxy 只知道你的 IP、CDN 的 Egress Proxy 只知道苹果的 Ingress Proxy IP 跟请求的目标网站、网站只知道 CDN 的 Egress Proxy IP。

从应用角度来看,同一个地区的所有装置都会使用同个共享的 CDN 的 Egress Proxy IP 来请求目标网站;也因此网站端无法再用 IP 当成 Fingerprint 资讯。

技术细节可参考「 WWDC 2021 — Get ready for iCloud Private Relay 」。

补充 Private Relay:

  • Apple/CDN Provider 都没有完整 Log 可追朔: 查了下这样苹果怎么防止被用在恶意的地方,没找到答案;可能就跟苹果也不会帮 FBI 解锁罪犯 iPhone 一样意思吧;隐私是所有人的基本人权。

  • 预设开启,不需特别连接

  • 不影响速度、效能

  • IP 会保证在同个国家和时区 (使用者可选模糊城市)、无法指定 IP

  • 只对部分流量有效 iCloud+ 用户:所有 Safari 上的流量 + App 中的 Insecure HTTP Request 一般用户:仅对 Safari 上网站安装的第三方追踪工具有效

  • 官方有提供 CDN Egress IP List 供网站开发者辨认 (不要误 Blocking Egress IP,会造成群体伤害)

  • 网路管理者可 Ban 掉 DNS 对所有连接者停用 Private Relay

  • iPhone 可针对特定网路连线停用 Private Relay

  • 连接 VPN/ 挂 Proxy 时会停用 Private Relay

  • 目前还在 Beta 版 (2021/10/24),启用后部分服务可能会连不上 (中国地区、中国版抖音)或是服务会频繁被登出

Private Relay 实测图

Private Relay 实测图

  • 图一 未启用:原始 IP 位址

  • 图二 启用 Private Relay — 保持一般位置:IP变成 CDN IP 但依然在 Taipei

  • 图三 启用 Private Relay — 使用国家和时区(扩大模糊):IP变成 CDN IP & 变在 Taichung,但依然还是同个时区和国家

[测试专案](https://github.com/zhgchgli0718/PrivacyTest){:target="_blank"}

测试专案

App 可以用 URLSessionTaskMetrics 分析 Private Relay 的连接纪录。

扯远了,因此用 IP 位址得到 Fingerprint 去辨识使用者的方法,也无法再使用了。

App 与 App 之间

第一种方式是早期可以直接存取 Device UUID:

🈲,iOS >= 7 禁止存取 Device UUID,

使用 IDentifierForAdvertisers/IDentifierForVendor 取代

🈲,iOS >= 14.5 IDentifierForAdvertisers 需询问后才能使用

iOS 14.5 后苹果加强对 IDFA 的取用限制,App 需要先询问使用者允不允许追踪后才能取得 IDFA UUID;未询问、未允许的情况下都拿不到值。

市调公司初步调查数据大约有 7成的使用者(最新数据有人说 9 成)都不允许追踪取用 IDFA,所以大家才会说 IDFA 已死!

[测试专案](https://github.com/zhgchgli0718/PrivacyTest){:target="_blank"}

测试专案

App 与 App 之间互通有无的第二种方法是 URL Scheme:

iOS App 可以使用 canOpenURL 去探测使用者手机上有没有装某个 App。

🈲,iOS >= 9 需先在 App 内设定才能使用;不能任意探测。

iOS ≥ 15 新增限制,最多只能设定 50 组其他 App 的 Scheme。

Apps linked on or after iOS 15 are limited to a maximum of 50 entries in the LSApplicationQueriesSchemes key.

网站 与 App 之间

同前文所述

早期 iOS Safari 的 Cookie 跟 App WebView 的 Cookie 是可以互通的,可以借此串起 网站与 App 之间的资料。

做法可以在 App 画面上偷塞一个 1 pixel 的 WebView 元件在背景偷偷读取 Safari Cookie 回来用。

🈲,iOS >= 11 禁止 Safari 和 App WebView 间共用 Cookie

如果有需要取得 Safari 的 Cookie (EX: 直接使用网站 Cookie 登入),可以使用 SFSafariViewController 元件取得;但此元件强迫跳提示视窗且无法客制化,确保使用者不会在无意间被偷取 Cookie。

第二种方法是同网站与网站用IP Address + 装置资讯算出的 Fingerprint 在不同网站中识别出同个浏览者:

同前述, iOS ≥ 15 已被 Private Relay 混淆。

最后一种也是唯一还能的方法 — Pasteboard

使用剪贴簿串接跨平台的资讯,因为苹果不可能禁用剪贴簿跨 App 使用,但是它可以提示使用者。

⚠️ iOS >= 14 新增剪贴簿存取警告

⚠️ 2022/07/22 Update: iOS 16 Upcoming Changes

iOS ≥ 16 开始非使用者主动操作贴上动作,App 主动读取剪贴簿的行为会跳出询问视窗,使用者需要按允许,App 才能读取到剪贴簿资讯。

[UIPasteBoard’s privacy change in iOS 16](https://sarunw.com/posts/uipasteboard-privacy-change-ios16/){:target="_blank"}

UIPasteBoard’s privacy change in iOS 16

这边要多提一下关于 iOS 14 剪贴簿的隐私恐慌,详细可参考我之前的文章「 iOS 14 剪贴簿窃资恐慌,隐私与便利的两难

虽然不能排除读取剪贴簿是想窃资,但更多时候是我们 App 需要提供更好的使用体验:

在没有实现 Deferred Deep Link 延迟深度连结之前,当我们引导使用者从网站上去安装 App,安装完成后打开 App 默认只会打开首页;更好的使用体验应该是打开 App 回复到网页上停留的页面的 App 对应页。

要实现这个功能就需要 网站与 App 之间有机会串起资料,如文章前述的其他方法都已被封禁,目前仅能透过剪贴簿做为资讯储存媒介(如上图)。

包含 Firebase Dynamic Links、Branch.io 最新版(之前 Branch.io 用 IP Adrees Fingerprint 来实现)也都使用剪贴簿做 Deferred Deep Link。

实作可参考我之前的文章: iOS Deferred Deep Link 延迟深度连结实作(Swift)

一般情况下如果是为了要做到 Deferred Deep Link 仅会在第一次打开 App、重新返回 App 那一刻去读取剪贴簿资讯;不会在使用中或奇怪的时间点读取,这一点值得注意。

更好的做法是先用 UIPasteboard.general.detectPatterns 探测剪贴簿的资料是不是我们需要的,是在读取。

[测试专案](https://github.com/zhgchgli0718/PrivacyTest){:target="_blank"}

测试专案

iOS ≥ 15 之后优化了剪贴簿提示,如果是使用者自己的贴上动作,就不会再跳提示了!

广告成效解决方案

同前文所说的苹果隐私原则,希望的是平衡而不是完全阻断使用者与服务。

网站与网站的广告成效统计:

Safari 上相对于阻挡 Intelligent Tracking Prevention 的功能就是 Private Click Measurement ( WebKit ) 用于在去除个人隐私的情况下统计广告成效。

具体流程如上图,使用者在 A 网站点击广告前往 B 网站时,会在浏览器上纪录一个 Source ID (识别同个使用者用) 与 Destination 资讯 (目标网站);当使用者在 B 网站上完成转换也会纪录一个 Trigger ID (代表什么动作) 在浏览器上。

这两个资讯会合并起来在随机 24 ~ 48 小时后传送到 A 和 B 网站得到广告成效。

一切都是 on-device safari 自行处理、防范恶意点击也是由 Safari 提供保护。

App 与 网站或 App 之间的广告成效统计:

可以使用 SKAdNetwork (需向苹果申请加入) 类似 Private Click Measurement 方式,不再展开赘述。

可以多提一下,苹果并非闭门造车; SKAdNetwork 目前来到 2.0 版本,苹果持续收集开发者广告商的需求综合个人隐私控管,持续优化 SDK 功能。

这边真心许愿 Deferred Deep Link 能用 SDK 串起,因为我们是为了提升使用者体验,没有要侵犯个人隐私的意思。

技术细节可参考「 WWDC 2021 — Meet privacy-preserving ad attribution 」。

Cross-Platform

iOS ≥ 13 所有支援第三方登入的 App 都需要多实作 Sign in with Apple,否则无法成功上架 App

iOS >= 15 iCloud+ 用户支援 Hide My Email

  • 支援 Safari、App 所有信箱栏位

  • 使用者可到设定中任意产生虚拟信箱

同 Sign in with Apple 使用苹果产的虚拟 Email 代替真实信箱,在收到信后苹果会转发到你的真实信箱中,借此保护你的信箱资讯。

类似 10 分钟信箱,但又更强大;只要不停用,那组虚拟信箱地址就是你永久持有;也没有新增上限,可以无限新增,不确定苹果如何防止滥用。

设定 -> Apple ID -> 隐藏我的电子邮件

设定 -> Apple ID -> 隐藏我的电子邮件

Others

App privacy details on the App Store:

App 必需在 App Store 上说明使用者哪些资料会被追踪及如何应用 _。*

详细说明可参考:「 App privacy details on the App Store 」。

个人隐私资料细微控制:

iOS ≥ 14 开始,位置及相片存取可以更细微的控制,可以只授权取用某几张相片、只允许 App 使用中存取位置。

[测试专案](https://github.com/zhgchgli0718/PrivacyTest){:target="_blank"}

测试专案

iOS ≥ 15,增加 CLLocationButton 按钮提升使用者体验,可以在未询问/未同意情况下透过使用者点击取得当前位置,此按钮无法客制化、只能透过使用者操作触发。

个人隐私取用提示:

iOS ≥ 15,增加个人隐私功能的取用提示,如:剪贴簿、位置、相机、麦克风

App 隐私取用报告:

iOS ≥ 15,可以汇出近 7 天手机所有 App 的隐私相关功能取用、网路活动的纪录报告。

  1. 因纪录报告档案是 .ndjson 纯文字档,直接查看不易;可以先在 App Store 下载「 隐私洞见 」App 用来查看报告

  2. 到设定 -> 隐私权 -> 最下方「纪录 App 活动」-> 启用纪录 App 活动

  3. 储存 App 活动

  4. 选择「汇入到 隐私洞见

  5. 汇入完成后即可检视隐私报告

可以看到同 新闻 所说,Wechat 的确会再启动 App 时在背景偷偷读取相片资讯。

另外我也多抓到几个中国 App 也会偷做事,直接在设定全部禁用它们的权限了。

要不是有这个功能让他们见光死,还不知道我们的资料会被窃取多久!

Recap

Apple’s privacy principles

了解完历年对于隐私功能的调整后,我们回头来看苹果的隐私原则:

  • Data Minimization:苹果用技术手段限制取用需要的资料

  • On-Device Processing:隐私资料不上传云端,一切都在本地处理;如 Safari Private Click Measurement、苹果的 机器学习 SDK CoreML 也都是在本地执行、iOS ≥ 15 的 Siri/相机原况文字功能、Apple Map、News、相片识别功能…等等

  • User Transparency and Control:新增的各种隐私存取提示、纪录报告及隐私细微控制功能

  • Security:资料储存传递的安全,不滥用 UserDefault、iOS 15 可以直接用 CryptoKit 来做点对点加解密、Private Realy 的传输安全

破碎资料

回到最一开始用技术手段拼凑出哈里的关联图,网站与网站或 App 之间被堵死,只剩剪贴还能用,但会有提示。

服务注册跟第三方登入的个资,可以改用 Sign in with apple 和 hide my email 功能防堵;或是多使用 iOS 原生 App。

线下活动或许可以改 Apple Card 防止隐私外泄?

已没有人有机会拼凑出哈里的活动轮廓。

Apple 以人为本

因此「以人为本」是我会给苹果的理念的代名词,要与商业市场唱反调需要很大的信念;与它相关的「以科技为本」是我会给 Google 的代名词,因为 Google 总能造出很多 Geek 科技项目;最后「以商业为本」是我会给 Facebook 的代名词,因为 FB 在很多层面上都只追求商业收益。

除了针对隐私功能的调整,这几年的 iOS 也不断加强防止手机沈迷的功能,推出了「萤幕使用时间报告」、「App 使用时间限制」、「专注模式」…等等功能;帮助大家解除手机成瘾。

最后希望大家都能

  • 重视个人隐私

  • 不被资本控制

  • 减少虚拟成瘾

  • 防止社会沈沦

在现实世界活出精彩人生!

Private Relay/IDFA/Pasteboard/Location 测试专案:

参考资料

有任何问题及指教欢迎 与我联络


Buy me a beer

本文首次发表于 Medium (点击查看原始版本),由 ZMediumToMarkdown 提供自动转换与同步技术。

Improve this page on Github.

This post is licensed under CC BY 4.0 by the author.