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

And*_*ley 19 javascript security xss web-applications amazon-cloudfront

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

JS Error: Error loading script:
https://d15gt9gwxw5wu0.cloudfront.net/js/_MY_WEB_APP_DOMAIN_/r.js
Run Code Online (Sandbox Code Playgroud)

我们没有在我们的应用中使用亚马逊的Cloudfront CDN.当我转到无法加载的URL时,这些是唯一的内容:

if(typeof _GPL.ri=='function'&&!_GPL.isIE6){_GPL.ri('_GPL_r')}_GPL.rl=true;
Run Code Online (Sandbox Code Playgroud)

用户的用户代理字符串是:

Mozilla/5.0 (Windows NT 6.1; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
Run Code Online (Sandbox Code Playgroud)

请注意:我不是触发此错误的用户.这是触发它的数千名用户之一.我无法控制客户端计算机.

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

**更新**

看来我并不是唯一一个在他们的网站上发现过这种异常现象的人.我发现这个报告具有相同的确切行为,这似乎表明代码是无害的,但仍然没有答案它来自何处.

另外,我发现这个类似代码的pastebin似乎是某种广告脚本.再次,并非非常有帮助.

**更新2**

更多上下文:webapp使用多个第三方jQuery插件,但没有任何第三方分析.所有脚本都托管在我们自己的服务器上,对我们所有代码的审核都没有为"cloudfront"提供匹配.

这个应用程序已经生产了大约4年,这是这样的任何活动的第一个也是唯一一个实例.它没有发生过或之后,所以我怀疑我能够重现它.

我感兴趣的是这是否是某种攻击.如果是的话,我想知道如果它已经没有堵塞,如何堵塞它试图利用的漏洞.

Ste*_*pel 32

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

警告:虽然我分享了初步的结论,即代码本身可能是无害的,但是底层技术肯定也可以(ab)用于恶意意图,所以在自己调查时请小心.

分析

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

该片段包含具有以下主要功能的JavaScript片段:

  • 第13行_GPL使用各种项目初始化变量以供以后使用,例如各种常量,辅助函数,浏览器兼容性内容和实际有效负载,例如:

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

    • 线261定义了一个函数removeScripts(),,该函数findScript()又从线266使用,进一步伴随insertJS()在线277-它们各自的意图是显而易见的

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

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

    • 第100行定义了一个函数loadGeo(),它确实引用了某种广告服务器(ads2srv.com) - 请参阅下面的附录以获取代码片段

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

推论

它有什么关系?

提取的线​​索Yontoo ClientYontoo API很容易导致Yontoo,一个允许您控制每天访问的网站应用程序平台,即它听起来像是Appscripts.org的商业化版本,请参阅什么是Yontoo应用程序?:

Yontoo是一个浏览器插件,可以自定义和增强底层网站

我在哪里可以使用它?

Yontoo可以在Web上的任何站点上运行,但功能来自名为Yontoo Apps的独立应用程序,它们根据您所在的站点提供特定功能.

[强调我的]

现在,看看他们的App Market中的当前列表很容易证明,为什么这可能用于可疑的不透明广告,例如,尽管他们的页脚中的所有信任标志和封条.

它是如何最终出现在您的日志中的?

另一个引用提供了对功能的更深入了解以及它可能如何产生您遇到的问题:

Yontoo [...]是一个浏览器插件,可以创建虚拟图层,可以对其进行编辑,以创建对底层网站进行更改的外观.[...]如果您在网站上看到需要申请或工具,那么您可以自由创建!

所以,有人显然已经访问您的网站,并创造了一些自定义域规则,它由Yontoo客户端的方式(如果它实际上允许这为最终用户)或一个可用的应用程序(用于分析的片段引用下拉预订应用程序中例如,行379),它触发创建d15gt9gwxw5wu0.cloudfront.net/js/_MY_WEB_APP_DOMAIN_/r.js存储这些规则,以便依次在下次站点访问时重用.

由于某些安全漏洞(参见下面的结论),此URL或相应的JavaScript代码段必须已注入应用程序的JavaScript代码中(例如,通过跨站点脚本(XSS)),并在以下位置触发了日志条目错误反过来一点.

结论

如前所述,我分享了初步的结论,即代码本身可能是无害的,尽管底层技术肯定可以(ab)用于恶意意图,因为它本身就是用客户端JavaScript(即用户)进行模拟的本质允许来自第三方服务的代码与他每天使用和信任的网站(尤其是数据)进行交互 - 您的情况就是在这方面已经出现问题的明显证据.

我没有调查Yontoo的安全架构(如果有的话),但是他们也没有立即在他们的网站上找到关于这个重要主题的任何信息(例如在他们的支持部分),这对于类似的技术来说是非常不可接受的.这个恕我直言,尽管他们的页脚中有所有的信任标志和印章.

另一方面,用户确实会一直安装来自例如Userscripts.org的第三方脚本,这也不仅仅是为了在Stack Exchange上微调用户体验 ;)

请相应地做出自己的判断!


附录

您可以在下面找到分析中引用的代码片段(我无法在列表中内联它们而不会破坏布局或语法突出显示):

loadDomainRules()

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
}
Run Code Online (Sandbox Code Playgroud)

loadGeo()

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()
    }
}
Run Code Online (Sandbox Code Playgroud)

一世()

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'])
}
Run Code Online (Sandbox Code Playgroud)

  • 优秀的分析.感谢您帮助解决这个问题. (2认同)