Взлом с проникновением: как увели $1M в биткойнах у Primedice

Делитесь и голосуйте:

Содержание статьи:

  1. Август 2014
  2. Сентябрь 2014
  3. Открытие
  4. Дежа-вю

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

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

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

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

После того, как мы спугнули Nappa задержкой обналички, злоумышленник подождал ещё несколько недель и создал новую учётную запись Hufflepuff. Hufflepuff стал игроком, который делал самые крупные ставки за всю историю Primedice. Он часто делал ставки по $8000 в биткойнах каждую секунду несколько часов подряд. Вся наша команда была шокирована тем, как Hufflepuff бесцеремонно рушил нашу бизнес-модель (основанную на том, что казино имеет преимущество в 1%), и с течением времени становился всё более и более прибыльным.

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

Через пару дней после того, как мы отправили последний вывод порядка 2037 биткойнов на учётную запись Hufflepuff, наш главный разработчик наконец нашёл уязвимость. Это произошло после того, как мы обнаружили горстку учётных записей с тем же серверным зерном (далее будет объяснено, что это такое).

Чтобы понять, как Hufflepuff умудрился обдурить нашу систему, нужно сначала понять, как работает наша доказуемо-честная система (ГСЧ) Пользователю даётся зашифрованное случайное число (зерно сервера) до того, как он делает ставку (зерно клиента). Эти два случайных значения неким образом комбинируются и результ определяет, выиграл пользователь или нет. Случайно зашифрованное случайное число используется для совершения ставки, затем оно демонстрируется пользователю после совершения ставки, чтобы гарантированть, что результат не подтасован. Здесь можно почитать более глубокое объяснение того, как работает доказуемая честность: https://primedice.com/verify и http://dicesites.com/provably-fair.

Часть  функциональности нашего сайта отвечает за то, чтобы обязательно отдавать пользователям дешифрованные серверные зёрна (чтобы пользователи могли удостовериться в отсутствии манипуляций со ставками) и создать новое случайное зерно, при этом удаляя старое, раскрытое зерно. Hufflepuff нашёл способ «ввести в заблуждение» наш сервер, и заставить его отправить расшифрованное серверное зерно, которое является текущим зерном. Это было реализовано отправкой большего количества запросов, чем тот может обработать за малый отрезок времени, порядка сотен запросов менее, чем за секунду. В результате, у злоумышленника была вся необходимая информация, чтобы предсказать выигрышность ставки, а значит, мог в зависимости от этого делать «правильные» ставки.

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

К сожалению, мы обнаружили эту уязвимость уже после того, как позволили Hufflepuff вывести его 2400+ монет  (примерно 1 мегадоллар на тот момент). По природе Биткойна мы с этим уже ничего не могли сделать, кроме как извлечь горький урок. Мы связались с Hufflepuff через его аккаунт на форуме Bitcointalk и потребовали вернуть монеты, но в ответ был невероятно жесток. По-видимому, наш разработчик не совсем правильно залатал этот глюк. В ответ на наш запрос, Hufflepuff создал ещё один аккаунт Robinhood и по-быстрому выиграл ещё более 2000 монет, обойдя заплатку. Правда, на этот раз он не смог вывести более 50 или 60 биткойнов, поскольку горячий кошелёк нашего сайта был пуст.

Через некоторое время он написал нам сообщение, которое обнаружил в документах один из наших сотрудников:

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

Да, это был явно не наш день…

Адрес депонирования Hufflepuff’а:

https://blockchain.info/address/1BiPXmDrHm7VXZnWy6NnW1ZbPc4dcpfkH5

Его основной адрес обналичивания:

https://blockchain.info/address/14iS2UvcLK33xkC1K1qL1dhEbp49aiNfNp

Обналичка RobbinHood:

https://blockchain.info/address/14HQ67ZhmATviHi9RdYhbUriAGSFmJpYoB

Примечание: Nappa/Kane — 2 из ранее использованных имён пользователей среди многих других.

Адрес вывода Kane:

https://blockchain.info/address/18dMBap634aESPTeD3FGcAgJ2S9n4qtBTZ

Адрес депонирования Nappa:

https://blockchain.info/address/16h9ggSzUWdvagEJdNvWVYiUkytw6SJgiB

Все вышеперечисленные доказательства доступны в блокчейне, а более чувствительную информацию (email/ip) мы не раскрываем.

Также важно отметить, что этот инцидент доказывает целостность и доказанную честность нашей системы. Если бы мы попытались что-то сделать со ставками Hufflepuff, то мы быстро бы поняли, что он читер и были бы богаче на 2400+ биткойнов. Hufflepuff сделал всего лишь небольшую передышку после того, как мы уполовинили максимальную ставку, и я уверен, что он бы обчистил нас, а мы бы так и не поняли, что произошло. Мы внесли свои личные средства, так что в результате никто из наших пользователей не пострадал.

Государство и общество

Ждем новостей

Нет новых страниц

Следующая новость