Смотрим на высыхание краски: Как я залил игру в Steam Store безо всякого одобрения со стороны Valve

https://medium.com/swlh/watch-paint-dry-how-i-got-a-game-on-the-steam-store-without-anyone-from-valve-ever-looking-at-it-2e476858c753#.puuu9t7we
  • Перевод
image

Планировал ли я попасться? Конечно!


Если вы посещали домашнюю страницу Steam в воскресенье вечером, вы могли заметить новую игру: «Смотрим на высыхание краски». Это событие послужило причиной оживлённых дискуссий на форуме, где пользователи обсуждали потерю компанией Valve контроля качества в сервисе Steam Greenlight. Однако эта игра никогда не попадала в Greenlight. Я даже не платил $100, чтобы публиковать там игры.

Мне кажется, что Greenlight – хорошая платформа для независимых разработчиков, рекламирующих свои игры, и хочу извиниться перед всеми разработчиками, кого я мог оскорбить. Это был всего лишь розыгрыш, а также проверка моей теории, которую я пытался донести до Valve в течение нескольких месяцев – возможность разместить в Steam любую игру так, чтобы Valve даже не увидела её. Все уязвимости уже исправлены, и данное руководство имеет лишь историческую ценность. К слову, игра не имеет отношения к протесту по поводу цензуры в кино.

Получаем учётную запись Steamworks


Моё небольшое расследование всей этой истории началось с получения доступа к Steamworks. Не буду рассказывать как и почему у меня появился доступ, но я не использовал никакие уязвимости ни форумов, ни Greenlight, и не общался ни с кем из Valve. Раскрывать эти детали я не буду, и не просите.

image

В общем, получил я доступ к Steamworks (внутренней платформе Valve для размещения игр в Steam, редактирования ачивок, DRM, мультиплеера и т.п.), и после этого мне пришла идея поискать уязвимости. Приближалось 1 апреля и я решил использовать эту возможность, чтобы опубликовать безымянное приложение и привлечь внимание Valve к проблеме.

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

Получаем одобрение Steam Trading Cards


Естественно, что это была бы за игра без карточек Steam? Я понаделал в фотошопе карточек для шуточного набора. Но разве Valve не должна просматривать карточки, эмотиконы и фоны перед выпуском?

На странице у статуса есть несколько первоначальных вариантов:

image

А что там в исходниках?

image

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

image

Занятно – подменный «последний редактор» действительно оказался сотрудником. А если мы снова сохраним эту форму со значением «Released»?

image

Что же произошло? Когда я отправил неправильный запрос, сервер вернул мне полный список вариантов с их значениями. Я увидел, что у Released значение равно 5. Тогда я обновил форму, чтобы вернуть свой editor_accountid, и поменял значение селекта на 5. И сервер принял команду, будто она исходит от разработчика, карточки которого уже одобрили. Сервер не проверил – одобрены ли уже карточки кем-то из Valve, и просто поменял их статус.

Процесс одобрения в Valve


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

Релиз игры


Сайт Steamworks в основном использует AJAX. JS-код не обфусцирован и виден всем (кто авторизован в Steamworks). Я нашёл интересную функцию “ReleaseGame(appid, data)”. Судя по всему, она делала типичный AJAX-запрос и делала релиз игры.

image

Вызов функции ReleaseGame с параметрами 445730 (мой appid) и пустыми данными выдал мне статус 403. Просмотрев другие функции, я увидел, что почти все они добавляют значение в JSON-запрос под названием sessionid – этот id мы видели раньше, когда релизили наши карточки.

image

