嫦美找到我时,整团体是解体的 —— “卡颂,我似乎被监督了”。
黄昏的星巴克,她的影子被吊灯拉得很长,哆嗦着似乎她此刻的心坎。
“怎样回事?”我尽量让声响听起来安静些。
“最近意识个男生,是我MBA同窗,对我很激情,也很懂我”嫦美环视周围,似乎随时会有什么物品从夜色中跳进去。
“缘分啊,这不很好嘛?”我笑着说。
“不是那种心有灵犀的懂,是那种「生存起居都被监督的懂」”嫦美解释道。不待我回应,又补充道:“这次约你进去,也是想让你帮助看看我电脑有没有被植入啥监听木马”。
说罢,从背包里取出MacBook Air递给我。
“Mac普通安保性都蛮高的,你最近没装啥去路不明的运行吧?”一边摆弄她的电脑,我一边问道。
“我也不会装运行,往常重要就上上网、刷刷剧”。
阅读完她的运行列表,我随手关上了阅读器,又习气性关上插件列表。
这时,一个阅读器插件吸引了我的留意:
“这是啥?”
“奥,咱们MBA的网课要求在这个平台看。这个平台很严,看课不能快进,也不能切换到其余页面。这是那个男同窗发我的,装了后就能打破这些限度,还挺繁难”说罢,嫦美皱了皱眉“和这个插件不会有相关吧?”
“不好说,等我看看插件源码”。
理想证实,这个插件真的有疑问......
阅读器插件为咱们上网提供了极大便利,比如:
实践上,阅读器插件除了能「剖析并修正原始页面」外,还能:
可以说,有心人只需应用切当,就能经过阅读器插件取得咱们上网的一切足迹。
这时,有人会说:“插件能做这些没错,但必需放开必要的权限,我不给他权限不就行了?”
理想真的这么繁难么?
《Building Browser Extensions》一书作者「Matt Frisbie」为了演示阅读器插件的潜在安保疑问,结构了一个「会放开所有49项权限」的chrome阅读器插件spy-extension[2]。
当你在阅读器装置这个插件后,阅读器确实会揭示你「插件放开的权限」:
不过,等等!明明放开了49项权限,这里为什么只显示5项?原来,窗口显示的内容行数有限,超出局部要求拖动滚动条才会显示。
可是,又有几个用户会发现「在放开的5项权限上方,滚动条前面还暗藏了44项权限呢」?
一旦有了权限,想做什么就取决于插件作者的构想力了。可以被用来做坏事的WebExtensions API十分多,比如:
后盾运转的Service Worker可以监听收回的网络恳求,并在恳求发送到网络之前修正它们。
这象征着插件可以经常使用Service Worker发送数据到主机,或许在用户阅读网页时阻拦恳求并发送额外的数据。
因为Service Worker运转于一个独立的后盾进程中,所以关上调试工具的Network面板看不到插件收回的恳求:
都有哪些有价值的数据可以搜集呢?
最繁难的,监听用户键盘输入:
[...document.querySelectorAll("input,textarea,[contenteditable]")].map((input) =>input.addEventListener("input", _.debounce((e) => {// 处置 用户输入}, 1000)));
除此之外:
上述API联合Service Worker传输数据,用户在插件作者背地无异于裸奔。
据嫦美示意 —— 她那个MBA同窗似乎知道她住哪儿,这是怎样做到的呢?很有或许是经过「失掉天文位置」的插件配置。
一个网课插件失掉天文位置,这不是太奇异了么?可是嫦美一点都没觉察,这是怎样办到的?
假设插件脚本失掉天文位置(经过navigator.permissions.query({ name: "geolocation" })),将征询用户授权。
但假设「被注入脚本的网站」曾经取得用户的天文位置授权,插件不要求授权就能静默经常使用对应配置。
举个例子,假设百度地图向你恳求「失掉天文位置」的授权,这很正当,你也大略率会赞同。
假设恶意插件可以向百度地图注入脚本,当你访问百度地图时,他就不用再失掉授权就能访问你的天文位置。
以上所说的一切配置都局限在 —— 插件向已有网站注入脚本。那插件能否能不被觉察的间接关上恶意网站呢?
答案是 —— 可以,我愿称其为「借尸还魂」之法。
而这些「闲置的Tab」就是最好的下手指标。
经常关上很多Tab
首先,插件经过以下代码挑选出闲置的Tab:
const tabs = await chrome.tabs.query({// 挑决定户没经常使用的Tabactive: false,// 挑决定户没有pin的Tab,pin的Tab经常使用频率通常比拟高pinned: false,// 不经常使用有音频的Tabaudible: false,// 经常使用曾经加载终了的Tabstatus: "complete",});// 挑选出闲置Tabconst [idleTab] = tabs.filter(/** ...省略其余挑选条件 **/)
只需恶意网站的题目、图标(favicon)与闲置Tab分歧,那么用恶意网站交流闲置Tab后,用户也不会有任何觉察。
举个例子,假设闲置Tab是React官方,那恶意网站只要求题目是React,图标是React,即使闲置Tab跳转到恶意网站,从Tab外观上也不可辨别。
上方的代码结构了恶意网站的url,其中「与闲置Tab分歧的题目、图标」保留在url searchParams中:
// 将题目、图标保留在searchParams中const searchParams = new URLSearchParams({returnUrl: idleTab.url,faviconUrl: idleTab.favIconUrl || "",title: idleTab.title || "",});const url = `${chrome.runtime.getURL("恶意网站.html")}?${searchParams.toString()}`;
恶意网站在url searchParams中取出题目、图标数据,并交流:
// 修正题目document.title = searchParams.get('title);// 修正图标document.querySelector(`link[rel="icon"]`).setAttribute("href", searchParams.get('faviconUrl'));
最后,用恶意网站交流闲置Tab的网站:
await chrome.tabs.update(idleTab.id, {url,active: false,});
恶意网站只要求在「做完坏预先」或「用户从新点击 闲置Tab 时」跳回原来的网站即可。代码如下:
const searchParams = new URL(window.location.href).searchParams;function useReturnUrl() {// 跳回原来网站window.location.href = searchParams.get('returnUrl');}if (document.visibilityState === "visible") {useReturnUrl();}// 用户访问了闲置Tabdocument.addEventListener("visibilitychange", () => useReturnUrl());// ...开局做坏事// 做完坏事,跳回原来网站useReturnUrl();
从用户的视角看,当他点击闲置Tab时,网站从新加载。关于一个闲置的Tab来说,从新访问时加载页面是再反常不过的逻辑。
只是用户不会知道,这并不是「网站从新加载」,而是「退回到前一个网站」。
有人会说 —— 我只经常使用那些信得过的插件。
但当天信得过的插件,明日就必定信得过么?在暗网中,「用户量大的收费阅读器插件」能卖不错的价钱。
为什么会有人收买这类「没有商业价值的收费插件」呢?一种或许是 —— 收买后向代码中投毒,只需用户更新插件就会中招。
所以,好用的插件不必定没疑问,当天没疑问的插件明日也不必定没疑问。
关于嫦美来说,技术上能做的只能是删除插件、肃清缓存、肃清cookie,分开一切的账号登录并修正明码。
但似乎更大的风险,来自理想环球......
Let's build a Chrome extension that steals everything:。
本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载联系作者并注明出处:https://www.clwxseo.com/wangluoyouhua/8858.html