Większość pomysłów krypto opartych na lokalizacji z 2020 roku po cichu umarła dlatego, że ufały GPS. GPS to sygnał nadawczy, którego może słuchać każdy odbiornik, a odbiornikowi można kazać kłamać o tym, co usłyszał. Narzędzia do tego kosztują około trzydziestu dolarów na Amazonie i tak jest od 2015 roku. Każdy protokół, który płaci portfelowi za stanie we współrzędnej, a to stanie weryfikuje samym GPS, traci pieniądze na rzecz fałszywych portfeli stojących na kanapach. To ani trudny, ani sprytny atak.

Dowód lokalizacji to warstwa, która to naprawia. Tego wyrażenia używa się częściej, niż się je definiuje, więc zacznijmy od definicji. Dowód lokalizacji to twierdzenie, możliwe do zweryfikowania przez stronę, której tam nie było, że konkretne urządzenie było w konkretnej współrzędnej w konkretnym oknie czasowym. To twierdzenie o obecności, a nie o współrzędnej. W tej różnicy kryje się większość pracy inżynieryjnej.

Model zagrożeń. Nie bronimy się przed państwem; ten skrajny przypadek pojawia się na końcu. Bronimy się przed typowym atakującym z telefonem, laptopem i wolnym popołudniem. Taki atakujący może podrobić GPS gotowym narzędziem, uruchomić aplikację w emulatorze i utworzyć portfel jedną linijką kodu. Każde pojedyncze zabezpieczenie da się przez niego pokonać. Celem inżynieryjnym jest to, by koszt pokonania ich wszystkich razem był wyższy niż nagroda w dropie.

Ten tekst opisuje prostym językiem, co Seek robi dziś, i co jest w drodze. Celowo jest krótszy w części marketingowej, a dłuższy w części o mechanice.

Warstwa pierwsza, przy łapaniu: atestacja urządzenia. Każde żądanie złapania zawiera podpisane oświadczenie systemu operacyjnego. Na iOS to Apple App Attest, na Androidzie Google Play Integrity. Seek weryfikuje oba po stronie serwera. Atestacja mówi trzy rzeczy w jednym podpisie: to prawdziwe urządzenie, plik aplikacji nie został zmodyfikowany, a wywołujący ma klucz utworzony na tym urządzeniu dla naszej aplikacji. Zrootowany telefon nie przechodzi. Emulator nie przechodzi. Przepakowana aplikacja, która pominęła sprawdzanie lokalizacji, nie przechodzi. Atestacja nie dowodzi, gdzie jest telefon; dowodzi, że telefon nie kłamie, że jest telefonem. Dzięki temu pozostałe sygnały są warte czytania.

Warstwa druga, przy łapaniu: odległość z marginesem. Klient pozwala stuknąć przycisk łapania tylko wtedy, gdy jesteś w promieniu zbierania spawnu. Serwer niezależnie porównuje przesłane współrzędne ze współrzędnymi spawnu i akceptuje do siedemdziesięciu pięciu metrów różnicy. Różnica między promieniem przycisku a promieniem serwera jest celowa. Drgania GPS w telefonie opartym o ścianę mogą przesunąć pozycję o kilka metrów z przyczyn, za które nie odpowiadasz, a odrzucanie złapań w obrębie tych drgań wydaje się arbitralne. Powyżej siedemdziesięciu pięciu metrów żądanie jest odrzucane od razu, bez oceny i bez odwołania na tym poziomie.

Warstwa druga, ciąg dalszy: limity częstotliwości i limity na spawn. Dwa żądania zebrania w odstępie krótszym niż pięć sekund dostają kod 429 od bramki opartej na Postgresie, która działa między izolatami serverless. Jeden spawn przyjmuje maksymalnie dwie próby z tego samego konta, a druga próba jest warta 65 procent pierwszej. Te limity nie służą wykrywaniu oszustw; są po to, by bot, który już pokonał inne warstwy, nie mógł eksploatować endpointu szybciej, niż gra człowiek.

