iOS的隐私:Instagram和Facebook可以追踪APP内浏览器的任何行为?

作者:Sec-Labs | 发布时间:

iOS的Instagram和Facebook应用使用一个自定义的应用内浏览器在其应用内渲染所有第三方链接和广告。这给用户带来了各种风险,主应用能够跟踪与外部网站的每一次互动,从密码和地址等所有表格输入,到每一次点击。

Instagram是怎么做的?

通往外部网站的链接在Instagram应用程序中呈现,而不是使用内置的Safari。
这使得Instagram可以监控外部网站上发生的一切,而无需征得用户或网站供应商的同意。
Instagram应用程序将他们的JavaScript代码注入显示的每个网站,包括在点击广告时。尽管pcm.js没有这样做,但将自定义脚本注入第三方网站,使他们能够监控所有的用户互动,如点击的每个按钮和链接、文本选择、屏幕截图,以及任何表格输入,如密码、地址和信用卡号码。

为什么这是个大问题?

在应用跟踪透明化出台后,Meta公司宣布。

苹果公司简单的iPhone提示使Facebook每年损失100亿美元

Facebook抱怨说,苹果的应用跟踪透明度有利于谷歌等公司,因为应用跟踪透明度 "将浏览器从苹果要求的应用跟踪提示中分割出来"。

你在iOS上访问的网站不会触发跟踪提示,因为反跟踪功能是内置的。

 

- Daring Fireball和MacWorld

拥有10亿活跃的Instagram用户,Instagram通过将跟踪代码注入从Instagram和Facebook应用程序打开的每个第三方网站,可以收集的数据量是惊人的。

随着网络浏览器和iOS在用户手中增加越来越多的隐私控制,Instagram对监控所有外部网站的网络流量感兴趣的原因就很清楚了。

Facebook用信息轰炸其用户,乞求他们重新打开追踪功能。它威胁要对苹果提起反垄断诉讼。它让小企业为用户追踪进行辩护,声称当一个巨大的公司对数十亿人进行监视时,这是一种小企业的发展形式。

 

- EFF - Facebook说苹果太强大了。他们是对的。

注:2022-08-11添加。Meta公司正在遵循ATT(应用程序跟踪透明度)的规则(作为文章底部的注释添加)。我解释上述内容是为了提供一些背景,说明为什么从第三方网站/应用程序获取数据是一件大事。这篇文章的信息是关于iOS Instagram应用如何主动注入和执行第三方网站的JavaScript代码,使用他们的应用内浏览器。这篇文章没有谈论事情的法律层面,而是谈论正在发生的事情的技术实现,以及技术层面上的可能性。

 

非技术类读者的常见问题

  • Instagram/Facebook可以读取我在网上做的一切吗?不可以! Instagram只有在你从他们的应用程序中打开链接或广告时才能阅读和观察你的在线活动。
  • Facebook是否真的会窃取我的密码、地址和信用卡号码?没有!我没有证明确切的数据。我没有证明Instagram正在追踪的确切数据,但想展示一下他们能在你不知情的情况下获得什么样的数据。正如过去所显示的那样,如果一家公司有可能合法地、免费地获取数据,而不需要征求用户的同意,他们就会追踪这些数据。
  • 我怎样才能保护自己?有关完整的细节,请向下滚动到文章的结尾。摘要:每当你从Instagram(或Facebook或Messenger)打开一个链接时,一定要点击角落里的小圆点,以代替在Safari浏览器中打开该页面。
  • Instagram是故意这么做的吗?我不能说内部是如何做出决定的。我只能说,建立你自己的应用内浏览器需要花费非同小可的时间来编程和维护,比使用过去7年已经内置于iPhone的隐私和用户友好的替代方案要多得多。

什么会被注入?

Instagram应用程序注入的外部JavaScript文件是(connect.facebook.net/en_US/pcm.js),这是建立与主机应用程序通信的桥梁的代码。根据Meta在回应本出版物时提供给我的信息,它有助于汇总事件,即在线购买,然后再将这些事件用于Facebook平台的定向广告和测量。

免责声明

我没有Instagram发回国内的精确数据清单。我确实有证据表明,Instagram和Facebook应用程序积极运行JavaScript命令,在未经用户同意的情况下注入一个额外的JavaScript SDK,以及跟踪用户的文本选择。如果Instagram已经在这样做了,他们也可以注入任何其他的JavaScript代码。Instagram应用程序本身对中间人攻击有很好的保护,而且只能通过修改安卓二进制文件来删除证书钉住,并在模拟器中运行它。

 

