web-dev-qa-db-ja.com

CloudfrontがWebアプリにスクリプトをロードするのはなぜですか? (私はそれを使用しません)

私は、jQueryを広範囲に使用してセキュリティで保護されたPHP/MySQLWebアプリを管理しています。今日、奇妙なエラーがアプリのログに表示されました。

JS Error: Error loading script:
https://d15gt9gwxw5wu0.cloudfront.net/js/_MY_WEB_APP_DOMAIN_/r.js

アプリではAmazonのCloudfrontCDNを使用していません。ロードに失敗した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

注意してください:私はこのエラーを引き起こしたユーザーではありません。それをトリガーしたのは、何千人ものユーザーの1人でした。クライアントマシンを制御できません。

ここで何が起こっているのか誰か知っていますか?これはある種のXSS攻撃ですか?

**更新**

彼らのウェブサイトでこの異常を発見したのは私だけではないようです。私は 同じ正確な動作のこのレポート を見つけました。これはコードが無害であることを示しているようですが、それがどこから来たのかについてはまだ答えがありません。

さらに、 同様のコードを持つこのPastebin を見つけました。これは、ある種の広告スクリプトのようです。繰り返しますが、それほど役に立ちません。

**アップデート2**

その他のコンテキスト:webappはいくつかのサードパーティのjQueryプラグインを使用しますが、いかなる種類のサードパーティの分析も使用しません。すべてのスクリプトは独自のサーバーでホストされており、すべてのコードを監査しても「cloudfront」に一致するものはありません。

このアプリは約4年間運用されており、これはこのようなアクティビティの最初で唯一のインスタンスです。それは以前もその後も起こっていないので、私はそれを再現できるとは思えません。

私が興味を持っているのは、これが何らかの攻撃であるかどうかです。もしそうなら、それがまだ塞がれていない場合、それが悪用しようとしている穴を塞ぐ方法を知りたいです。

19
Andrew Ensley

免責事項:私はセキュリティアナリスト/専門家ではありません。あなたの問題が私の興味を刺激しただけです;)

警告:コード自体はおそらく無害であるという最初の結論を共有しますが、基盤となるテクノロジーは悪意のある目的にも(悪用される)可能性が高いので、自分で調査するときは注意してください。

分析

あなたはすでに関連する証拠を自分で見つけました-さらに検索すると別のものが見つかりました ペーストビンドロップ 、これはより読みやすいので、私はこれを説明に使用しています(一見すると他のものもこれを許可しますがフォーマット後)。

スニペットは、次の主要な機能を備えたJavaScriptフラグメントを備えています。

  • 13行目では、変数__GPL_を、後で使用するためにあらゆる種類のアイテムで初期化します。さまざまな定数 `、ヘルパー関数、ブラウザの互換性、実際のペイロードなど。

    • Line20は空のbasdeCDNを定義し、行21はfCDNを定義します。これはたまたま問題の1つです(d15gt9gwxw5wu0.cloudfront.net

    • 行261は、行266のremoveScripts(),を使用する関数findScript()を定義し、さらに行277のinsertJS()を伴います。それぞれの意図は明らかです。

    • 270行目は関数loadDomainRules()を定義しています。これは、ログで見つけたURLを生成する関数のようです。コードスニペットについては、以下の付録を参照してください。

      • Deduction:以下に収集された証拠がなくても、名前と機能は、_r.js_が手元のドメイン用に特別にアセンブル/生成されたカスタムJavaScriptを提供するJavaScriptファイルであることを強く示唆しています。

    • 100行目は関数loadGeo()を定義しています。これは、ある種の広告サーバーを実際に参照しています(ads2srv.com)-コードスニペットについては、以下の付録を参照してください。

    • 行368は、最終的に関数i()を定義します。これは、これらすべての可能性のあるオリジンに関する最も明確な手がかり、つまりいくつかのYontoo ClientおよびYontoo API-コードスニペットについては、以下の付録を参照してください

当然の結果

それはどういうことですか?

抽出された手がかりYontooクライアントYontoo APIは、簡単に Yontoo毎日アクセスするWebサイトを制御できるアプリケーションプラットフォーム、つまり、商用バージョンの serscripts.org のように聞こえます。 Yontooアプリとは何ですか?)を参照してください。

Yontooは、基盤となるWebサイトをカスタマイズおよび拡張するブラウザーアドオンです。

どこで使用できますか?

YontooはWeb上のどのサイトでも機能しますが、機能はYontooAppsと呼ばれる個別のアプリケーションから提供され、現在のサイトに応じて特定の機能を提供します

[強調鉱山]

さて、彼らの App Market の現在のリストを見ると、簡単にわかります。なぜこれが 疑わしい 不透明な広告も同様です。たとえば、すべての信頼のサインとシールは、それにもかかわらず、フッターにあります。

どのようにしてログに記録されましたか?

別の引用は、機能と、それが発生した問題をどのように引き起こしたかについてのより多くの洞察を提供します。

Yontoo[...]は、基になるWebサイトに変更を加えたように見せるために編集できる仮想レイヤーを作成するブラウザーアドオンです。 [...] Webサイト上でアプリケーションまたはツールが必要な場合は、自由に作成できます。

したがって、誰かがあなたのサイトにアクセスし、Yontooクライアント(実際にエンドユーザーにこれを許可している場合)または 利用可能なアプリ (分析に使用されるスニペット)のいずれかを使用して、サイトのカスタムドメインルールを作成したようですドロップダウンディールアプリ(たとえば379行目)を参照します。これにより、_d15gt9gwxw5wu0.cloudfront.net/js/_MY_WEB_APP_DOMAIN_/r.js_が作成され、次のサイト訪問で再利用できるようにこれらのルールが保存されます。

どこかにセキュリティ上の欠陥があるため(以下の結論を参照)、このURLまたはそれぞれのJavaScriptスニペットがアプリケーションのJavaScriptコードに挿入されている必要があります(たとえば、 クロスサイトスクリプティング(XSS) によって)、そして、ある時点でログエントリエラーをトリガーしました。

結論

すでに前もって述べたように、コード自体はおそらく無害であるという最初の結論を共有しますが、基盤となるテクノロジーは、クライアント側のJavaScript、つまりユーザーをあざける性質があるため、悪意のある目的にも(悪用される)可能性があります。サードパーティのサービスからのコードが、彼が毎日使用し、信頼しているサイト(特にデータ)と対話できるようにします。あなたのケースは、この点ですでに問題が発生していることの明らかな証拠です。

Yontooのセキュリティアーキテクチャ(ある場合)を調査していませんが、この重要なトピックに関する情報をWebサイト(たとえば、 Support セクション)ですぐに見つけることができませんでした。このIMHOのようなテクノロジーにはほとんど受け入れられませんが、それにもかかわらず、すべての信頼のサインとシールがフッターにあります。

一方、ユーザーはサードパーティのスクリプトをインストールします。 serscripts.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
}
_

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()
    }
}
_

i()

_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'])
}
_
32
Steffen Opel

drupal 7のWebサイトでもiFrameを見つけました。sharaholicのモジュールを有効にすることで、サイトに読み込まれました。

0
Bjorn