Warstwa trzecia, przy łapaniu: sygnały środowiska, zapisywane, ale nie egzekwowane. Każde złapanie niesie też flagi: czy żądanie przyszło z symulatora, czy Android zgłosił pozycję jako pochodzącą od dostawcy fałszywej lokalizacji, oraz zgłoszoną dokładność GPS w metrach. Są zapisywane i nigdy nie służą do odrzucenia samego złapania. Klient, który w ich sprawie kłamie, to dokładnie ten klient, któremu nie chcesz powierzać decyzji, więc decyzja zapada gdzie indziej. Mają znaczenie w warstwie czwartej.

Warstwa czwarta, przy wypłacie: bramka antyfraudowa. Wypłaty przechodzą przez funkcję serwerową, która czyta złapania konta z ostatnich dziewięćdziesięciu dni. Jeśli któreś z nich pochodziło z symulatora, Android zgłosił fałszywego dostawcę lokalizacji, konto miało dwa udane złapania w odstępie krótszym niż dziesięć sekund, konto przemieściło się między dwiema współrzędnymi złapań szybciej, niż może przemieścić się człowiek, albo inne konto wypłacało z tego samego odcisku urządzenia, wypłata trafia do weryfikacji przez człowieka zamiast automatycznego zatwierdzenia. Użytkownik nie dowiaduje się, który alarm zadziałał, a jego konto dalej normalnie gra. Wykrywanie to decyzja biznesowa dotycząca wypłat, a nie kara.

Łapanie i wypłatę rozdzielamy dlatego, że chronią różne rzeczy. Warstwa łapania chroni grę. Jeśli złapanie było oszustwem, zamienia się w walutę gry, która nigdy nie opuszcza aplikacji, co nic nie kosztuje. Warstwa wypłat chroni prawdziwe pieniądze. Każdy dolar opuszczający system przechodzi przez dziewięćdziesięciodniowy przegląd tego, co doprowadziło do salda, a jeden podejrzany sygnał w tym oknie wystarczy, by przekazać decyzję człowiekowi. Razem obie warstwy oznaczają, że uczciwy gracz nigdy nie odczuwa tarcia w chwili złapania, a atakujący, któremu przeszło złe złapanie, nigdy nie zobaczy pieniędzy.

Warstwa piąta, przy łapaniu: zapis ruchu. Każdy telefon ma akcelerometr i żyroskop w tym samym układzie, który rozmawia z GPS. Seek zapisuje teraz krótkie okno ruchu z sekund poprzedzających złapanie, oblicza niewielki zestaw statystyk (wariancję wielkości, aktywność obrotową, liczbę nieruchomych klatek) i wysyła to podsumowanie z żądaniem zebrania. Telefon, który doszedł do spawnu, ma inny ślad ruchu niż telefon leżący na biurku z uruchomionym symulatorem GPS. Ten ślad nie jest dziś egzekwowany na poziomie łapania, z tego samego powodu co flagi środowiska: zmodyfikowany klient może kłamać. Trafia do dziewięćdziesięciodniowej bramki antyfraudowej obok sygnałów symulatora i fałszywego dostawcy, a płaski zapis ruchu w historii to kolejny alarm, który przekazuje wypłatę do weryfikacji przez człowieka.

Przykład z życia. Tester uruchamia fałszerz GPS, ustawia współrzędną na drop Seek po drugiej stronie miasta i stuka złapanie. Sprawdzenie odległości przechodzi, bo podrobiona współrzędna się zgadza. Atestacja przechodzi, bo aplikacja nie jest zmodyfikowana. Złapanie zostaje zapisane. Dwie godziny później ten sam tester robi trzy kolejne złapania, jedno z nich z innej współrzędnej, dziesięć kilometrów dalej. Zapis ruchu we wszystkich czterech jest płaski (telefon się nie ruszał), a sprawdzenie niemożliwego przemieszczenia uruchamia się przy dwóch współrzędnych, do których nie dało się dojść pieszo w dwie godziny. Konto dalej gra, dalej zbiera i nie wie, że coś jest nie tak. Gdy tester prosi o wypłatę, ta trafia na biurko weryfikatora z dołączoną flagą niemożliwego przemieszczenia i płaskim zapisem ruchu. Weryfikator odmawia. Zebrane przez testera saldo warte czterdzieści dolarów nigdy nie ma żadnej wartości poza aplikacją.

