Javascript 为什么Cloudfront在我的web应用程序中加载脚本?(我不使用它)

Javascript 为什么Cloudfront在我的web应用程序中加载脚本?(我不使用它),javascript,security,web-applications,xss,amazon-cloudfront,Javascript,Security,Web Applications,Xss,Amazon Cloudfront,我通过广泛使用jQuery管理一个安全的PHP/MySQL web应用程序。今天,我们的应用程序日志中出现了一个奇怪的错误: JS Error: Error loading script: https://d15gt9gwxw5wu0.cloudfront.net/js/_MY_WEB_APP_DOMAIN_/r.js 我们的应用程序中没有使用亚马逊的Cloudfront CDN。当我转到加载失败的URL时,只有以下内容: if(typeof _GPL.ri=='function'&&

我通过广泛使用jQuery管理一个安全的PHP/MySQL web应用程序。今天,我们的应用程序日志中出现了一个奇怪的错误:

JS Error: Error loading script:
https://d15gt9gwxw5wu0.cloudfront.net/js/_MY_WEB_APP_DOMAIN_/r.js
我们的应用程序中没有使用亚马逊的Cloudfront CDN。当我转到加载失败的URL时,只有以下内容:

if(typeof _GPL.ri=='function'&&!_GPL.isIE6){_GPL.ri('_GPL_r')}_GPL.rl=true;
用户的用户代理字符串为:

Mozilla/5.0 (Windows NT 6.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
请注意:我不是触发此错误的用户。是我们成千上万的用户触发了它。我无法控制客户端计算机

有人知道这里发生了什么吗?这是某种XSS攻击吗

**更新**

看来我不是唯一一个在他们的网站上发现这种异常现象的人。我发现,这似乎表明代码是无害的,但仍然没有答案,因为它来自哪里

此外,我发现,这似乎是某种广告脚本。再说一次,没什么帮助

**更新2**

更多内容:webapp使用了几个第三方jQuery插件,但没有任何第三方分析。所有脚本都托管在我们自己的服务器上,对我们所有代码的审核不会提供与“cloudfront”匹配的内容

该应用程序已投入生产约4年,这是此类活动的第一个也是唯一一个实例。这之前或之后都没有发生过,所以我怀疑我是否能够重现它


我感兴趣的是这是否是某种攻击。如果是,我想知道如果它还没有被堵住,如何堵住它试图利用的漏洞。

免责声明:我不是安全分析师/专家,你的问题只是激发了我的兴趣;)

警告:虽然我同意代码本身可能无害的初步结论,但基本技术也很可能被(ab)用于恶意目的,因此请您自己调查时小心

分析 你自己已经找到了相关的证据——进一步搜索,我发现了另一个更具可读性的证据,所以我用它来解释(虽然乍一看,另一个在格式化后也会允许这样做)

该代码段的JavaScript片段具有以下主要功能:

  • 第13行初始化变量
    \u GPL
    ,使用各种类型的项目供以后使用,例如各种常量、帮助函数、浏览器兼容性材料和实际有效载荷,例如:

    • 第20行定义了一个空的
      basdeCDN
      ,第21行定义了一个
      fCDN
      ,这恰好是有问题的一个(d15gt9gwxw5wu0.cloudfront.net)

    • 第261行定义了一个函数
      removescript(),
      ,该函数依次使用第266行的
      findScript()
      ,第277行的
      insertJS()

    • 第270行定义了函数
      loadDomainRules()
      ,它似乎是生成您在日志中找到的URL的函数-代码片段见下面的附录

      • 推论:即使没有下面收集的进一步证据,命名和功能也强烈暗示
        r.js
        是一个JavaScript文件,提供专门为手头域组装/生成的自定义JavaScript

    • 第100行定义了一个函数
      loadGeo()
      ,它确实引用了某种ad服务器(ads2srv.com)——代码片段见下面的附录

    • 第368行最后定义了一个函数
      i()
      ,该函数提供了关于所有这一切可能起源的最明确的线索,即一些Yontoo客户端和Yontoo API的概念-代码片段见下面的附录

