О том, как я случайно уронил сервер браузерной игры от ЕА

в 9:19, , рубрики: Без рубрики

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

О том, как я случайно уронил сервер браузерной игры от ЕА Не буду писать название браузерной игры, для топика это не важно. Речь идет про браузерную стратегию от Electronic Arts (EA Games).

Собственно далее сама история.

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

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

Идеей стало создание простого чат-бота для игры, который умел логиниться, поддерживать коннект и немного спамить в чат заготовленными фразами вроде «Привет, дивный мир!», написан он был на простом PHP, запускался по крону раз в минуту с обычного виртуального сервера. Собственно бот успешно ловил баны от модераторов когда мне пришла в голову другая идея. Дело в том, что в игре присутствует внутренняя почта. Идея была очень проста, спарсив имена всех топовых игроков сервера (получилось что-то около 1500 ников) мой бот, точнее 5 его копий запускаемых по крону, начали рассылать письма, выбирая в качестве получателей случайный ник. Сразу скажу что письма были беззлобные, просто для подтверждения самого факта спама, потому что защиты от получаемых писем в игре не было предусмотрено, в итоге люди достаточно сильно страдали когда в их ящике оказывалось 100 или 200 ненужных писем. Знаю, что это не очень красиво, но в тот момент меня менее всего заботило отношение людей к этому, я воспринимал все как небольшую игру в игре.

Через некоторое время я обратил внимание на важную деталь при отправке внутренней почты в игре (что собственно и сыграло роковую роль), а именно, поле «Копия», на которое раньше я даже не смотрел. Собственно скриншот отправки письма:

О том, как я случайно уронил сервер браузерной игры от ЕА

Оказалось, что поле Копия может содержать до 200 имен разделенных двоеточием, что позволяет отправлять копию письма на каждый ник, в итоге, за один раз, можно отправить 201 письмо и делать это можно раз в 1-2 секунды. Если же ботов будет несколько, то становится понятно, что это уже приличная нагрузка на сервер (о чем я понял позже).

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

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

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

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

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

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

Кстати, на следующий день я получил вот такое письмо по электронной почте:

Hi iSteely,
my name is David and I am the Global Community Manager at EA Phenomic and responsible for *название игры*.

We noticed your recent activity in *название игры* and started to mute your accounts in the chat and to ban your accounts and IPs. I would like to know your reason for these raging activities on our servers and what you want to achieve with it.

I hereby recommend you to stop it, as we won´t stop banning your accounts. Behavior like this might also affect all of your other EA accounts and games.

Best regards,
David Erhard

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

Самое интересное, что в той же игре была найдена очень неприятная XSS позволяющая творить «жуткие» вещи. Писал о ней в ЕА, чинили они ее очень долго, месяца два, за это время я провел пару экспериментов с ее использованием, могу рассказать, если сообществу это будет интересно.

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

Автор: Steely, О том, как я случайно уронил сервер браузерной игры от ЕА

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js