Самая привлекательная цель для хакера — это онлайновый банкинг, и главную роль в успехе вирусных атак на него играют ботнеты. Но чтобы выудить из перехваченных с их помощью данных ценную информацию, хакеры надо потрудиться. Сегодня я расскажу, как усложнить жизнь хакерам-ботоводам и защитить написанное приложение от подобных атак.
Чтобы превратить перехваченный трафик в коммерчески привлекательные списки конфиденциальных данных, ботоводу приходится применять разные техники майнинга. Одна из простейших техник — искать в запросах POST переменные с именами вроде username и password и считывать их значения. Или искать имена переменных, характерных для номеров кредитных карт, вроде cc_number, которые обычно используются в приложениях онлайн-банкинга.
РЕКОМЕНДУЕМ:
Реклама в приложениях и безопасность пользователя
Чтобы извлекать и собирать эти данные, ботоводу требуются значительные вычислительные ресурсы. Ему приходится раскошеливаться на аренду серверов. Выгоду он оценивает по соотношению X/Y, где X — стоимость конфиденциальных данных, а Y — стоимость аренды серверов. Когда это соотношение пересекает определенный нижний порог, ботоводу ваше веб-приложение становится неинтересным.
- Как написать веб-приложение устойчивое к ботнетам
- Простой способ защиты веб-приложения от ботнета
- Сложный способ защиты веб-приложения от ботнета
- Еще более сложный способ защиты веб-приложения от ботнета
- Запросы AJAX с непредсказуемыми задержками времени
- Смешиваем фальшивые данные с асинхронными запросами POST
- Симметричное шифрование в запросах POST
Как написать веб-приложение устойчивое к ботнетам
Поэтому суть кодинга, устойчивого к ботнетам: разрабатывать веб-приложения, в которых соотношение X/Y держится на стабильно низком уровне. Я предлагаю три метода такого кодинга: простой, средний и сложный. Эта градация установлена исходя из накладных расходов на сервер, где обитает ваше веб-приложение, и сложности реализации метода.
Простой способ защиты веб-приложения от ботнета
Самый простой метод направлен на обман парсера ботнета:
- заменить распространенные имена переменных вроде CVV, username, password и address на неочевидные;
- добавить в форму скрытые поля с выдуманными данными.
Обычный пользователь эти поля даже не увидит, а ботовода они заставят попотеть.
Подобные методы подходят для серверов, у которых нет достаточной пропускной способности, чтобы задействовать более ресурсоемкие методы обфускации. Изменения в исходном коде, которые нужно сделать для реализации этого простейшего метода, минимальны. В коде серверной части веб-приложения вообще никакие изменения не потребуются.
Сложный способ защиты веб-приложения от ботнета
Методы этой категории предполагают использование модулей JS для создания путаницы в запросах POST. Многие популярные ботнеты, например ZeuS и его преемники, сканируют только запросы POST. Запросы GET их не заботят. Это можно использовать для передачи через GET ключей шифрования и функций обфускации JS, не попадая при этом под радар ботнета.
Когда пользователь зараженного компьютера, заполнив какую-нибудь форму, нажимает «отправить», все параметры формы запутываются при помощи функции обфускации, доставленной через GET, и затем отправляются на сервер через POST в скрытом поле формы. Остальные поля формы остаются незаполненными, либо в них вносятся фальшивые данные.
Такое запутывание значительно усложняет серверу C&C извлечение конфиденциальных данных. С этим методом вам придется вставить в серверную часть своего веб-приложения функцию деобфускации, которая будет оттягивать на себя часть вычислительных ресурсов вашего сервера.
Используя простейшие функции обфускации, вы превратите конфиденциальные данные, проходящие через ваше веб-приложение, в «движущуюся цель». Ботоводу будет намного сложнее извлекать их. Особенно если функции обфускации генерируются вашим сервером динамически при каждом сеансе.
В следующем листинге представлен еще более изощреннный пример обфускации: цифра 5 заменяется символом #, а цифра 2 — символом %.
Теперь, когда у вас есть несколько функций обфускации, вам надо активировать их при отправке формы. Соответствующий код будет запускаться в обработчике события onclick для кнопки отправки формы.
Первый запрос POST запутывает данные. Затем он берет поле с именем cc_number и вставляет туда произвольную строку, которая для ботовода оказывается бесполезной.
У такого метода есть некоторые накладные расходы на стороне сервера: на деобфускацию и хранение функций обфускации, однако они невелики. А вот ботоводу для их преодоления приходится затрачивать непропорционально большее количество вычислительных ресурсов. Добавление поддельных данных раздувает логи, собираемые ботоводом, и создает ему больше проблем. Соответственно, рентабельность его усилий понижается.
РЕКОМЕНДУЕМ:
Как написать безопасный код на JS
Еще более сложный способ защиты веб-приложения от ботнета
Методы этой категории предполагают использование функций AJAX:
- для непредсказуемых задержек по времени;
- для динамической генерации избыточных полей формы;
- для задействования симметричного шифрования в запросах POST;
- для добавления фальшивых запросов POST, которые перемешивают в логах ботовода реальные данные с фальшивыми данными.
Но если вы слишком увлечетесь фокусами с AJAX, то нагрузка на ваш сервер значительно возрастет, и вам для поддержки своего веб-приложения придется арендовать более мощные серверы.
Запросы AJAX с непредсказуемыми задержками времени
Согласно моим экспериментам, боты не генерируют логи, если запросы AJAX используются с динамически генерируемыми элементами формы, которые то появляются, то исчезают через непредсказуемые промежутки времени.
Такой метод обфускации предотвращает создание журналов ботнетом. Но если в будущем ботоводы модифицируют свое ПО и добавят к нему функцию захвата запросов AJAX с динамическими задержками, то журналирование уже будет вестись. Когда это случится, вы сможете дать ботоводу несимметричный ответ, задействовав описанные далее методы.
Смешиваем фальшивые данные с асинхронными запросами POST
Функции AJAX можно использовать для отправки фальшивых данных, которые будут игнорироваться серверной частью вашего веб-приложения, но при этом они будут захламлять журналы и нарушать структуру логов ботнета.
Избыточные запросы отправляются и на ваш сервер, поэтому вам нужен способ идентификации подлинных запросов POST. Для этого можно через GET отправлять специальный условный код.
Симметричное шифрование в запросах POST
Лучший способ обфускации — шифрование параметров POST. Это сулит серьезные накладные расходы: дешифрование вносит самый большой вклад в нагрузку на ваш сервер. Как вариант, можно задействовать RC4 с ротацией ключей. Такой подход позволяет без труда шифровать данные, обеспечивая вместе с тем легкую их расшифровку.
Дорожная карта для зашифрованных запросов POST выглядит следующим образом.
- Ключ шифрования для RC4 генерируется и сохраняется как переменная сеанса. При использовании сессии и куков с ID сессии каждому клиенту, посещающему ваш сайт, могут быть переданы уникальные ключи.
- Страница HTML с формой загружается на клиентский компьютер.
- Файл JS с этим симметричным ключом из переменной сеанса также загружается на клиентский компьютер через запрос GET.
Серверный код вашего приложения использует эту переменную сеанса для дешифрования запроса POST. После дешифрования сервер генерирует новый ключ и сохраняет его снова как переменную сеанса. Этот шаг гарантирует, что при каждом запросе POST используется новый ключ шифрования.
Форма отправляет данные POST в зашифрованном виде при нажатии кнопки «Отправить». Конечно, этот запрос тоже записывается в логи ботовода, но в зашифрованном виде. Парсить такие логи ботоводу будет очень дорого.
РЕКОМЕНДУЕМ:
Как создать защищенное зашифрованное устройство
Теперь вы знаете, как написать веб-приложение, устойчивое к ботнетам. Эффективность описанных методов не абсолютна, но они значительно усложняют кражу данных и делают ее нерентабельной.