Caputchin
Понимание Caputchin

Игровой античит

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

Это третьи ворота проверки, сложенные с proof of work и инструментированием. Они настраиваются на каждый ключ на странице Безопасность.

Жизненный цикл

Раунд проходит через три фазы: собран на сервере перед игрой, запущен в песочнице в браузере во время игры и перепроверен на сервере после игры.

Перед раундом: серверно-авторитетная настройка

Всё, что решает, чем раунд является, происходит на сервере, никогда в браузере. Это принцип «никогда не доверяй клиенту» из многопользовательского античита: клиент шлёт намерение, сервер решает реальность.

  • Подписанный одноразовый тикет чеканит раунд. Он короткоживущий и может быть потрачен только раз. Перехваченный тикет нельзя повторить во второе прохождение.
  • Игра и её случайный сид выбираются на сервере и несутся в тикете. Браузер не может выбрать игру полегче или дружелюбнее сид, потому что он никогда не делает этот выбор.
  • Каждый раз другая игра из подходящего пула. Решатель никогда не знает, с какой игрой столкнётся, так что не может предобучиться на одной статичной цели. Операторы могут сузить ротацию, но сервер всегда выбирает из разрешённого набора. Сам пул содержит только игры, прошедшие проверку соответствия во время индексации. Смотри построй игру для маркетплейса.

Во время раунда: игра в песочнице

Игра работает в браузере посетителя, но внутри границы, которая защищает и сайт посетителя, и целостность раунда.

<caputchin-game> монтирует каждую игру в изолированном iframe без same-origin доступа, так что у игры непрозрачный источник, и она не может дотянуться до cookie, хранилища, DOM или same-origin сети хост-страницы. Её инлайновая content-security-policy прибивает скрипт ровно к бандлу игры и блокирует исходящие сетевые вызовы, а бандл сверяется с известным хешем до запуска (несоответствие падает закрыто). Собственная политика безопасности хост-страницы не тронута. Точная форма песочницы и политики задокументирована в как Caputchin изолирует игры в песочнице.

Вывод: игра не доверена по умолчанию и заключена. Она не может ничего вынести и не может вмешаться в страницу, в которую встроена.

После раунда: детерминированный реплей

Когда посетитель заканчивает, браузер отправляет записанную трассу вводов. Сервер не верит браузеру на слово о результате. Он перезапускает трассу.

  • Раунд пересимулируется на сервере под тем же выведенным на сервере сидом, в запечатанном изоляте без сетевого доступа и с жёстким бюджетом времени. Это то же свойство, на которое опирается детерминированный lockstep в стратегиях: идентичный сид плюс идентичные вводы воспроизводят идентичную игру. Трасса, которая на деле не прошла игру, не воспроизводит проходной исход.
  • Прошёл или нет берётся из этого реплея, никогда из числа, которое сообщил браузер. Клиент не может заявить счёт, который не заработал.
  • Подписанный токен выдаётся, только если реплей подтверждает игру. Этот токен сам одноразовый, когда твой бэкенд позже подтверждает его во время проверки.

Чего Caputchin не делает

Большинство игровых и интерактивных CAPTCHA опираются на поведенческие сигналы: энтропию траектории мыши, тайминг нажатий, телеметрию устройства, скормленную классификатору, который гадает бот-против-человека. Caputchin намеренно не делает этого. Он не собирает поведенческого профиля игрока. Вместо того чтобы гадать, как вводы были произведены, он перевыводит, действительно ли они проходят игру, из первых принципов. Это и позиция приватности, и позиция безопасности: нет поведенческой модели, которую можно обмануть, только физика, которую нужно воспроизвести.

Честный предел

Ворота сильны лишь настолько, насколько сильна игра. Машинерия античита доказывает, что в раунд по-настоящему сыграли, а не подделали, но она не может сделать лёгкую игру трудной. Тривиальная игра (статичная доска, выигрышный ход, читаемый в DOM, «кликни красную точку, чтобы пройти») дешева для скрипта, и детерминированный реплей верно подтвердит, что эти скриптовые вводы побеждают, потому что они побеждают. Сопротивляемость ботам исходит из того, что сама игра трудна для программного решения: быстрые, сенсорные реакции за доли секунды, без решения, сидящего в DOM. Слой античита гарантирует, что игра была настоящей; дизайн игры решает, была ли настоящая игра трудна для автоматизации. Выбирай и строй игры с этим в уме, смотри построй игру для маркетплейса.

Прошёл или нет решается собственной логикой каждой игры; сервер верно перезапускает эту логику, но не подвергает сомнению то, что конкретная игра считает победой. Игровой античит сильнейший, когда скомпонован с proof of work, инструментированием и остальными настройками безопасности ключа.

На этой странице