亚马逊助理让亚马逊跟踪网络上的每一个举动

2021-03-11 00:21:08

我最近注意到亚马逊正在积极地推广他们的亚马逊助理延期。凭借成功:虽然并非所有浏览器供应商提供可用的扩展统计数据,但似乎这个延期超过了Firefox,Chrome,Opera和Edge的1000万用户。原因足以研究这个扩展正在做什么以及如何。

在这里,我必须说,对购物助手的隐私期望并不高。尽管如此,我仍然惊讶地发现亚马逊建造了完美的机器,让他们跟踪任何亚马逊助理用户或他们所有人:他们在Web上搜索的是多长时间,他们登录的是什么帐户。亚马逊也可以弄乱Web体验,例如劫持竞争对手的网站商店。

介意你,我并不是说亚马逊目前正在这样做。虽然我没有完成分析代码,但到目前为止一切都表明Amazon Assistant只是传输您访问的网页的域名而不是完整地址。所有网站操纵似乎都与延期的目的一致。但由于所有扩展权限都委派给Amazon Web服务,因此不可能确保它始终是这样的。如果对于一些亚马逊助理用户,“胡佛所有数据”模式已打开,没有人会注意到。

在第一眼看来,亚马逊助手只是在点击扩展名图时出现的面板。它将显示您当前的亚马逊交易,让您跟踪您的订单并管理购买的项目列表。到目前为止,非常局限于亚马逊本身。

什么并不完全明显:“添加到列表”将尝试识别当前浏览器选项卡中显示的产品。这不仅可以在亚马逊属性上工作。在某些其他网站上单击此按钮将嵌入Amazon Assistant进入该网页,并为您提供将此项目添加到Amazon Wishlist中。

但亚马逊助理也将自己变得活跃。您在谷歌上寻找“PlayStation”吗?亚马逊助理将在谷歌广告的顶部显示其信息,因为您可能想在亚马逊上购买。

因此,您已经猜测亚马逊助理将要求亚马逊Web服务在任何特定网站上做什么:如何识别搜索,如何提取产品信息。商店太多了,可以在扩展中保留所有这些信息。作为对亚马逊业务肯定有益的副作用,亚马逊将了解您访问的网站以及您在那里搜索的网站。这是您对此延期的不可避免的隐私费用。但它不会在这里停留。

让我们先看看允许这个扩展名的事情。这是扩展名单中的权限条目:

这真的很有特权。第一笔记http:// * / *和https:// * / *:扩展名可以访问每个网站和每个网站(我切断了此处无关的亚马逊属性的长名单)。如果它想要将其内容注入那里,这是必要的。然后,选项卡权限允许识别在创建或删除选项卡时,并且当新页面加载到选项卡时。

存储权限允许扩展保持持久设置。其中一个设置称为UBPv2.identity.InstallationID,并包含(您猜测了它)此Amazon Assistant安装的唯一标识符。即使您退出亚马逊并清除Cookie,此标识符也将持续并允许Amazon将您的活动连接到您的身份。

另外两个权限也是不熟产的。通知权限可能会允许扩展显示桌面通知,以便您可以让您更新您的订单状态。 ContextMenus权限允许它在浏览器的上下文菜单中添加“添加到Amazon列表”项。

然而,Cookies许可是异常的。原则上,它允许扩展访问任何网站上的cookie。然而,目前仅用于访问亚马逊cookie以识别用户登录时。如果在亚马逊网站上访问Document.Cookie,则可以在没有此权限的情况下实现同样的一个案例)。

即使是奇特是管理许可,只能由Firefox扩展请求但不是Chrome一个。此权限提供对其他浏览器扩展的扩展访问,甚至允许卸载它们。要求它非常不寻常,并提出怀疑。然而,只有代码可以调用Management.Uninstallself()和Management.getSelf(),这两个功能不需要此权!甚至此代码似乎未使用。

现在,扩展要求广泛达到特权并不罕见。请求当前未使用的权限甚至不寻常,提示谷歌在其Chrome Web Store策略中禁止缩略。这里的不寻常部分是将所有这些功能传输到Amazon Web属性的几乎。

