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

В общем, получил я доступ к Steamworks (внутренней платформе Valve для размещения игр в Steam, редактирования ачивок, DRM, мультиплеера и т.п.), и после этого мне пришла идея поискать уязвимости. Приближалось 1 апреля и я решил использовать эту возможность, чтобы опубликовать безымянное приложение и привлечь внимание Valve к проблеме.
Опущу описание создания 45-секундного симулятора высыхания краски в RPG Maker, поскольку тут и гордиться нечем, да и неважно это.
Получаем одобрение Steam Trading Cards
Естественно, что это была бы за игра без карточек Steam? Я понаделал в фотошопе карточек для шуточного набора. Но разве Valve не должна просматривать карточки, эмотиконы и фоны перед выпуском?
На странице у статуса есть несколько первоначальных вариантов:

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

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

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

Что же произошло? Когда я отправил неправильный запрос, сервер вернул мне полный список вариантов с их значениями. Я увидел, что у Released значение равно 5. Тогда я обновил форму, чтобы вернуть свой editor_accountid, и поменял значение селекта на 5. И сервер принял команду, будто она исходит от разработчика, карточки которого уже одобрили. Сервер не проверил – одобрены ли уже карточки кем-то из Valve, и просто поменял их статус.
Процесс одобрения в Valve
У компании есть трёхэтапный процесс размещения чего-либо в Steam. Во-первых, вы отправляете свою страницу магазина на осмотр, затем – финальный билд игры, а затем вам предоставляют возможность её зарелизить.
Релиз игры
Сайт Steamworks в основном использует AJAX. JS-код не обфусцирован и виден всем (кто авторизован в Steamworks). Я нашёл интересную функцию “ReleaseGame(appid, data)”. Судя по всему, она делала типичный AJAX-запрос и делала релиз игры.

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

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

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

Иехууу! Признаюсь, я вообще-то хотел, чтобы игра появилась в разделе «выходит 1 апреля», и не показывалась на сайте до пятницы – а она появилась сразу в разделе новинок. И конечно я хотел узнать, как далеко по пути релиза игры можно зайти – но решил, что лучше ей не появляться в списке игр, доступных для покупки.
Я связался с Valve, которые уже исправили эту уязвимость.
Из всего этого я вынес, что при работе с пользовательским контентом не нужно делать два разных статуса «готова к обзору» и «одобрена». Вместо этого можно выдавать некий тикет, обозначающий, что игра на одобрении, и не менять статус на «одобрена», пока существует тикет. Или просто не разрешать пользователям менять статус на «одобрена».
?\_(?)_/?

Комментарии (21)
snake302
01.04.2016 09:42На самом деле в панели стима все еще хуже. Например, у них стоит запрет на публикацию приложений в магазин в выходные. И самое интересное, что кнопка "Submit to live" с запросом ReleaseGame просто комментируется через // в зависимости от времени суток…
susnake
01.04.2016 10:34Жаль что ее из стима уже удалили. Но в кэше пока есть. (http://webcache.googleusercontent.com/search?q=cache:0rCYTPsTBc8J:store.steampowered.com/app/445730/+&cd=1&hl=ru&ct=clnk&gl=ru)
ExplosiveZ
01.04.2016 13:30-1Нифига себе! Я уж подумал, что это шутка первоапрельская…
susnake
01.04.2016 14:05Да, я тоже сперва. Потом стало любопытно и нашел. В SteamDB немного информации тоже есть про нее https://steamdb.info/app/445730/
bigfatbrowncat
01.04.2016 11:44Я бы, на месте Valve, за такую уязвимость подарил вам аккаунт. А, кстати, он правда стоит сто баксов? Нехило...
snake302
01.04.2016 14:123200 рублей стоит возможность публикации игры в Steam Greenlight. И если она пройдет, вот тогда уже дадут доступ.
Barafu
03.04.2016 17:39+3Начало статьи звучит примерно так: Как я взломал сайт Пентагона: в общем был у меня root shell на сайте Пентагона. Откуда взял не скажу, и не спрашивайте. И вот набрал я cd /var/www…
Чел где-то нарыл анонимно аккаунт, который в норме можно получить после кучи согласований, но уязвимостью называет то, что из-под этого аккаунта не все углы заполированы. Да потому и не заполированы, что там одни серьёзные дяди сидят. Любой вред, нанесённый пользователем такого акка Valve просто отсудит в 10-кратном размере.
Когда написать, что сделал, нельзя, но очень хочется — получаются такие тексты.andrew911
03.04.2016 21:46Чел обнаружил, что в клиенте можно поменять ИД и выдать себя за пользователя с другим уровнем доступа и возможностями.
«Да потому и не заполированы, что там одни серьёзные дяди сидят.»
А вот сейчас смешно было.Barafu
03.04.2016 22:16Звучит оно примерно как "На секретной базе в подвале есть сверхзакрытая комната, в которой запертый арсенал, где кроме прочего в ящичке лежат патроны. Так вот, на этом ящичке замок можно фомкой снять." Плохо, конечно, не спорю. Но это наименьшее из возможных "плохо". Настоящий трындец — это как он до ящичка добрался.
Вон Вконтакте тоже можно было, не зарегистрировавшись, смотреть фото на аккаунтах, тупо прописывая полный адрес. И всем до лампочки. Здесь у описанной уязвимости такой же уровень сложности.
На том уровне доступа, который у него был изначально, эскалация до того, что он получил — никем изначально не рассматривалась, как вектор атаки. Это не мужик с улицы опубликовал игру и мог подложить малварь. Это корпоративный аккаунт нарушил техническое обеспечение неких правил, которые вообще можно было технически не ограничивать, а оговорить на бумаге.
Я почему так недоволен — ну это мне уже напоминает про хакера и солонку. Это как при глючном сайте сидеть и править баги в админке, чтобы младший админ не смог эскалироваться до старшего, хотя они оба друг-друга знают. У Стима клиентское приложение эпически кривое, а с такими претензиями они на команду внутреннего сайта будут больше ресурсов тратить.
Нашёл дыру во внутренней админке — молодец. Сообщил — ещё раз молодец. Но зачем теперь это обсуждать на всепланетном уровне — то?andrew911
04.04.2016 12:21Не так давно говорили про другую багофичу, которую тут тоже где-то упоминали — они отключают возможность публикации на выходных просто комментируя код кнопки на странице, а к этому доступ уже получить несложно, и сдается мне эти две недоработки растут из одного места.
atomAltera
Не перестаю удивляться, как ТАКИЕ уязвимости могут быть у ТАКИХ компаний. А в общем статья ничем особо не примечательна
neomedved
В компании, где за 3 популярных онлайн-игры и огромный сервис цифровой дистрибуции отвечают всего 400 человек — легко.
Greendq
Это вы ещё сами скрипты (вернее — сборную солянку из таковых) для публикации под разными платформами у них не видели. Веселуха там ещё та. Хотя недавно вот выпустили гуишную тулзу, но всё равно танцевать с бубном надо :)
kvasvik
Чем крупнее компания, тем меньше у рядового сотрудника шансов получить какие-то бонусы благодаря своей инициативе. Соответственно мотивация к качественному труду падает ниже плинтуса. Так что всё закономерно.