Більшість крипто-ідей 2020 року, заснованих на місцезнаходженні, тихо померли тому, що довіряли GPS. GPS це широкомовний сигнал, який може слухати будь-який приймач, а приймач можна змусити брехати про те, що він почув. Інструменти для цього коштують близько тридцяти доларів на Amazon, і так із 2015 року. Будь-який протокол, що платить гаманцю за те, що той стоїть на координаті, і перевіряє це лише за GPS, втрачає гроші на підроблених гаманцях, що лежать на дивані. Це не складна атака й не хитра.
Доказ місцезнаходження це шар, який це виправляє. Вираз використовують частіше, ніж визначають, тож почнімо з визначення. Доказ місцезнаходження це твердження, яке може перевірити сторона, що не була присутня, що конкретний пристрій перебував на конкретній координаті в конкретне вікно часу. Це твердження про присутність, а не про координату. Саме в цій відмінності криється більша частина інженерної роботи.
Модель загроз. Ми не захищаємося від держави; цей граничний випадок буде наприкінці. Ми захищаємося від пересічного атакувальника з телефоном, ноутбуком і вільним днем. Такий атакувальник може підробити GPS готовим інструментом, запустити застосунок в емуляторі й створити гаманець одним рядком коду. Будь-який окремий захист такий атакувальник може обійти. Інженерна мета в тому, щоб обхід усіх захистів разом коштував дорожче за нагороду за дроп.
Ця стаття простими словами описує, що Seek робить сьогодні і що на підході. Маркетингової частини в ній свідомо менше, а механіки більше.
Шар перший, у момент ловлі: атестація пристрою. Кожен запит на ловлю несе підписану заяву операційної системи. На iOS це Apple App Attest, на Android це Google Play Integrity. Seek перевіряє обидва на сервері. Атестація одним підписом каже три речі: це справжній пристрій, бінарник застосунку не змінено, і відправник має ключ, створений на цьому пристрої для нашого пакета. Телефон із root-доступом не проходить. Емулятор не проходить. Перезібраний застосунок, що пропустив перевірку місцезнаходження, не проходить. Атестація не доводить, де телефон; вона доводить, що телефон не бреше про те, що він телефон. Саме тому інші сигнали взагалі варто читати.
Шар другий, у момент ловлі: відстань із запасом. Клієнт дає змогу натиснути кнопку ловлі, лише коли ви перебуваєте в радіусі збирання появи. Сервер незалежно звіряє надіслані координати з координатами появи й допускає розбіжність до сімдесяти п'яти метрів. Різниця між радіусом кнопки й радіусом сервера навмисна. Тремтіння GPS у телефона, притуленого до стіни, може зсувати позицію на кілька метрів не з вашої вини, і відмова в ловлі в межах цього тремтіння виглядала б довільною. Далі сімдесяти п'яти метрів запит одразу відхиляється, без оцінювання й без апеляції на цьому шарі.
Шар другий, продовження: обмеження частоти й ліміти на появу. Два запити на збирання з інтервалом менше п'яти секунд отримують відповідь 429 від обмежувача на базі Postgres, що працює в усіх безсерверних ізолятах. Одна поява приймає не більше двох спроб від одного акаунта, і друга спроба варта 65 відсотків від першої. Ці ліміти існують не для виявлення шахрайства; вони потрібні, щоб бот, який уже обійшов інші шари, не міг видобувати з ендпоінта швидше, ніж грає людина.
Шар третій, у момент ловлі: сигнали оточення, що записуються, але не застосовуються. Кожна ловля також несе прапорці: чи надійшов запит із симулятора, чи повідомив Android, що позицію отримано від фіктивного джерела місцезнаходження, і заявлену точність GPS у метрах. Їх записують і ніколи не використовують для відмови в самій ловлі. Клієнт, що про них бреше, це саме той клієнт, якому не можна довіряти рішення, тому рішення ухвалюється деінде. Вони важливі на четвертому шарі.
Шар четвертий, у момент виплати: антифрод-фільтр. Виведення проходять через серверну функцію, яка читає ловлі акаунта за останні дев'яносто днів. Якщо якась із них надійшла із симулятора, або Android повідомив про фіктивне джерело, або акаунт зробив дві успішні ловлі з інтервалом менше десяти секунд, або акаунт переміщувався між двома координатами ловлей швидше, ніж може людина, або з того самого відбитка пристрою виводив кошти інший акаунт, виведення спрямовують на перевірку людині, а не схвалюють автоматично. Користувачеві не повідомляють, що саме спрацювало, і його акаунт і далі грає як звичайно. Виявлення це ділове рішення щодо виплат, а не покарання.
Ловлю й виплату розділяють тому, що вони захищають різне. Шар ловлі захищає гру. Якщо ловля була шахрайською, вона перетворюється на ігрову валюту, що ніколи не залишає застосунку, і це нічого не коштує. Шар виплати захищає реальні гроші. Кожен долар, що залишає систему, проходить дев'яностоденну перевірку того, як склався баланс, і одного підозрілого сигналу в цьому вікні досить, щоб передати рішення людині. Разом ці два шари означають, що чесний гравець ніколи не натрапляє на перешкоди в момент ловлі, а атакувальник, який протягнув погану ловлю, ніколи не бачить грошей.
Шар п'ятий, у момент ловлі: дані руху. У кожному телефоні є акселерометр і гіроскоп на тому самому чипі, що працює з GPS. Тепер Seek записує коротке вікно руху за секунди до ловлі, обчислює невеликий набір статистик (дисперсія величини, обертальна активність, кількість нерухомих кадрів) і надсилає цей підсумок разом із запитом на збирання. У телефона, що дійшов до появи, профіль руху відрізняється від телефона, який лежить на столі із запущеним GPS-симулятором. Сьогодні цей профіль не застосовується на шарі ловлі з тієї самої причини, що й прапорці оточення: змінений клієнт може брехати. Він потрапляє в дев'яностоденний антифрод-фільтр разом із сигналами симулятора й фіктивного джерела, і пласкі дані руху в історії стають ще одним сигналом, що передає виведення на перевірку людині.
Розберімо приклад. Тестувальник запускає підробку GPS, ставить координату дропу Seek на іншому кінці міста й натискає «впіймати». Перевірка відстані проходить, бо підроблена координата збігається. Атестація проходить, бо застосунок не змінено. Ловлю зараховано. Через дві години той самий тестувальник робить ще три ловлі, одну з них з іншої координати за десять кілометрів. Дані руху в усіх чотирьох пласкі (телефон не рухався), а перевірка неможливого переміщення спрацьовує на двох координатах, до яких не можна було дійти пішки за дві години. Акаунт і далі грає, і далі збирає й не підозрює, що щось не так. Коли тестувальник запитує виплату, вона потрапляє на стіл перевіряльника з доданими прапорцем неможливого переміщення й пласкими даними руху. Перевіряльник відмовляє. Зібрані тестувальником сорок доларів балансу так нічого й не варті поза застосунком.
Економічна рамка. Важливо не те, що підробити саму ловлю неможливо; важливо, що фільтр виплат переглядає все, що акаунт зробив, щоб отримати баланс. Дроп вартістю два євро, захищений атестацією й перевіркою відстані, дешево атакувати один раз і безглуздо атакувати повторно, бо перевірка виведення ловить закономірність раніше, ніж закономірність перетворюється на гроші. Дропу вартістю десять тисяч євро потрібна сильніша рамка на шарі ловлі, і про це дорожня карта нижче.
Що в дорожній карті. Наступною з'явиться запасна перевірка за маячком для дропів у приміщеннях. Для появи всередині будівлі, де GPS марний, невеликий Bluetooth-маячок, зареєстрований за дропом, дає застосунку змогу довести присутність, узагалі не залежачи від супутникової позиції. Другий напрям це примусова атестація: сьогодні запити без атестації записуються, але досі приймаються, щоб ми могли виміряти частку хибних відмов для чесних пристроїв, перш ніж увімкнути перемикач і відхиляти їх одразу. І те, і те з'явиться як невеликі, нудні, перевірювані доповнення до вже робочої схеми ловлі й виплати.
Що поки працює погано. GPS у приміщенні помиляється на десять-п'ятнадцять метрів у торговельному центрі, і жодна хитрість на сервері цього не виправить; справжня відповідь це маячок, тому він і в дорожній карті. Затримки менше секунди немає і, ймовірно, не буде, бо антифрод-фільтр читає історію, а не один запит. Носимі пристрої мають менше датчиків, ніж телефони, тому схема доказу місцезнаходження, налаштована під телефони, не переноситься на окуляри один в один. І держава з вантажівкою радіообладнання сьогодні може обійти будь-який мобільний верифікатор; будь-який протокол, що стверджує протилежне, з вами нечесний. Наш не буде.
Принцип проєктування, який варто промовити вголос. Верифікатор має чесно казати, що він може довести, а що ні. Видавати ймовірнісну оцінку за абсолютне «так» чи «ні» гірше, ніж давати абсолютне «так» чи «ні» за суворими правилами, бо оцінка створює повзунок, а будь-який повзунок зсувають у бік прийняття більшої кількості заявок, коли відстають цілі щодо залученості. На нашому шарі ловлі повзунка немає. Перевірки або пройдено, або ні. На антифрод-шарі повзунок є, і він перебуває в людини, а не в коді.
Це та частина Seek, завдяки якій активи з якорем та аірдропи з перевіркою місцезнаходження мають сенс. Паблішер розміщує токен, вартий реальних грошей, на координаті, бо той, кому він дістанеться, був на цій координаті з атестованим пристроєм, і бо фільтр виплат перегляне історію акаунта, перш ніж гроші зрушать із місця. Повна специфікація є у whitepaper. Ця стаття проста версія того, що відбувається всередині застосунку.
Коротко. Присутність це не координата. Один сигнал не доводить присутності. Seek перевіряє присутність у два шари: атестація, відстань і дані руху в момент ловлі та дев'яностоденний антифрод-фільтр у момент виплати. Пункт, що лишається відкритим, запасна перевірка за маячком для дропів у приміщеннях, закриває останній випадок із координатами, з яким GPS сам не впорається. Ось чим насправді є доказ місцезнаходження в Seek сьогодні, і тому цей шар важливіший за всі ефектніші речі, які він робить можливими.


