Почему Cloudfront загружает скрипты в мое веб-приложение?(Я этим не пользуюсь) - PullRequest
19 голосов
/ 08 февраля 2012

Я управляю защищенным веб-приложением PHP / MySQL с широким использованием jQuery.Сегодня в журналах нашего приложения появилась странная ошибка:

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

Мы не используем Amazon 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 **

Больше контекста: веб-приложение использует несколько сторонних плагинов jQuery, но никакой сторонней аналитики любого рода.Все сценарии размещены на нашем собственном сервере, и проверка всего нашего кода не дает совпадений для «облачного фронта».

Это приложение находится в разработке уже около 4 лет, и это первый и единственный экземплярлюбая деятельность, как это.Этого не было ни до, ни после, поэтому я сомневаюсь, что смогу воспроизвести его.

Меня интересует, является ли это своего рода атакой.Если да, я хочу знать, как закрыть дыру, которую пытается использовать, если она еще не подключена.

Ответы [ 2 ]

32 голосов
/ 11 февраля 2012

Отказ от ответственности : я не аналитик / эксперт по безопасности, ваша проблема просто вызвала у меня интерес;)

Предупреждение : Хотя я и разделяю первоначальный вывод о том, что сам код, вероятно, безвреден, базовая технология наверняка может быть (ab) использована также для злонамеренных целей, поэтому, пожалуйста, будьте осторожны, исследуя это самостоятельно .

Анализ

Вы уже нашли соответствующее доказательство самостоятельно - ища дальше, я обнаружил еще одну dropbin drop , которая более читабельна, так что я использую это для объяснения (хотя на первый взгляд другой позволил бы это а также после форматирования).

Фрагмент содержит фрагменты JavaScript со следующими основными функциями:

  • Строка 13 инициализирует переменную _GPL всеми видами элементов для последующего использования, например, различные константы, вспомогательные функции, совместимость с браузером и фактические данные, например:

    • Строка 20 определяет пустое значение 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 Client и Yontoo API - см. Приложение ниже для фрагмента кода

Следствие

О чем это все?

Извлеченные подсказки Yontoo Client и Yontoo API легко приводят к Yontoo , прикладной платформе, которая позволяет вам контролировать сайты, которые вы посещаете каждый день , то есть звучит как коммерческая версия Userscripts.org , см. Что такое приложение Yontoo? :

Yontoo - это надстройка для браузера, которая настраивает и улучшает базовый веб-сайт

Где я могу его использовать?

Yontoo работает на любом сайте в Интернете, хотя функциональность приходит из отдельных приложений, называемых Yontoo Apps которые предоставляют определенные функции в зависимости от того, на каком сайте вы находитесь на .

[Акцент шахты]

Теперь, глядя на текущие списки в их App Market , легко продемонстрировать, почему это можно использовать для сомнительной непрозрачной рекламы, например, для всех знаков доверия и печатей в несмотря на их нижний колонтитул.

Как все закончилось в ваших логах?

Другая цитата дает более полное представление о функциональности и о том, как она могла привести к проблеме, с которой вы столкнулись:

Yontoo [...] является надстройка браузера, которая создает виртуальные слои, которые можно редактировать в создать видимость внесения изменений в основной Веб-сайт. [...] Если вы видите необходимость в приложении или инструменте на веб-сайте, то вы свободны создавать!

Итак, кто-то, по-видимому, посетил ваш сайт и создал для него некоторые пользовательские правила домена с помощью клиента Yontoo (если это действительно разрешено для конечных пользователей) или одного из доступных приложений (использовался фрагмент например, для анализа ссылается на приложение Drop Down Deals в строке 379), которое инициировало создание d15gt9gwxw5wu0.cloudfront.net/js/_MY_WEB_APP_DOMAIN_/r.js для хранения этих правил для повторного использования при следующем посещении сайта по очереди.

Из-за некоторого недостатка безопасности (см. Заключение ниже) этот URL или соответствующий фрагмент JavaScript должен быть внедрен в код JavaScript вашего приложения (например, с помощью Межсайтовый скриптинг (XSS) действительно ) и вызвал ошибку записи журнала в определенный момент по очереди.

Заключение

Как уже упоминалось заранее, я разделяю первоначальный вывод о том, что сам код, вероятно, безвреден, хотя основную технологию, безусловно, можно использовать (ab) для злонамеренных намерений, поскольку она сама по себе является насмешкой над клиентским JavaScript, т. е. пользователь разрешает коду сторонней службы взаимодействовать с сайтами (и особенно данными), которые он использует и которым доверяет каждый день - ваш случай является очевидным свидетельством того, что что-то пошло не так уже в этом отношении.

Я не исследовал архитектуру безопасности (если таковая имеется) в Yontoo, но также не смог найти какую-либо информацию по этой важной теме на их веб-сайте (например, в разделе Support ), что в значительной степени неприемлемо для такой технологии, как эта ИМХО, несмотря на все знаки доверия и печати в нижнем колонтитуле.

С другой стороны, пользователи устанавливают сторонние скрипты, например, из 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
}

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

я ()

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'])
}
0 голосов
/ 08 июня 2015

Я также нашел iFrame на моем сайте drupal 7.Он был загружен на сайт путем включения модуля шарахолика.

...