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

Комментарии (21)


  1. atomAltera
    01.04.2016 09:37
    +9

    Не перестаю удивляться, как ТАКИЕ уязвимости могут быть у ТАКИХ компаний. А в общем статья ничем особо не примечательна


    1. neomedved
      01.04.2016 13:29
      +3

      В компании, где за 3 популярных онлайн-игры и огромный сервис цифровой дистрибуции отвечают всего 400 человек — легко.


    1. Greendq
      01.04.2016 15:00

      Это вы ещё сами скрипты (вернее — сборную солянку из таковых) для публикации под разными платформами у них не видели. Веселуха там ещё та. Хотя недавно вот выпустили гуишную тулзу, но всё равно танцевать с бубном надо :)


    1. kvasvik
      03.04.2016 17:39
      +1

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


  1. snake302
    01.04.2016 09:42

    На самом деле в панели стима все еще хуже. Например, у них стоит запрет на публикацию приложений в магазин в выходные. И самое интересное, что кнопка "Submit to live" с запросом ReleaseGame просто комментируется через // в зависимости от времени суток…


    1. Prototik
      01.04.2016 11:05

      Кстати, а не знаете, с чем связан такой запрет на публикацию в выходные дни?


      1. snake302
        01.04.2016 11:17

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


  1. 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)


    1. ExplosiveZ
      01.04.2016 13:30
      -1

      Нифига себе! Я уж подумал, что это шутка первоапрельская…


      1. susnake
        01.04.2016 14:05

        Да, я тоже сперва. Потом стало любопытно и нашел. В SteamDB немного информации тоже есть про нее https://steamdb.info/app/445730/


  1. bigfatbrowncat
    01.04.2016 11:44

    Я бы, на месте Valve, за такую уязвимость подарил вам аккаунт. А, кстати, он правда стоит сто баксов? Нехило...


    1. snake302
      01.04.2016 14:12

      3200 рублей стоит возможность публикации игры в Steam Greenlight. И если она пройдет, вот тогда уже дадут доступ.


  1. anetwork
    03.04.2016 17:37

    Кстати у Valve есть bug bounty. www.valvesoftware.com/security


  1. NoRoomInHell
    03.04.2016 17:37

    Супер, Гейб негодует


  1. Barafu
    03.04.2016 17:39
    +3

    Начало статьи звучит примерно так: Как я взломал сайт Пентагона: в общем был у меня root shell на сайте Пентагона. Откуда взял не скажу, и не спрашивайте. И вот набрал я cd /var/www…
    Чел где-то нарыл анонимно аккаунт, который в норме можно получить после кучи согласований, но уязвимостью называет то, что из-под этого аккаунта не все углы заполированы. Да потому и не заполированы, что там одни серьёзные дяди сидят. Любой вред, нанесённый пользователем такого акка Valve просто отсудит в 10-кратном размере.
    Когда написать, что сделал, нельзя, но очень хочется — получаются такие тексты.


    1. andrew911
      03.04.2016 21:46

      Чел обнаружил, что в клиенте можно поменять ИД и выдать себя за пользователя с другим уровнем доступа и возможностями.
      «Да потому и не заполированы, что там одни серьёзные дяди сидят.»
      А вот сейчас смешно было.


      1. Barafu
        03.04.2016 22:16

        Звучит оно примерно как "На секретной базе в подвале есть сверхзакрытая комната, в которой запертый арсенал, где кроме прочего в ящичке лежат патроны. Так вот, на этом ящичке замок можно фомкой снять." Плохо, конечно, не спорю. Но это наименьшее из возможных "плохо". Настоящий трындец — это как он до ящичка добрался.
        Вон Вконтакте тоже можно было, не зарегистрировавшись, смотреть фото на аккаунтах, тупо прописывая полный адрес. И всем до лампочки. Здесь у описанной уязвимости такой же уровень сложности.
        На том уровне доступа, который у него был изначально, эскалация до того, что он получил — никем изначально не рассматривалась, как вектор атаки. Это не мужик с улицы опубликовал игру и мог подложить малварь. Это корпоративный аккаунт нарушил техническое обеспечение неких правил, которые вообще можно было технически не ограничивать, а оговорить на бумаге.
        Я почему так недоволен — ну это мне уже напоминает про хакера и солонку. Это как при глючном сайте сидеть и править баги в админке, чтобы младший админ не смог эскалироваться до старшего, хотя они оба друг-друга знают. У Стима клиентское приложение эпически кривое, а с такими претензиями они на команду внутреннего сайта будут больше ресурсов тратить.
        Нашёл дыру во внутренней админке — молодец. Сообщил — ещё раз молодец. Но зачем теперь это обсуждать на всепланетном уровне — то?


        1. andrew911
          04.04.2016 12:21

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


  1. shtgn
    03.04.2016 17:39

    Захотелось поиграть.


  1. bowel
    03.04.2016 17:40

    И за это Valve никак не вознаградила?


  1. MaximChabanyuk
    03.04.2016 17:45

    И все-таки, как Вас отблагодарил Valve за найденную уязвимость?