Итого, вызываем ReleaseGame(445730, { ‘sessionid’: ‘my_session_id’):

image

Идём в магазин Steam

image

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

Я связался с Valve, которые уже исправили эту уязвимость.

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

¯\_(ツ)_/¯

image
Поделиться публикацией

Комментарии 24

    +9
    Не перестаю удивляться, как ТАКИЕ уязвимости могут быть у ТАКИХ компаний. А в общем статья ничем особо не примечательна
      +3
      В компании, где за 3 популярных онлайн-игры и огромный сервис цифровой дистрибуции отвечают всего 400 человек — легко.
        0
        Это вы ещё сами скрипты (вернее — сборную солянку из таковых) для публикации под разными платформами у них не видели. Веселуха там ещё та. Хотя недавно вот выпустили гуишную тулзу, но всё равно танцевать с бубном надо :)
          +1
          Чем крупнее компания, тем меньше у рядового сотрудника шансов получить какие-то бонусы благодаря своей инициативе. Соответственно мотивация к качественному труду падает ниже плинтуса. Так что всё закономерно.
          0
          На самом деле в панели стима все еще хуже. Например, у них стоит запрет на публикацию приложений в магазин в выходные. И самое интересное, что кнопка "Submit to live" с запросом ReleaseGame просто комментируется через // в зависимости от времени суток…
            0
            Кстати, а не знаете, с чем связан такой запрет на публикацию в выходные дни?
              0
              В выходные у них в офисе никого не бывает, и если что-то случится на релизе — то до понедельника никто не сможет помочь.
            0
            Жаль что ее из стима уже удалили. Но в кэше пока есть. (http://webcache.googleusercontent.com/search?q=cache:0rCYTPsTBc8J:store.steampowered.com/app/445730/+&cd=1&hl=ru&ct=clnk&gl=ru)
              –1
              Нифига себе! Я уж подумал, что это шутка первоапрельская…
                0
                Да, я тоже сперва. Потом стало любопытно и нашел. В SteamDB немного информации тоже есть про нее https://steamdb.info/app/445730/
              0
              Я бы, на месте Valve, за такую уязвимость подарил вам аккаунт. А, кстати, он правда стоит сто баксов? Нехило...
                0
                3200 рублей стоит возможность публикации игры в Steam Greenlight. И если она пройдет, вот тогда уже дадут доступ.
                0
                Кстати у Valve есть bug bounty. www.valvesoftware.com/security
                  0
                  Супер, Гейб негодует
                    +3
                    Начало статьи звучит примерно так: Как я взломал сайт Пентагона: в общем был у меня root shell на сайте Пентагона. Откуда взял не скажу, и не спрашивайте. И вот набрал я cd /var/www…
                    Чел где-то нарыл анонимно аккаунт, который в норме можно получить после кучи согласований, но уязвимостью называет то, что из-под этого аккаунта не все углы заполированы. Да потому и не заполированы, что там одни серьёзные дяди сидят. Любой вред, нанесённый пользователем такого акка Valve просто отсудит в 10-кратном размере.
                    Когда написать, что сделал, нельзя, но очень хочется — получаются такие тексты.
                      0
                      Чел обнаружил, что в клиенте можно поменять ИД и выдать себя за пользователя с другим уровнем доступа и возможностями.
                      «Да потому и не заполированы, что там одни серьёзные дяди сидят.»
                      А вот сейчас смешно было.
                        0
                        Звучит оно примерно как "На секретной базе в подвале есть сверхзакрытая комната, в которой запертый арсенал, где кроме прочего в ящичке лежат патроны. Так вот, на этом ящичке замок можно фомкой снять." Плохо, конечно, не спорю. Но это наименьшее из возможных "плохо". Настоящий трындец — это как он до ящичка добрался.
                        Вон Вконтакте тоже можно было, не зарегистрировавшись, смотреть фото на аккаунтах, тупо прописывая полный адрес. И всем до лампочки. Здесь у описанной уязвимости такой же уровень сложности.
                        На том уровне доступа, который у него был изначально, эскалация до того, что он получил — никем изначально не рассматривалась, как вектор атаки. Это не мужик с улицы опубликовал игру и мог подложить малварь. Это корпоративный аккаунт нарушил техническое обеспечение неких правил, которые вообще можно было технически не ограничивать, а оговорить на бумаге.
                        Я почему так недоволен — ну это мне уже напоминает про хакера и солонку. Это как при глючном сайте сидеть и править баги в админке, чтобы младший админ не смог эскалироваться до старшего, хотя они оба друг-друга знают. У Стима клиентское приложение эпически кривое, а с такими претензиями они на команду внутреннего сайта будут больше ресурсов тратить.
                        Нашёл дыру во внутренней админке — молодец. Сообщил — ещё раз молодец. Но зачем теперь это обсуждать на всепланетном уровне — то?
                          0
                          Не так давно говорили про другую багофичу, которую тут тоже где-то упоминали — они отключают возможность публикации на выходных просто комментируя код кнопки на странице, а к этому доступ уже получить несложно, и сдается мне эти две недоработки растут из одного места.
                            0
                            Это как раз мужик с улицы. https://www.steampowered.com/steamworks/FAQ.php
                            How do I get access to Steamworks?
                            You can access the Steamworks SDK and documentation by visiting https://partner.steamgames.com/, signing in, and accepting the SDK Access Agreement. The account you do this from must not be limited.
                              0
                              А что такое limited account и какие есть ещё? И SDK Access это и есть возможность предъявлять игру на досмотр модератору с последующей публикацией?
                                0
                                Это аккаунты, которые потратили в Steam 5 долларов. А чтобы публиковать игры в Greenlight нужно заплатить ещё 100$. http://store.steampowered.com/app/219820/
                        0
                        Захотелось поиграть.
                          0
                          И за это Valve никак не вознаградила?
                            0
                            И все-таки, как Вас отблагодарил Valve за найденную уязвимость?

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

                            Самое читаемое