当您开始查看扩展程序如何使用其权限时,很难忽略它似乎是空壳的事实。是的,有一个相当数量的代码。但所有这一切都只是胶水代码。任何地方都没有扩展的用户界面和任何逻辑都可以在任何地方找到。这是怎么回事?如果在Developer Tools中检查了分机的后台页面,则会更清晰:

是的,那是一个八个远程帧加载到扩展后的后台页面,所有这些都指向亚马逊域。和第九次远程帧加载时单击扩展名图标时,它包含上面显示的面板的用户界面。所有这些面板通过Amazon的内部UBP协议互相通信和扩展,通过Window.PostMessage()交换邮件。

扩展如何知道在帧中加载哪些页面以及应该允许这些页面进行操作?它没有,此信息从Amazon Server下载为FeatureManifest.js。此文件定义了许多“进程”,每个“进程”都包含提供和消费的API和事件的列表。虽然扩展代码确保只访问允许访问的进程,但Amazon Web服务上的此文件设置规则。

以下是此文件目前要对AawishListProcess的说法,一个特别强大的进程:

" aawishlistprocess" :{" Manifestversion" :" 2015-03-26" ,"清单" :{"姓名" :" aawishlistprocess" ,"版本" :{"主要" :1,"次要" :1," Build" :1,"修订版" :1},"启用" :真实," processtype" :" remote" ,"配置" :{" url" :" https://horizo​​nte.browserapps.amazon.com/wishlist/aa-wishlist-process.html" ," assettag" :" window.etag = \" e19e28ac-784e-4e22-8e2b-6d36a9d3aaf2 \&#34 ;; window.lastupdated = \" 2021-01-14T22:57:46.4222Z \&#34 ;;" }," confecedapis" :{"身份" :[" getallweblabtreatments" ," getCustomerPreferences" ],"档案" :[" buildurls" ],"平台" :[" getplatforminfo" ," getuwlitem" ," getActivetabinfo" ,"牧场和#34; ," createSandbox" ," createsandboxbyid" ," createlocalsandbox" ," modifysandbox" ," showsandbox" ," sendmessagetosandbox" ," destroyandbox" ,"刮伤" ," listenerspecificiedscrape" ," ApplyStyle" ," ResetStyle" ,#34;注册和#34; ," deregisteraction" ," createcontextmenuitem" ," deleteallcontextmenuitems" ," deletecontextmenuitembyid" ," getcookieinfo" ," bulkgetcookieinfo" ," getstoragevalue" ," putstoragevalue" ," deletestoragevalue" ,"发布" ],"记者" :[" Appendmetricdata" ],"存储" :["获得" ,#34;放" ," putifabsent" ,"删除" ]},"消费" :["标签.PageTurn" ," tabs.onremoved" ," sandbox.message.ubpsandboxmessage" ,"动作.message" ," platform.platformdataupdate" ," contextmenu.itemclicked.aawishlistprocess" ," Identity.CustomerPreefercessupdate" ," gateway.addtolistClick" ],"提供" :{},"提供者" :[" Histlist.update" ," storage.onchange。*" ," storage.onchange。*。*" ," storage.onchange。*。*。*。*。*。*" ," storage.onchange。*。*。*。*。*。*。*" ," storage.onchange。*。*。*。*。*。*" ," storage.ondelete。*" ," storage.ondelete。*。*" ," storage.ondelete。*。*。*。*。*。*。*" ," storage.ondelete。*。*。*。*。*。*" ," storage.ondelete。*。*。*。*。*。*" ]," CTI" :{"类别" :" amazonassistantant" ,"类型" :"订婚" ,"项目" :"愿望清单" }}},

有趣的消费API是属于平台的API:“进程”由扩展提供。因此,扩展程序允许本网站在其他内容请求有关“活动”选项卡的信息,创建上下文菜单项,检索Cookie和访问扩展名存储。

我们不必推测,很容易尝试解决这个网站允许做的事情。为此,更改为开发人员工具中的控制台选项卡,并确保将AA-Wishlist-process.html选择为上下文而不是顶部。现在输入以下命令确保已记录传入的消息:

注意:对于我来说,console.log()没有在Firefox上的背景页面的帧内工作,所以我必须在Chrome上执行此操作。