Rama ekonomiczna. Nie chodzi o to, że podrobienie samego złapania jest niemożliwe; chodzi o to, że bramka wypłat odczytuje wszystko, co konto zrobiło, by dojść do salda. Drop wart dwa euro chroniony atestacją i odległością łatwo zaatakować raz i nie ma sensu atakować wielokrotnie, bo sprawdzenie przy wypłacie wyłapuje wzorzec, zanim wzorzec zamieni się w pieniądze. Drop wart dziesięć tysięcy euro potrzebuje silniejszej ramy na poziomie łapania i o tym jest roadmapa poniżej.

Co jest na roadmapie. Następnym zabezpieczeniem, które się pojawi, jest beacon zapasowy dla dropów w budynkach. Dla spawnu umieszczonego w budynku, gdzie GPS nic nie znaczy, mały beacon Bluetooth zarejestrowany dla dropa pozwala aplikacji udowodnić obecność w ogóle bez polegania na sygnale satelitarnym. Drugim torem jest egzekwowanie atestacji: dziś żądania bez atestacji są zapisywane, ale nadal przyjmowane, abyśmy mogli zmierzyć odsetek fałszywych odrzuceń wśród uczciwych urządzeń, zanim przełączymy przełącznik i zaczniemy je odrzucać. Oba pojawią się jako małe, nudne, weryfikowalne dodatki do tego samego wzorca łapania i wypłaty, który już działa.

Co wciąż nie działa dobrze. GPS w centrum handlowym myli się o dziesięć do piętnastu metrów i żadna sprytność po stronie serwera tego nie naprawi; prawdziwą odpowiedzią jest beacon i dlatego jest na roadmapie. Opóźnienia poniżej sekundy nie ma i pewnie nie będzie, bo bramka antyfraudowa czyta historię, a nie pojedyncze żądanie. Urządzenia ubieralne mają mniej czujników niż telefony, więc projekt dowodu lokalizacji dostrojony do telefonów nie przenosi się gładko na okulary. A państwo z ciężarówką sprzętu radiowego pokona dziś każdego weryfikatora opartego na telefonach; każdy protokół, który twierdzi inaczej, nie jest wobec ciebie uczciwy. Nasz nie będzie tego twierdził.

Zasada projektowa, którą warto powiedzieć na głos. Weryfikator powinien być uczciwy co do tego, czego może, a czego nie może dowieść. Przedstawianie probabilistycznego wyniku jako bezwzględnego tak lub nie jest gorsze niż bezwzględne tak lub nie wynikające ze ścisłych zasad, bo wynik tworzy suwak, a każdy suwak jest przesuwany w stronę przyjmowania większej liczby odbiorów, gdy cele zaangażowania nie są realizowane. Nasza warstwa łapania nie ma suwaka. Albo przechodzi sprawdzenia, albo nie. Warstwa antyfraudowa ma suwak, a ten suwak jest w rękach człowieka, a nie w kodzie.

To element pod Seek, który sprawia, że zakotwiczone aktywa i airdropy potwierdzone lokalizacją mają sens. Wydawca umieszcza token wart prawdziwe pieniądze we współrzędnej, bo osoba, która go w końcu dostanie, była w tej współrzędnej z urządzeniem z atestacją, i bo bramka wypłat przeczyta historię konta, zanim pieniądze się ruszą. Pełna specyfikacja jest w whitepaperze. Ten tekst to wersja prostym językiem tego, co dzieje się w aplikacji.

W skrócie. Obecność to nie współrzędna. Jeden sygnał nie dowodzi obecności. Seek potwierdza obecność w dwóch warstwach: atestacja, odległość i zapis ruchu w chwili złapania oraz dziewięćdziesięciodniowa bramka antyfraudowa w chwili wypłaty. Ostatni otwarty element, beacon zapasowy dla dropów w budynkach, zamyka ostatni przypadek współrzędnej, którego sam GPS nie obsłuży. Tym właśnie jest dziś dowód lokalizacji w Seek i dlatego ta warstwa ma większe znaczenie niż wszystkie efektowniejsze rzeczy, które umożliwia.