总的来说,这个项目的目标并不是要得到一份被送回的数据清单,而是要强调使用应用内浏览器所带来的隐私和安全问题,以及证明像Instagram这样的应用已经在利用这个漏洞了。

总结一下拥有应用内浏览器的风险和弊端。

  • 隐私和分析。主机应用可以跟踪网站上发生的一切,每一次点击、输入、滚动行为、哪些内容被复制和粘贴,以及显示的数据,如在线购买
  • 窃取用户凭证、物理地址、API密钥等。
  • 广告和推荐。主机应用可以将广告注入网站,或替换广告API密钥以窃取主机应用的收入,或替换所有URL以包括你的推荐代码(这种情况以前发生过)
  • 安全性。浏览器多年来一直在优化网络的安全用户体验,比如显示HTTPs的加密状态,警告用户有可疑或未加密的网站,等等。
  • 在第三方网站上注入额外的JavaScript代码会导致问题和故障,有可能会破坏网站。
  • 用户的浏览器扩展和内容阻止器不可用
  • 深度链接在大多数情况下效果不好
  • 通常没有简单的方法通过其他平台分享链接(如通过电子邮件、AirDrop等)。

Instagram的应用内浏览器支持自动填写你的地址和支付信息。然而,这并没有合法的理由存在,所有这些都已经内置于操作系统,或网络浏览器本身。

测试各种Meta的应用程序

Instagram iOS Messenger iOS

eb56753713104539

 

89b151000e104555

 

Facebook iOS Instagram Android

e59938e738104610

 

4b3a65e147104624

 

WhatsApp是默认打开iOS Safari的,因此没有问题。

 

它是如何工作的

据我所知,目前还没有好的方法来监控iOS主机应用程序执行的所有JavaScript命令(如果有更好的方法,我想听听)。

我创建了一个新的、普通的HTML文件,用一些JS代码来覆盖一些文档的方法。

document.getElementById = function(a, b) {
    appendCommand('document.getElementById("' + a + '")')
    return originalGetElementById.apply(this, arguments);
}

从iOS Instagram应用程序中打开该HTML文件,结果如下。

1b1973f556104859

将此与使用普通浏览器时的情况相比较,或者在本例中,Telegram使用推荐的SFSafariViewController

abd822da72104922

正如你所看到的,一个普通的浏览器,或SFSafariViewController并不运行任何JS代码。SFSafariViewController是应用开发者向用户展示第三方网络内容的一个很好的方式,他们不需要离开你的应用,同时还能为用户保留隐私和舒适。

技术细节

28e4931569104956

 

  • Instagram增加了一个新的事件监听器,以获得用户每次在网站上选择任何文本的细节。这与监听屏幕截图相结合,使Instagram能够充分了解哪些特定的信息被选择和分享。
  • Instagram应用程序检查是否有一个ID为iab-pcm-sdk的元素。根据这条推文,iab可能指的是 "应用程序内浏览器"。
  • 如果没有找到ID为iab-pcm-sdk的元素,Instagram就会创建一个新的脚本元素,将其来源设置为https://connect.facebook.net/en_US/pcm.js
  • 然后,它在你的网站上找到第一个脚本元素,将pcm的JavaScript文件插入正前方。
    Instagram也会在你的网站上查询iframes,然而我找不到任何关于他们要做什么的指示。

作为一个用户,如何保护自己?

当你在查看外部网站时点击右上方的3个点时,Instagram iOS应用的截图,该截图允许人们在其默认浏览器中打开该页面

逃离应用内浏览器

大多数应用内浏览器都有办法在Safari中打开当前渲染的网站。只要你登陆那个屏幕,就用那个选项来逃避它。如果没有那个按钮,你将不得不复制&粘贴URL,在你选择的浏览器中打开链接。

ca1a308d8b105135

 

使用网页版

大多数社交网络,包括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浏览器。如果你知道一个解决方案,我很想知道

2022-08-11的更新。作为对这篇文章的回应,阿德里安发表了一篇关于这个确切主题的文章

 

提案

对于苹果公司

苹果公司在建立他们的平台时考虑到了用户的隐私,做得非常好。4项隐私原则之一。

用户的透明度和控制。确保用户知道哪些数据被共享,如何使用,并且他们可以对其进行控制。

 

- 苹果公司隐私权PDF(2021年4月)

