上周,我发布了一份关于使用应用内浏览器的移动应用风险的报告。一些应用程序,如 Instagram 和 Facebook,将 JavaScript 代码注入第三方网站,这会给用户带来潜在的安全和隐私风险。
我很高兴看到这篇文章被TheGuardian和The Register等全球主要媒体报道,在 Twitter 上产生了超过一百万的印象,并在 HackerNews 上排名第一超过 12 小时。在阅读了回复和 DM 之后,我看到了整个社区的一个常见问题:
“我如何验证应用程序在其 Web 视图中的作用?”
介绍InAppBrowser.com ,这是一个简单的工具,用于列出渲染页面的 iOS 应用程序执行的 JavaScript 命令。
要自己尝试这个工具:
- 打开要分析的应用
- 在应用程序内的某处分享 URL https://InAppBrowser.com (例如,向朋友发送 DM,或发布到您的提要)
- 点击应用内的链接将其打开
- 阅读屏幕上的报告
我开始使用这个工具来分析最流行的拥有自己应用内浏览器的 iOS 应用。以下是我找到的结果。
对于这个分析,我排除了所有第三方 iOS 浏览器(Chrome、Brave 等),因为它们使用 JavaScript 来提供一些功能,比如密码管理器。 Apple 要求所有第三方 iOS 浏览器应用程序使用 Safari 渲染引擎WebKit
。
重要提示:此工具无法检测所有执行的 JavaScript 命令,也不会显示应用程序可能使用本机代码(如自定义手势识别器)进行的任何跟踪。下面有更多细节。
完全开源
InAppBrowser.com旨在让每个人都可以自己验证应用在其应用内浏览器中的操作。我决定将用于此分析的代码开源,您可以在GitHub 上查看。这允许社区随着时间的推移更新和改进此脚本。
拥有自己的应用内浏览器的 iOS 应用
- 在默认浏览器中打开的选项:应用程序是否提供了一个按钮来在默认浏览器中打开当前显示的链接?
- 修改页面:应用程序是否将 JavaScript 代码注入第三方网站以修改其内容?这包括添加跟踪代码(如输入、文本选择、点击等)、注入外部 JavaScript 文件以及创建新的 HTML 元素。
- 获取元数据:应用程序是否运行 JavaScript 代码来获取网站元数据?这是一件无害的事情,不会造成任何真正的安全或隐私风险。
- JS :我能够检测到的 JavaScript 代码的链接。免责声明:可能执行了其他代码。该代码可能不是所有 JS 命令的 100% 准确表示。
应用程序 | 在默认浏览器中打开的选项 | 修改页面 | 获取元数据 | JS | 更新 |
---|---|---|---|---|---|
抖音 | ⛔️ | 是的 | 是的 | .js | 2022-08-18 |
✅ | 是的 | 是的 | .js | 2022-08-18 | |
脸书信使 | ✅ | 是的 | 是的 | .js | 2022-08-18 |
✅ | 是的 | 是的 | .js | 2022-08-18 | |
亚马逊 | ✅ | 没有任何 | 是的 | .js | 2022-08-18 |
Snapchat | ✅ | 没有任何 | 没有任何 | 2022-08-18 | |
罗宾汉 | ✅ | 没有任何 | 没有任何 | 2022-08-18 |
单击上表中的Yes
或None
以查看应用程序的屏幕截图。
重要提示:仅仅因为应用程序将 JavaScript 注入外部网站,并不意味着该应用程序正在做任何恶意的事情。我们无法详细了解每个应用内浏览器收集的数据类型,或者数据传输或使用的方式或是否被使用。该出版物说明了每个应用程序执行的 JavaScript 命令,并描述了每个命令可能产生的影响。有关应用内浏览器风险的更多背景信息,请查看上周的出版物。
即使上面的一些应用程序有绿色复选标记,它们也可能使用新的WKContentWorld
隔离 JavaScript,我将在下面描述。
TikTok 监控所有键盘输入和敲击
当您在 TikTok iOS 应用上打开任何链接时,它会在其应用内浏览器中打开。当您与网站互动时, TikTok 会订阅所有键盘输入(包括密码、信用卡信息等)以及屏幕上的每次点击,例如您点击了哪些按钮和链接。
- TikTok iOS 订阅在 TikTok 应用程序内呈现的第三方网站上发生的每一次击键(文本输入)。这可能包括密码、信用卡信息和其他敏感的用户数据。 (
keypress
和keydown
)。我们不知道 TikTok 将订阅用于什么目的,但从技术角度来看,这相当于在第三方网站上安装键盘记录器。 - TikTok iOS 订阅在 TikTok 应用程序内呈现的网站上的任何按钮、链接、图像或其他组件的每次点击。
- TikTok iOS 使用 JavaScript 函数来获取有关用户单击的元素的详细信息,例如图像 (
document.elementFromPoint
)
这是我能够检测到的所有 JavaScript 命令的列表。
Instagram 不仅仅是插入pcm.js
上周的帖子谈到了 Meta 如何将pcm.js
脚本注入第三方网站。 Meta 声称他们只注入脚本以尊重用户的 ATT 选择,以及额外的“安全和用户功能”。
有问题的代码允许我们通过帮助聚合网站上已有像素的事件(例如在线购买),然后再将这些事件用于广告或测量目的,从而尊重人们的隐私选择。
在改进了 JavaScript 检测之后,我现在发现 Instagram 执行了一些额外的命令:
- Instagram iOS 订阅在 Instagram 应用程序内呈现的外部网站上的任何按钮、链接、图像或其他组件的每次点击。
- 每次用户在 Instagram 应用程序内呈现的第三方网站上选择 UI 元素(如文本字段)时,Instagram iOS 都会订阅。
这是我能够检测到的所有 JavaScript 命令的列表。
订阅注意事项:当我谈到“应用订阅”时,我的意思是应用订阅了该类型的 JavaScript 事件(例如所有点击)。无法验证数据会发生什么。
应用程序可以通过此工具隐藏其 JavaScript 活动
从 iOS 14.3(2020 年 12 月)开始,Apple 引入了对在指定框架和内容世界的上下文中运行 JavaScript 代码的支持。使用这种方法执行的 JavaScript 命令仍然可以完全访问第三方网站,但不能被网站本身检测到(在这种情况下是像 InAppBrowser.com 这样的工具)。
使用 WKContentWorld 对象作为命名空间,将您的应用程序的 Web 环境与您执行的单个网页或脚本的环境分开。内容世界有助于防止两个脚本以冲突方式修改环境变量时出现的问题。 […] 无论内容世界如何,您对 DOM 所做的更改对所有脚本代码都是可见的。
这个新系统最初是为了让网站运营商无法干扰浏览器插件的 JavaScript 代码,并使指纹识别更加困难。作为用户,您可以检查任何浏览器插件的源代码,因为您可以控制浏览器本身。但是,对于应用内浏览器,我们没有可靠的方法来验证所有执行的代码。
因此,当 Meta 或 TikTok 想要隐藏他们在第三方网站上执行的 JavaScript 命令时,他们需要做的就是更新他们的 JavaScript 运行器:
// Currently used code by Meta & TikTok self . evaluateJavaScript ( javascript ) // Updated to use the new system self . evaluateJavaScript ( javascript , in : nil , in : . defaultClient , completionHandler : { _ in })
例如,Firefox for iOS 已经使用了新的 WKContentWorld 系统。由于 Firefox 和 iOS 版 Google Chrome 的开源特性,我们作为一个社区很容易验证没有发生任何可疑事件。
尤其是在上周的帖子和这篇帖子公开之后,仍然使用自定义应用内浏览器的科技公司将很快更新为使用新的WKContentWorld
隔离 JavaScript 系统,因此我们无法检测到他们的代码。
因此,找到一种解决方案来终止使用自定义应用内浏览器来显示第三方内容变得比以往任何时候都更加重要。
应用内 Web 视图的有效用例
使用应用内浏览器有很多正当理由,尤其是当应用访问自己的网站以完成特定交易时。例如,航空公司应用程序可能没有为其整个机队本地实施座位选择。相反,他们可能会选择重用他们已有的网络界面。如果他们无法在他们的 web 视图中注入 cookie 或 JavaScript 命令,用户将不得不在使用该应用程序时重新登录,以便他们可以选择他们的座位。向 Venmo 致敬,它使用自己的应用内浏览器访问所有内部网站(例如服务条款),但只要您点击外部链接,它们就会自动转换到SFSafariViewController
。
但是,当您使用应用内浏览器访问非第一方网站时,会出现数据隐私和完整性问题,例如 Instagram 和 TikTok 如何在其应用内显示所有外部网站。更重要的是,这些应用很少提供默认使用标准浏览器的选项,而不是应用内浏览器。在某些情况下(如 TikTok),默认浏览器中没有打开当前显示页面的按钮。
使用 Safari 的 iOS 应用程序
以下应用程序遵循 Apple 的建议,即使用 Safari 或SFSafariViewController
查看外部网站。更多关于SFSafariViewController
的内容请参见原文。
所有使用SFSafariViewController
或Default Browser
的应用程序都是安全的,即使使用新的WKContentWorld
系统,应用程序也无法将任何代码注入网站。
应用程序 | 技术 | 更新 |
---|---|---|
推特 | SFSafariViewController | 2022-08-15 |
红迪网 | SFSafariViewController | 2022-08-15 |
默认浏览器 | 2022-08-15 | |
松弛 | 默认浏览器 | 2022-08-16 |
谷歌地图 | SFSafariViewController | 2022-08-15 |
YouTube | 默认浏览器 | 2022-08-15 |
邮箱 | 默认浏览器 | 2022-08-15 |
电报 | SFSafariViewController | 2022-08-15 |
信号 | SFSafariViewController | 2022-08-15 |
推特机器人 | SFSafariViewController | 2022-08-15 |
Spotify | 默认浏览器 | 2022-08-15 |
文莫 | SFSafariViewController | 2022-08-15 |
微软团队 | 默认浏览器 | 2022-08-16 |
微软展望 | 默认浏览器或边缘 | 2022-08-16 |
微软 OneNote | 默认浏览器 | 2022-08-16 |
抽搐 | 默认浏览器 | 2022-08-16 |
我们能做什么?
作为应用程序的用户
如何逃离 Instagram 应用内浏览器的演示视频
大多数应用内浏览器都有办法在 Safari 中打开当前显示的网站。一旦您进入应用内浏览器,请使用“ Open in Browser
功能切换到更安全的浏览器。如果该按钮不可用,您必须复制并粘贴 URL 才能在您选择的浏览器中打开链接。如果应用程序很难做到这一点,您可以点击并按住网站上的链接,然后使用复制功能,这可能有点棘手。
TikTok 没有在默认浏览器中打开网站的按钮。
使用应用内浏览器的公司
如果您所在的公司拥有应用内浏览器,请仅将其用于您自己的页面,并在用户的默认浏览器中打开所有外部链接。此外,提供一项设置,让用户在应用内浏览器体验中选择默认浏览器。不幸的是,这些类型的更改很少优先于在技术组织内部移动指标的功能。但是,对于人们来说,教育团队中的其他人和他们的经理了解为用户做出更好的安全和隐私决策的积极影响非常重要。这些变化可以透明地向用户推销,作为建立进一步信任的机会。
主要科技公司
重要的是要指出数据空间隐私方面发生了多少变化,但尚不清楚这些变化中有多少是动态的,而不是行业和用户的真正进步。
“许多科技公司因‘滥用用户隐私’而受到抨击,而实际上他们试图平衡业务优先级、出色的用户体验,并确保他们尊重隐私和用户数据。很明显,为什么公司首先有动力为外部网站提供应用内体验。
借助最新技术,公司可以开始为用户提供流畅的体验,同时尊重他们的隐私。 iOS 或 Android 开发人员有可能将隐私标准和责任转移给 Apple 和 Google(例如更严格的应用程序审查、更多权限屏幕等),但这是一个更大的对话,公司需要共同努力来定义应该使用哪些标准存在。我们不能让一两家公司为整个行业设定方向,因为解决方案需要适用于大多数公司。否则,我们将被迫在一个世界中,公司被迫创造性地寻找方法从任何可能的来源跟踪额外的用户数据,或者定义他们自己的最有利于用户隐私的标准,最终损害消费者和产品体验。 ”
技术方面的App-Bound Domains似乎是一项出色的 WebKit 新功能,使开发人员可以在使用WKWebView
时提供更安全的应用内浏览体验。作为应用程序开发人员,您可以定义您的应用程序可以访问哪些域(您自己的),并且您将无法再控制第三方页面。要禁用保护,用户必须在 iOS 设置应用程序中明确禁用它。但是,在撰写本文时,该系统尚未默认启用。
非技术读者的常见问题解答
- 应用内浏览器可以读取我在网上所做的一切吗?不!只有当您从他们的应用程序中打开链接或广告时,他们才能阅读和观看您的在线活动。
- 上面的应用程序真的会窃取我的密码、地址和信用卡号码吗?不!我想展示不良行为者可以通过这种方法访问这些数据。如过去所示,如果一家公司可以合法且免费地访问数据,而无需征求用户的许可,他们就会对其进行跟踪。
- 我该如何保护自己?每当您从任何应用程序打开链接时,请查看该应用程序是否提供在您的默认浏览器中打开当前显示的网站的方法。在此分析期间,除 TikTok 之外的每个应用程序都提供了一种方法来做到这一点。
- 公司是故意这样做的吗?构建您自己的应用内浏览器需要花费大量时间来编程和维护,而不仅仅是使用过去 7 年来已经内置在 iPhone 中的隐私和用户友好的替代方案。公司很可能有一些动机来跟踪您在这些网站上的活动。
- 我在一个应用程序中打开了 InAppBrowser.com,它没有显示任何命令。我安全吗?不!首先,该网站只检查数百个攻击向量之一:来自应用程序本身的 JavaScript 注入。即使对于那些,截至 2020 年 12 月,应用程序开发人员也可以完全隐藏他们执行的 JavaScript 命令,因此我们无法验证幕后实际发生了什么。