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



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


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

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

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


Моё небольшое расследование всей этой истории началось с получения доступа к Steamworks. Не буду рассказывать как и почему у меня появился доступ, но я не использовал никакие уязвимости ни форумов, ни Greenlight, и не общался ни с кем из Valve. Раскрывать эти детали я не буду, и не просите.
You've been invited to the Steamworks Developer Program
i@steam powered, com >
Trouble viewing this message7 Clck here
STEAM'
You've been invited to the Steamworks Developer Program
Your application 'untitled app' has been invited to be distributed via Steam. To continue, you will need to
В общем, получил я доступ к Steamworks (внутренней платформе Valve для размещения игр в Steam, редактирования ачивок, DRM, мультиплеера и т.п.), и после этого мне пришла идея поискать уязвимости. Приближалось 1 апреля и я решил использовать эту возможность, чтобы опубликовать безымянное приложение и привлечь внимание Valve к проблеме.

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

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


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

На странице у статуса есть несколько первоначальных вариантов:
Release State:
Ready for Review	▼
I Not ready	
Ready for Review	
Not ready due to edits	
Change Notes:,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,geek новости,Valve,Steam,Стим,Игры

А что там в исходниках?
form id="communityitem_edit_form method= POST enctype= multipart/form-data <input type="hidden" name="sessionid" value <input type="hidden" name="MAX_FILE_SIZE" value=M8388608"> cinput type="hidden" name=,,action" value="edit">
<input type="hidden" name="item[class]" value="l">
<input

Интересно, что отслеживается как сессия, так и ID учётной записи редактора. Попробуем поменять ID на какой-нибудь такой, который может принадлежать сотруднику Valve (допустим, на 1), изменим значение селекта на несуществующее и посмотрим, не получим ли мы в ответ другую форму.
There were errors saving changes:
Last editor	.!...... (f
Steam Trading Cards - Series informati
Edit the settings here to configure the state of your tra you've changed in the changeNotes field
About Review and Release
When you are ready for your trading cards to be revie for review of your

Занятно – подменный «последний редактор» действительно оказался сотрудником. А если мы снова сохраним эту форму со значением «Released»?
Changes saved.
Return to Item list
Last editor	. (Ruby)
Steam Trading Cards - Series informati
Edit the settings here to configure the state of your tra you've changed in the changeNotes field
About Review and Release
When you are ready for your trading cards to be revie for review of your

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

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


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

Релиз игры


Сайт Steamworks в основном использует AJAX. JS-код не обфусцирован и виден всем (кто авторизован в Steamworks). Я нашёл интересную функцию “ReleaseGame(appid, data)”. Судя по всему, она делала типичный AJAX-запрос и делала релиз игры.
function ReleaseGame|(appid, data^
{
jQuery.ajax({
dataType: "json",
url: 'https: //partner. steamgames. com/| type: 'POST', data: data,
success: function(data)
{,geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,geek новости,Valve,Steam,Стим,Игры

Вызов функции ReleaseGame с параметрами 445730 (мой appid) и пустыми данными выдал мне статус 403. Просмотрев другие функции, я увидел, что почти все они добавляют значение в JSON-запрос под названием sessionid – этот id мы видели раньше, когда релизили наши карточки.
function Updatel {
rgChanges
// ensure session ID is present
if ( !( 'sessionid' in rgChanges ) ) {
rgChanges[ 'sessionid' ] = g_sessionID;
>
$D.ajax({
url: 'https://partner.steamgames.com/i cache: false, type: "POST”, data: rgChanges,
),geek,Прикольные гаджеты. Научный, инженерный и

Итого, вызываем ReleaseGame(445730, { ‘sessionid’: ‘my_session_id’):
Release date:
Mar 27, 2016 @ 12:56pm (?)
App Release State:
Released (?),geek,Прикольные гаджеты. Научный, инженерный и  айтишный юмор,geek новости,Valve,Steam,Стим,Игры

Идём в магазин Steam
Featured items
Games
Software ▼
Hardware ~
Videos
ЛИ Games Sports Games Watch paint dry
Watch paint dry
IN LBRARV
Watch paint dry is already in your Steam library
For You -
Community Hub
watch paint dry: the game
A puzzle-sports game where you watch paint dry.
ser revie.- Positive


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

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

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

¯\_(ツ)_/¯