在写这篇文章的时候,没有任何AppStore审查规则禁止公司建立自己的应用内浏览器来跟踪用户,读取他们的输入,并向第三方网站注入额外广告。然而苹果明确建议,要使用SFSafariViewController。

避免使用网络视图来构建一个网络浏览器。使用网络视图让人们在不离开你的应用程序的情况下短暂地访问一个网站是可以的,但Safari是人们浏览网络的主要方式。试图在你的应用程序中复制Safari的功能是不必要的,也是不鼓励的。

 

- 苹果人机界面指南(2022年6月)

如果你的应用程序让用户从互联网的任何地方查看网站,请使用SFSafariViewController类。如果你的应用程序可以定制、互动或控制网页内容的显示,请使用WKWebView类。

 

- 苹果SFSafariViewController文档(2022年6月)

 

应用程序绑定域介绍(App-Bound Domains)

App-Bound Domains 是一项优秀的 WebKit 新功能,使开发者在使用 WKWebView 时能够提供更安全的应用内浏览体验。作为一个应用程序的开发者,您可以定义您的应用程序可以访问哪些域,所有的网络请求将被限制在这些域中。要禁用这种保护,用户必须在iOS设置应用程序中明确禁用。

App-Bound Domains在iOS 14(约1.5年前)上线,但它只是开发者的一个选择,这意味着绝大多数iOS应用都没有利用这一功能。

如果SocialApp的开发者想获得更好的用户隐私体验,他们有两条路可以走。

  • 使用SafariViewController而不是WKWebView进行应用内浏览。SafariViewController通过在SocialApp的进程空间之外加载页面来保护用户数据免受SocialApp的影响。在使用SafariViewController时,SocialApp可以保证为其用户提供最佳的用户隐私体验。
  • 选择加入App-Bound Domains。来自App-Bound Domains的额外WKWebView限制确保SocialApp无法使用上述的API来追踪用户。

 

我强调了 "希望有更好的用户隐私体验 "这一部分,因为这是缺失的部分。App-Bound Domains应该是所有iOS应用程序的要求,因为社交媒体应用程序是注入跟踪代码的。

2022年7月,苹果推出锁定模式,以更好地保护处于高风险的人。不幸的是,iOS锁定模式并没有改变应用内网络视图的工作方式。我已经向苹果公司提交了一份雷达:rdar://10735684,对此,苹果公司回应说:"这不是锁定模式的作用"

33a15ce859105617

对Meta而言

做Meta对WhatsApp已经在做的事。停止修改第三方网站,并对所有第三方网站使用Safari或SFSafariViewController。这是对用户最好的,也是正确的做法。

我已经通过Meta的Bug Bounty Program向他们披露了这个问题,在几个小时内,他们确认他们能够重现这个 "问题",然而在过去9周内,除了要求我等待更长的时间直到他们有一个完整的报告外,我没有听到任何其他回复。由于我的后续问题没有得到任何回应,他们也没有停止向外部网站注入跟踪代码,我决定将这些信息公之于众(在再给他们两个星期的提示后)。

 

2022-08-11更新(信息由Meta提供)

出版物上线后,Meta公司发了两封邮件,澄清了他们那边的情况。我针对他们的意见,下面的内容有了变化。

被注入的脚本不是Meta Pixel,而是pcm.js脚本,据Meta称,该脚本有助于汇总事件,即在线购买,然后再将这些事件用于Facebook平台的定向广告和测量
据Meta公司称,注入的脚本(pcm.js)有助于Meta公司尊重用户的ATT选择,这只有在渲染的网站安装了Meta Pixel时才有意义。然而,就我的理解而言,如果Instagram打开手机的默认浏览器,而不是建立和使用定制的应用内浏览器,所有这些就没有必要了。

我给Meta发了几个后续问题--一旦我收到回复,我将相应地更新帖子,并在Twitter上宣布这些变化。

同时,这篇文章中发表的所有内容都是正确的:Instagram应用程序正在执行并向第三方网站注入JavaScript代码,在其应用内浏览器中呈现,这给用户带来了很大的风险。此外,没有办法选择退出定制的应用内浏览器。

由于Meta向我提供了更多的背景和细节,我已经更新了帖子以反映这一点。你可以在这里找到这个帖子的完整历史,以及哪些部分被编辑了。

请查看我的其他隐私和安全相关的出版物。

原文链接

https://krausefx.com/blog/ios-privacy-instagram-and-facebook-can-track-anything-you-do-on-any-website-in-their-in-app-browser?s=09

 
 
标签:学习笔记