推论 这是怎么回事? Yontoo客户端和Yontoo API很容易就产生了一个应用平台,允许您控制您每天访问的网站,也就是说,它听起来像是的商业化版本,请参见:

Yontoo是一个自定义和 增强基础网站

我在哪里可以使用它

Yontoo可以在网络上的任何网站上工作,尽管 功能来自称为Yontoo应用程序的独立应用程序 根据您所在的站点提供特定的功能 在

[我的重点]

现在,通过查看他们当前的列表,我们可以很容易地证明,为什么这可能会被用于可疑的不透明广告,例如,尽管他们的页脚上有所有的信任标志和印章

你的日志是怎么写的? 另一个引文提供了对功能的更多了解,以及它如何产生您遇到的问题:

Yontoo[…]是一个 浏览器附加组件,用于创建可编辑到的虚拟图层 创建已对基础架构进行更改的外观 网站。[...] 如果你在网站上看到对应用程序或工具的需求,那么你 你可以自由创造

因此,显然有人访问了您的网站,并通过Yontoo客户端(如果它实际上允许最终用户访问)或其中一个(用于分析的代码片段引用了第379行中的下拉交易应用程序)为您的网站创建了一些自定义域规则,这触发了创建
d15gt9gwxw5wu0.cloudfront.net/js/_MY_WEB_APP_DOMAIN_/r.js
来存储这些规则,以便在下次访问网站时再次使用

由于某个地方存在某些安全缺陷(请参见下面的结论),此URL或相应的JavaScript片段必须已被注入到应用程序的JavaScript代码中(例如,通过“确实”),并在某个点依次触发日志输入错误

结论 正如前面已经提到的,我同意最初的结论,即代码本身可能是无害的,尽管底层技术很可能(ab)用于mal
function () {
    if (location.host != "") {
        var a = location.host.replace(RegExp(/^www\./i), "");
        this.insertJS(this.proto + this.fCDN + "/js/" + a + "/r.js")
    }
    this.loaded_domain_rules = true
}
function () {
    var cid = this.items.e6a00.get("geo.cid");
    var updatetime = this.items.e6a00.get("geo.updatetime");
    if (!cid || (cid && updatetime && (Math.floor((new Date()).getTime() / 1000) - parseInt(updatetime)) >= 259200)) {
        this.insertJS(((this.proto == 'https://') ? 'https://s.' : 'http://') + 'ads2srv.com/tb/gc.php?json&cb=_GPL.setGeoAndGo')
    } else {
        this.vars.cid = this.items.e6a00.get("geo.cid");
        this.vars.rid = this.items.e6a00.get("geo.rid");
        this.vars.ccid = this.items.e6a00.get("geo.ccid");
        this.vars.ip = this.items.e6a00.get("geo.ip");
        this.loadCC();
        this.loadDomainRules()
    }
}
function () {
    if (typeof YontooClient != 'undefined') YontooClient = {};
    if (typeof yontooAPI != 'undefined') yontooAPI = {};
    if (typeof DealPlyConfig != 'undefined') {
        DealPlyConfig.getBaseUrl = function () {
            return "https://d3lvr7yuk4uaui.cloudfront.net/items/blank.js?"
        };
        DealPlyConfig.getCrownUrl = function () {
            return "https://d3lvr7yuk4uaui.cloudfront.net/items/blank.js?"
        }
    }
    this.rm(this.ri, ['dropdowndeals', 'Y2LeftFixedCurtain', 'gbdho', 'bdca', 'dealply-toast-1', 'pricegong_offers_iframe', 'SF_VISUAL_SEARCH', 'batAdRight', 'batAdBottom', 'batAdMiddle_0', 'batAdMiddleExt1_0', 'batAdRight2', 'invisiblehand-iframe', 'scTopOfPageRefinementLinks', 'sf_coupon_obj']);
    this.rm(this.rc, ['yontoolayerwidget', 'dealply-toast', 'imb-ad']);
    this.rm(this.ric, [
            ['productbox', 'g'],
            ['related-searches', 'related-searches-bing']
        ]);
    this.rm(this.rtn, ['MIVA_AdLink', 'itxtrst', 'kLink', 'FAAdLink', 'IL_AD', 'skimwords-link'])
}