Ответы приезжают заранее: как Sherlock Quiz отдаёт всю игру игроку

Открываешь инструменты разработчика в браузере — до того как ведущий задал первый вопрос — и видишь правильные ответы. Все. На всю игру. Не «можно догадаться», не «утекает по одному»: весь ответник целиком, одним запросом, без логина. Ребята, мы вас любим и всё равно к вам ходим. Но так нельзя.

Это Sherlock Quiz (play.sherlockquiz.com). Мы играем там ради процесса, а не ради победы. Процесс, как выяснилось, короче, чем вы задумывали.

Что происходит

Приложение игрока — это страница в браузере. Чтобы показать вам вопрос, она сначала скачивает игру. Целиком. Одним обращением к открытому адресу:

GET https://play-server.sherlockquiz.com/api/game/<номер игры>

Ни логина, ни номера команды, ни «игра должна идти прямо сейчас» — ничего не требуется. В ответе лежит вся колода слайдов. У каждого вопроса есть поле answers с принятыми ответами. И слайды, которыми ведущий потом торжественно раскрывает ответ, — тоже там, заранее.

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

Проверили на игре 4577 («Песочные часы №9», 16 сентября 2026). Вернулись ответы на 72 вопроса из 72. Скрипт-подтверждение — 90 строк на голой стандартной библиотеке Python, без единой зависимости. Игра уже отыграна — её ответы сервер и сам теперь стёр, — так что это не шпаргалка, а разбор: скрипт-подтверждение и слепки сыгранных игр лежат в открытом репозитории, github.com/debedb/voroshilovka.

Для тех, кто не про код

Представьте телевикторину, где каждому зрителю перед эфиром раздают конверт со всеми ответами и просят «не подглядывать». Технически игра честная. Практически честны только те, кто не открыл конверт.

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

Злой умысел или криворукость

Почему ответы вообще уезжают клиенту — вопрос открытый, и у него ровно две ветки. Либо недосмотр: «фронтенду удобно получить всю игру разом, и никто не подумал, что в этой конкретной игре именно ответы и есть секрет». Либо так задумано — и тогда уже не нам объяснять зачем. Обе ветки говорят об одном: секрет отдают тому, от кого его прячут. Какая из двух — решайте сами, мы не настаиваем.

Как это чинится

Дыра простая, и чинится стандартно. Три шага, и сервер уже умеет всё нужное:

  1. Не отдавать answers (и слайды-раскрытия) клиенту вообще. Чтобы показать вопрос, они клиенту не нужны.
  2. Присылать слайды по одному, по мере того как ведущий их листает.
  3. Проверять ответы на сервере — он и так их получает, команда отправляет ответ через POST /api/answer/<номер игры>.

Ничего экзотического. Ответ проверяется там, где ему и место, — на сервере, а не на телефоне игрока, которому по определению доверять нельзя.

А теперь про то, как в это вообще попасть

Здесь начинается отдельный анекдот, и рассказываем мы его с любовью. 23 сентября команда не собралась, и мы решили зайти в игру 4578 («Песочные часы», $80 с команды) в одиночку. Онлайн-регистрация закрывается ровно в момент старта — мы опоздали на минуту и получили ласковое «На данный момент нет игр в вашем городе». В Кремниевой долине игр, кстати, не запланировано вовсе. Написали в чат на сайте, по-русски, предложили заплатить и войти позже. Ответа пока нет.

Но лучшее — это вход. Логин только по СМС. Код так и не пришёл на американский номер, который прекрасно получает коды от Verizon, Fidelity и прочих. Причина, скорее всего, будничная: американские операторы молча режут автоматические СМС от отправителей, не зарегистрированных как 10DLC, toll-free или короткий номер, а «Онлайн игры (США)» регистрируют людей через отправителя, который, похоже, не оформлен. Ирония в чистом виде: онлайн-игра для США, в которую из США не войти.

Утечка при этом жива-здорова. Перед игрой 4578 мы сохранили всю её колоду с ответами — 73 вопроса — не заглядывая в неё, просто как свежее доказательство. А игра 4577 теперь отдаёт пустой ответ: доигранные игры, похоже, вычищают. Так что вчерашний слепок — это и есть улика.

Как мы с этим поступаем

Сначала — как не. Ответы конкретной игры не выкладываем, рабочий дампер тоже. На следующей игре, если соберём команду, играем честно; утечку в это время гоняем параллельно, отдельно, и её экран команда не видит.

Порядок такой: сначала пишем организаторам (для 4577 это «Онлайн игры США»), отдаём описание находки и предлагаем починку. Даём время ответить.

Здравствуйте! Играем у вас с удовольствием. Заметили, что приложение для игроков загружает всю игру целиком через открытый адрес, и там же лежат правильные ответы на все вопросы. Любой игрок может увидеть их через инструменты разработчика браузера ещё до вопроса. Предлагаем не отдавать ответы клиенту и присылать слайды по одному по ходу игры. Готовы показать подробнее.

Это описание мы отправляем организаторам вместе с этой публикацией. Так что дальше — два честных «пока нет».

Поправка от 24 сентября 2026. Зачёркнутое выше — неправда, и мы это не прячем, а держим на виду. По-честному про себя: ответы и рабочий дампер мы как раз выложили — код (leak.py) и слепки игр 4577 и 4578 лежат в открытом репозитории, при себе мы ничего не оставили. На 4577 мы не жульничали, только нашли утечку; слепок 4578 сохранили до игры не заглядывая, да и не играли её. И главное: организаторам до публикации не написал никто. Мы заметили это через несколько минут после выхода поста и отправили им уведомление сразу — после публикации (24 сентября 2026, 16:04 PT, через чат на сайте), а не до. Так что по учебнику это не «ответственное раскрытие», и мы прямо об этом говорим. С организаторами по-прежнему ничего не изменилось: ответа нет. И да, для протокола: пост вышел в 15:58 PT, уведомление ушло в 16:04, а эту поправку мы повесили в 16:07 — свою ошибку мы поймали за минуты. Чего не всегда скажешь о больших редакциях.

Ответа организаторов пока нет. Единственный канал, который мы успели попробовать, — чат на сайте, — так и молчит. Появится ответ — обновим пост.

Следующая игра ещё не сыграна. Когда сыграем честно (а утечку прогоним параллельно, отдельно от команды), допишем, что показала демонстрация.

Дальше — интереснее. Отдельно думаем над «честным» помощником: агент видит только текущий слайд, ровно как человек в зале, и подсказывает команде. Никакого раннего доступа к ответнику — только то, что уже на экране. Но это уже следующая история.

Пока же вывод простой, и он бесплатный, в отличие от игры. Если ваш секрет уезжает на устройство того, от кого вы его прячете, — это не секрет, это отложенная публикация.

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.