iOS Instagram 和 Facebook 应用使用自定义应用内浏览器在其应用内呈现所有第三方链接和广告。这会给用户带来各种风险,主机应用程序能够跟踪与外部网站的每一次交互,从所有表单输入(如密码和地址)到每一次点击。
Instagram 是做什么的?
- 外部网站的链接在 Instagram 应用程序中呈现,而不是使用内置的 Safari。
- 这允许 Instagram 监控外部网站上发生的一切,无需用户或网站提供商的同意。
- Instagram 应用程序将他们的跟踪代码注入到显示的每个网站中,包括在点击广告时,使他们能够监控所有用户交互,例如点击的每个按钮和链接、文本选择、屏幕截图以及任何表单输入,例如密码、地址和信用卡号。
为什么这很重要?
- Apple 积极反对这种跨主机跟踪:
- 从 iOS 14.5 开始, App Tracking Transparency 让用户处于控制之中:应用程序需要先获得用户的许可,然后才能跨其他公司拥有的应用程序跟踪其数据。
- Safari 已默认阻止第三方 cookie
- 谷歌浏览器即将逐步淘汰第三方 cookie
- Firefox 刚刚宣布默认为Total Cookie Protection以防止任何跨页跟踪
- 一些 ISP过去常常将自己的跟踪/广告代码注入所有网站,但他们只能对未加密的页面执行此操作。随着默认情况下 HTTPs 的兴起,这不再是一种选择。 Instagram 和 Facebook 应用程序在这里使用的方法适用于任何网站,无论它是否加密。
Instagram 特意围绕 App Tracking Transparency 权限系统工作,该系统旨在防止这种确切类型的数据收集。推出后, Meta宣布:
苹果的简单 iPhone 警报每年让 Facebook 损失 100 亿美元
Facebook 抱怨说,Apple 的 App Tracking Transparency 有利于 Google 等公司,因为 App Tracking Transparency “将浏览器从 Apple 要求的应用程序跟踪提示中剔除”。
您在 iOS 上访问的网站不会触发跟踪提示,因为内置了反跟踪功能。
Instagram 拥有 10 亿活跃用户,通过将跟踪代码注入从 Instagram 和 Facebook 应用程序打开的每个第三方网站,Instagram 可以收集的数据量是惊人的。
随着网络浏览器和 iOS 在用户手中增加了越来越多的隐私控制,Instagram 对监控外部网站的所有网络流量感兴趣的原因就很清楚了。
Facebook 用消息轰炸它的用户,请求他们重新开启追踪功能。它威胁要对苹果提起反垄断诉讼。它让小企业为用户跟踪辩护,声称当一家大公司监视数十亿人时,这是小企业发展的一种形式。
– EFF – Facebook 说苹果太强大了。他们是对的。
非技术读者的常见问题解答
- Instagram/Facebook 可以阅读我在网上所做的一切吗?不!只有当您从 Instagram 应用程序中打开链接或广告时,Instagram 才能阅读和观看您的在线活动。
- Facebook 真的会窃取我的密码、地址和信用卡号码吗?不!我没有证明 Instagram 正在跟踪的确切数据,但想展示他们在你不知情的情况下可以获得的数据类型。如过去所示,如果一家公司可以免费访问数据,而无需征求用户的许可,他们就会对其进行跟踪。
- 我该如何保护自己?有关完整的详细信息,请向下滚动到文章末尾。摘要:每当您从 Instagram(或 Facebook 或 Messenger)打开链接时,请确保单击角落中的点以在 Safari 中打开页面。
- Instagram 是故意这样做的吗?我不能说这些决定是如何在内部做出的。我只能说,构建您自己的应用内浏览器需要花费大量时间来编程和维护,而不仅仅是使用过去 7 年来已经内置在 iPhone 中的隐私和用户友好的替代方案。
元像素
Instagram 应用程序注入的外部 JavaScript 文件 ( connect.facebook.net/en_US/pcm.js ) 是元像素,以及一些用于构建与主机应用程序通信的桥梁的代码。这不仅仅是一个像素/图像,而是实际执行的 JavaScript 代码:
Meta Pixel 是一段 JavaScript 代码,可让您跟踪网站上的访问者活动。它通过加载一个小型函数库来工作,每当站点访问者执行您想要跟踪的操作时,您都可以使用这些函数库 […]
Meta Pixel 可以收集以下数据:
- […]
- 按钮点击数据——包括网站访问者点击的任何按钮、这些按钮的标签以及按钮点击所访问的任何页面。
- 表单字段名称 – 包括您购买产品或服务时的电子邮件、地址、数量等网站字段名称。我们不会捕获字段值,除非您将它们作为高级匹配或可选值的一部分。
–developers.facebook.com/docs/meta-pixel(2022年 6 月)
"The Meta Pixel allows you to track visitor activity on your website"
是完全可以的。但是在这种情况下,网站运营商不同意安装 Meta Pixel。最重要的是,网站提供商甚至没有办法选择退出。
免责声明
我没有 Instagram 发回国内的精确数据列表。我确实有证据表明 Instagram 和 Facebook 应用程序在未经用户同意的情况下主动运行 JavaScript 命令以注入额外的 JS SDK,并跟踪用户的文本选择。如果 Instagram 已经这样做了,他们还可以注入任何其他 JS 代码。 Instagram 应用程序本身可以很好地防止中间人攻击,只有通过修改 Android 二进制文件以删除证书固定并在模拟器中运行它,我才能检查它的一些网络流量。
即便如此,大多数实际数据还有另一层加密/压缩。很明显,他们真的不希望您调查发送回 API 的数据类型。我决定不花更多时间在这上面。
总体而言,该项目的目标不是获取发回的精确数据列表,而是突出使用应用内浏览器引起的隐私和安全问题,以及证明 Instagram 等应用已经在利用这个漏洞了。
总结一下拥有应用内浏览器的风险和劣势:
- 隐私和分析:主机应用程序可以从字面上跟踪网站上发生的所有事情、每次点击、输入、滚动行为、复制和粘贴的内容,以及在线购买等显示的数据
- 窃取用户凭证、物理地址、API 密钥等。
- 广告和推荐:宿主应用可以向网站注入广告,或者替换广告 API 密钥以从宿主应用中窃取收入,或者替换所有 URL 以包含您的推荐代码(这种情况以前发生过)
- 安全性:浏览器花了数年时间优化网络的安全用户体验,例如显示 HTTPs 加密状态、警告用户有关粗略或未加密的网站等等
- 将额外的 JavaScript 代码注入第三方网站可能会导致问题和故障,可能会破坏网站
- 用户的浏览器扩展和内容拦截器不可用
- 在大多数情况下,深度链接效果不佳
- 通常不容易通过其他平台(例如通过电子邮件、AirDrop 等)共享链接。
Instagram 的应用内浏览器支持自动填写您的地址和付款信息。但是,首先没有正当理由存在这种情况,因为所有这些都已内置到操作系统或 Web 浏览器本身中。
测试各种 Meta 的应用程序
Instagram iOS | 信使 iOS |
---|---|
脸书 iOS | 安卓系统 |
---|---|
WhatsApp 默认打开 iOS Safari,因此没有问题。
这个怎么运作
据我所知,没有好的方法可以监控主机 iOS 应用程序执行的所有 JavaScript 命令(如果有更好的方法,我很想听听)。
我创建了一个新的纯 HTML 文件,其中包含一些 JS 代码来覆盖某些document.
方法:
document . getElementById = function ( a , b ) { appendCommand ( ' document.getElementById(" ' + a + ' ") ' ) return originalGetElementById . apply ( this , arguments ); }
从 iOS Instagram 应用程序打开该 HTML 文件会产生以下结果:
将此与使用普通浏览器时发生的情况进行比较,或者在这种情况下,使用推荐的SFSafariViewController
的 Telegram:
如您所见,普通浏览器或SFSafariViewController
不运行任何 JS 代码。 SFSafariViewController
是应用程序开发人员向用户展示第三方 Web 内容的好方法,他们无需离开您的应用程序,同时仍为用户保留隐私和舒适度。
技术细节
- Instagram 添加了一个新的事件侦听器,以获取有关用户每次在网站上选择任何文本时的详细信息。这与收听屏幕截图相结合,让 Instagram 全面了解选择和共享了哪些特定信息
- Instagram 应用程序检查是否存在 ID
iab-pcm-sdk
的元素:令人惊讶的是,我在网上找到的关于此的信息很少。基本上它似乎是IAB Tech Lab提供的跨平台跟踪SDK ,但是我对Instagram和IAB Tech Lab之间的关系了解不够(例如this tweet ) - 如果没有找到 ID
iab-pcm-sdk
的元素,Instagram 会创建一个新的script
元素,将其源设置为https://connect.facebook.net/en_US/pcm.js
,这是元跟踪的源代码像素 - 然后它会在您的网站上找到第一个
script
元素以在之前插入 Meta Pixel,将 Meta Pixel 注入您的网站 - Instagram 还会在您的网站上查询
iframes
,但我找不到任何迹象表明他们在用它做什么
作为用户如何保护自己?
逃离应用内网页视图
大多数应用内浏览器都有办法在 Safari 中打开当前呈现的网站。一旦你登陆该屏幕,只需使用该选项来逃避它。如果该按钮不可用,您必须复制并粘贴 URL 才能在您选择的浏览器中打开链接。
使用网页版
大多数社交网络,包括 Instagram 和 Facebook,都提供了不错的移动网络版本,提供了类似的功能集。您可以在 iOS Safari 中毫无问题地使用https://instagram.com
。
作为网站提供商如何保护自己?
在 Instagram 解决这个问题之前(如果有的话),您可以很容易地欺骗 Instagram 和 Facebook 应用程序,使其相信跟踪代码已经安装。只需将以下内容添加到您的 HTML 代码中:
<span id="iab-pcm-sdk"></span> <span id="iab-autofill-sdk"></span>
此外,为了防止 Instagram 跟踪用户在您网站上的文本选择:
const originalEventListener = document . addEventListener document . addEventListener = function ( a , b ) { if ( b . toString (). indexOf ( " messageHandlers.fb_getSelection " ) > - 1 ) { return null ; } return originalEventListener . apply ( this , arguments ); }
这不会解决 Instagram 针对您的网站运行 JavaScript 代码的实际问题,但至少不会注入额外的 JS 脚本,并且跟踪的数据更少。
应用程序通过检查用户代理来检测当前浏览器是否是 Instagram/Facebook 应用程序也很容易,但是我找不到自动弹出应用程序内浏览器以打开 Safari 的好方法。如果您知道解决方案,我很想知道。
提案
苹果
Apple 在构建平台时考虑到了用户的隐私,做得非常出色。 4 项隐私原则之一:
用户透明度和控制:确保用户知道共享哪些数据以及如何使用这些数据,并且他们可以对其进行控制。
– Apple 隐私 PDF (2021 年 4 月)
在撰写本文时,没有 AppStore 审查规则禁止公司构建自己的应用内浏览器来跟踪用户、阅读他们的输入并向第三方网站注入额外的广告。然而,Apple 明确建议使用SFSafariViewController
:
避免使用 Web 视图来构建 Web 浏览器。使用 Web 视图让人们在不离开应用程序上下文的情况下短暂访问网站是可以的,但 Safari 是人们浏览 Web 的主要方式。尝试在您的应用程序中复制 Safari 的功能是不必要且不鼓励的。
– Apple 人机界面指南(2022 年 6 月)
如果您的应用程序允许用户从 Internet 上的任何位置查看网站,请使用
SFSafariViewController
类。如果您的应用程序自定义、交互或控制 Web 内容的显示,请使用WKWebView
类。
– Apple SFSafariViewController 文档(2022 年 6 月)
引入App-Bound Domains
App-Bound Domains是一项出色的WebKit
新功能,使开发人员可以在使用WKWebView
时提供更安全的应用内浏览体验。作为应用程序开发人员,您可以定义您的应用程序可以访问哪些域,并且所有 Web 请求都将仅限于这些域。要禁用保护,用户必须在 iOS 设置应用程序中明确禁用它。
App-Bound Domains 与 iOS 14 一起上线(约 1.5 年前),但它只是开发人员的一个选择加入选项,这意味着绝大多数 iOS 应用程序不使用此功能。
如果 SocialApp 的开发者想要更好的用户隐私体验,他们有两条前进的道路:
- 使用
SafariViewController
而不是WKWebView
进行应用内浏览。 SafariViewController 通过在SafariViewController
的进程空间之外加载页面来保护用户数据免受 SocialApp 的影响。 SocialApp 可以保证在使用 SafariViewController 时为其用户提供最佳的用户隐私体验。- 选择加入应用绑定域。来自应用绑定域的额外
WKWebView
限制确保 SocialApp 无法使用上述 API 跟踪用户。
我强调了"want a better user privacy experience"
部分,因为这是缺失的部分:应用绑定域应该是所有 iOS 应用程序的要求,因为社交媒体应用程序是注入跟踪代码的应用程序。
2022 年 7 月,Apple 推出了锁定模式,以更好地保护高风险人群。不幸的是,iOS 锁定模式不会改变应用内网页视图的工作方式。我已经向 Apple 提交了一份雷达: rdar://10735684 ,Apple 对此做出了回应“这不是锁定模式的用途”
Apple 可以立即采取的一些措施:
更新 App Review Rules 以要求在显示任何第三方网站时使用SFSafariViewController
或App-Bound Domains 。
- 应该只有少数例外(例如浏览器应用程序),需要两个额外步骤:
- 请求额外的权利以确保它是一个有效的用例
- 让用户确认额外的权限
- 第一方网站/内容仍然可以使用
WKWebView
类显示,因为它们通常用于 UI 元素,或者应用程序实际修改其第一方内容(例如自动关闭自己的 cookie 横幅)
作为我过去博客文章的一部分,我还向 Apple 提交了一个雷达 ( rdar://38109139 )。
对于元
用 WhatsApp 做 Meta 已经在做的事情:停止修改第三方网站,并为所有第三方网站使用 Safari 或SFSafariViewController
。这对用户来说是最好的,也是正确的做法。
我已经通过他们的Bug Bounty Program向 Meta 披露了这个问题,在几个小时内他们确认他们能够重现这个“问题”,但是在过去的 9 周内我没有收到任何回复,除了要求我等待更长时间,直到他们有完整的报告。由于我的后续问题没有任何回应,他们也没有停止向外部网站注入跟踪代码,我决定公开这些信息(在给他们另外 2 周的提醒之后)
查看我的其他隐私和安全相关出版物。