父母。 PostMessage({Mtype:0,来源:" aawishListprocess",有效载荷:{msgid:" test",mtype:" rpcsendandreceive",有效载荷:{header:{messageType :2,名称:"订阅",命名空间:" platformhub"},数据:{args:{eventname:" tabs.pageTurn"}}}}}}}}}, " *");

来自PlatformHub的一条消息,指示呼叫成功("错误&#34 ;: null)。好的,如果我们现在在一个新的选项卡中打开https://example.com/ ......三个消息进来,第一个指示页面正在加载的消息,第二个消息,其标题现在已知,最后是第三个指示页面加载的第三个消息:

{" mtype" :0,"来源" :"平台Hub" ,"有效载荷和#34; :{" msgd" :" 3eee7d9b-ee2b-4f1d-be92-693119b5654c" ," mtype" :" rpcsend" ,"有效载荷和#34; :{"标题" :{" messageType" :2,"姓名" :"发布" ,"名称空间" :"平台Hub" ," sourceprocessname" :"平台" ," ExtensionStage" :" prod" },"数据" :{" args" :{" eventname" :"标签.PageTurn" ," Eventargs" :{" tabid" :" 31" ," url" :" http://example.com/" ,"状态" :"完成" ,"标题" :"示例域名" }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}

是的,这基本上是标签。oonupdated扩展API暴露于网页。选项卡.OnOremoved事件类似地,该选项卡。曝光的扩展API。

父母。 PostMessage({Mtype:0,来源:" aawishListprocess",有效载荷:{msgid:" test",mtype:" rpcsendandreceive",有效载荷:{header:{messageType :1,名称:" getcookieinfo",命名空间:"平台"},数据:{args:{url:" https://www.google.com/&# 34;,cookiename:"同意"}}}}," *");

{" mtype" :0,"来源" :"平台Hub" ,"有效载荷和#34; :{" msgd" :" fefc2939-70c3-4138-8bb6-a6120b57e563" ," mtype" :" rpcreply" ,"有效载荷和#34; :{" cookiemound" :真实," cookieinfo" :{"姓名" :"同意" ,"域名" :" .google.com" ,"价值" :"待+ 376" ,#34;道路" :" /" ,"会议" :假," expirydate" :2145916800.121322}}," t" :1615035509370," rmsgid" :"测试" ,"错误" : 空值 } }

是的,这是我在google.com上的同意cookie。所以这是这个页面可用的很多cookies.get()扩展API。

在扩展名图标上显示“徽章”(通常是指示未读消息的数字)

查询有关任何选项卡中页面的信息,单击元素,发送输入和键盘事件

对应WebRequest API侦听器(此功能当前处于非活动状态,扩展名没有WebRequest权限)

鉴于延期的特权,这里缺少并不多。管理权限在我之前提到的,因此列出已安装的扩展是不可能的。 cookie访问是只读的,设置cookie是不可能的。常规网页访问权限似乎停止任意代码执行。但是吗?

CreateSandbox调用可以与任何帧地址一起使用,没有执行检查。这意味着一个JavaScript:地址也是可能的。因此,如果我们在aa-wishlist-process.html的上下文中运行以下代码:

父母。 PostMessage({Mtype:0,来源:" aawishListprocess",有效载荷:{msgid:" test",mtype:" rpcsendandreceive",有效载荷:{header:{messageType :1,名称:" createAndbox",命名空间:"平台"},数据:{args:{tabid:31,沙箱特性:{proxy:" javascript:警报(文档。域)//",网址:"测试",sandboxCSSSpecification:"无"}}}}}}" *&#34);

是的,弹出消息,表示在example.com域的上下文中成功执行了JavaScript代码。因此,亚马逊服务至少有一种方法可以使用您访问的网页进行任何操作。然而,这种特殊的攻击仅在Chrome上工作,而不是Firefox。

正如我已经在上一篇文章中指出的那样,很难建立一个无法从某些服务器收到所有配置的购物助手。这使得购物助理通常是隐私危害。所以也许这种隐私和安全灾难是不可避免的?

不,在大多数方面,这不是这种情况。亚马逊的遥控程序“不是一些服务器端魔法。它们只是在帧中运行的静态JavaScript文件。将这些JavaScript文件放入扩展名,几乎没有代码更改。如果亚马逊感兴趣,它将开辟代码简化和性能改进的相当大潜力。

这种设计可能是合理的,“我们需要更快地部署变化”。但它真的是必要吗?上面提到的featuremanifest.js文件恰好包含组件的更新时间。在九个成分中,五个组成部分最新了五六多月前。一个月前,一个是在两个月前更新的另一个月。最近只更新了两个(四天和十二天前)。

似乎这些组件由在不同释放时间表上工作的不同团队维护。但即使亚马逊不能在这里对齐发布时间表,这看起来看起来不像打包所有代码,扩展将导致不合理的频繁版本。

为什么它会产生此代码的差异?这是做同样的代码,是否立即与扩展捆绑在一起或扩展只是从Web下载并提供必要的API,右边的访问权限吗?

除了:没有办法知道它总是相同的代码。例如,根据您的语言,Web上实际上没有单个FeatureManifest.js文件,而是6个。同样,它引用了15个版本的JavaScript文件。据推测,这只是将下载服务器调整到靠近您的下载服务器。所有这些文件中的逻辑应该完全相同。但我没有资源来验证这一点,也许亚马逊正在为巴西的用户提取更多数据。

这只是从外面看到的。如果一些美国政府机构要求亚马逊向特定用户的数据要求亚马逊怎么办?从理论上讲,亚马逊可以为该用户提供修改的FeatureManifest.js文件,其中一个让它们提供更多访问权限。这种攻击不会留下任何痕迹。没有理论上可以发现恶意代码的延期发布。没有。

这就是这里的问题:亚马逊助手是一个具有非常广泛的特权的扩展。这些如何使用?如果扩展中包含所有逻辑,我们可以分析它。然而,当事情现在是正确的,我们所能做的就是假设每个人都获得相同的逻辑。但这真的在亚马逊的唯一自由裁量权。

这里还有另一个方面。即使是亚马逊助手的常规功能也是侵入性的,扩展名让亚马逊知道您访问的每个网站以及一些搜索查询。在理论上,扩展名为禁用此功能的设置。在实践中,不可能验证扩展将始终尊重这些设置。

如果我们谈论GDPR等法律界限,亚马逊为亚马逊助理提供了隐私政策。我没有专家,但我的理解是,这符合法律要求,只要亚马逊确实符合这项政策。对于法律来说,亚马逊可以做什么并不重要。

这对于浏览器供应商来说是不同的,但是,谁对保持其扩展平台安全的兴趣。对于Mozilla,他们的附加政策州最简单的事情是最直接的:

虽然在技术上说话,但在这里,在扩展上下文中没有在扩展上下文中执行远程代码,委派所有扩展权限到远程代码在实践中没有任何区别。因此,亚马逊助理显然违反了Mozilla的政策,我们可以预期Mozilla在这里执行他们的政策。通过蜂蜜,另一个购物助理违反了这一规则,执法进程已经在第五个月内,延伸仍然可以在Mozilla附加组件上没有任何变化。好吧,也许在某些时候......

除非绝对必要的情况,您的扩展应该避免使用远程代码。使用远程代码的扩展需要额外的审查,从而导致较长的审查时间。将拒绝呼叫远程代码和不使用上面显示的字段声明和证明它的扩展。

这不是远程代码的真正禁令。相反,远程代码可以使用“绝对必要的”。然后,扩展作者需要声明并证明远程代码。因此,如果亚马逊助手有两种可能性:开发人员宣布此使用远程代码和Google接受了它。或者他们没有声明它,谷歌没有注意到这里加载的远程代码。我们没有办法知道哪个是真的,所以没有办法了解谷歌的政策是否被侵犯。这反过来意味着没有报告的政策违规,我们只能希望谷歌自行检测政策违规,这是过去无法真正依赖的事情。

不允许外部JavaScript。所有JavaScript代码都必须包含在扩展名中。外部API是可以的。

可以说,我们在这里有什么比“外部API”。因此,亚马逊助理也违反了歌剧的政策,我们可以预期在此处的执法行动。

最后,有Microsoft Edge。我在政策中可以找到的唯一有关的陈述读:

例如,您的扩展名不应下载远程脚本,然后以与所描述的乐趣不一致的方式运行该脚本

......