A 2020-as helyalapú kriptós ötletek többsége azért halt el csendben, mert megbízott a GPS-ben. A GPS egy sugárzott jel, amelyet bármely vevő hallhat, és egy vevőt rá lehet venni, hogy hazudjon arról, mit hallott. Az ehhez szükséges eszköz 2015 óta nagyjából harminc dollárba kerül az Amazonon. Minden protokoll, amely azért fizet egy tárcának, hogy egy koordinátán álljon, és ezt csak GPS-szel igazolja, pénzt veszít a kanapén „álló” hamis tárcák miatt. Ez se nem nehéz, se nem ötletes támadás.

A helyszínigazolás az a réteg, amely ezt megoldja. A kifejezést többet használják, mint amennyit meghatározzák, úgyhogy kezdjük egy meghatározással. A helyszínigazolás egy olyan állítás, amelyet egy jelen nem lévő fél is ellenőrizhet, hogy egy adott eszköz egy adott időablakban egy adott koordinátán volt. Ez a jelenlétről szóló állítás, nem a koordinátáról. A mérnöki munka nagy része ebben a különbségben rejlik.

A fenyegetési modell. Nem egy állam ellen védekezünk; ez a szélsőséges eset a végén jön. Az átlagos támadó ellen védekezünk, akinek van egy telefonja, egy laptopja és egy szabad délutánja. Ez a támadó egy bolti eszközzel meghamisíthatja a GPS-t, emulátorban futtathatja az appot, és egyetlen kódsorral tárcát hozhat létre. Ez a támadó bármelyik egyedi védelmet legyőzheti. A mérnöki cél az, hogy mindegyik együttes legyőzésének költsége magasabb legyen, mint a drop jutalma.

Ez a cikk érthetően bemutatja, mit csinál ma a Seek, és mi van útban. Szándékosan rövidebb a marketingoldalon, és hosszabb a mechanikában.

Első réteg, az elkapáskor: eszközhitelesítés. Minden elkapási kérés az operációs rendszer aláírt nyilatkozatát hordozza. iOS-en ez az Apple App Attest, Androidon a Google Play Integrity. A Seek mindkettőt a szerveren ellenőrzi. A hitelesítés egyetlen aláírásban három dolgot mond: ez valódi eszköz, az app binárisát nem manipulálták, és a hívó olyan kulcsot birtokol, amelyet ezen az eszközön hoztak létre a mi csomagunkhoz. Egy rootolt telefon elbukik. Egy emulátor elbukik. Egy újracsomagolt app, amely kihagyta a helyellenőrzést, elbukik. A hitelesítés nem bizonyítja, hol van a telefon; azt bizonyítja, hogy a telefon nem hazudik arról, hogy telefon. Ettől érdemes a többi jelet is olvasni.

Második réteg, az elkapáskor: távolság türelmi sávval. A kliens csak akkor engedi megnyomni az elkapás gombot, ha a spawn begyűjtési sugarán belül vagy. A szerver függetlenül összeveti az általad küldött koordinátákat a spawn koordinátáival, és legfeljebb hetvenöt méteres eltérést fogad el. A gomb sugara és a szerver sugara közötti rés szándékos. Egy falnak dőlő telefon GPS-e néhány métert is ingadozhat olyan okokból, amelyekről nem te tehetsz, és ha egy ezen az ingadozáson belüli elkapást elutasítanánk, az önkényesnek tűnne. Hetvenöt méteren túl a kérést azonnal elutasítjuk, pontozás és fellebbezés nélkül ezen a szinten.

Második réteg, folytatás: gyakoriságkorlátok és spawnonkénti felső határok. Két, egymástól öt másodpercen belül érkező begyűjtési kérés 429-es választ kap egy Postgres-alapú kaputól, amely szerver nélküli izolátumok között is megmarad. Egy spawn ugyanattól a fióktól legfeljebb két próbálkozást fogad el, és a második az első 65 százalékát éri. Ezek a határok nem a csalás felderítésére szolgálnak; arra valók, hogy egy bot, amely már legyőzte a többi réteget, ne bányászhassa gyorsabban a végpontot, mint ahogy egy ember játszani tud.

Harmadik réteg, az elkapáskor: környezeti jelek, rögzítve, de nem kikényszerítve. Minden elkapás jelzőket is hordoz: hogy a kérés szimulátorból jött-e, hogy az Android mock location szolgáltatótól származónak jelentette-e a pozíciót, és a jelentett GPS-pontosságot méterben. Ezeket rögzítjük, és soha nem használjuk magának az elkapásnak az elutasítására. Egy kliens, amely hazudik róluk, pontosan az a kliens, amelyre nem akarod bízni a döntést, ezért a döntés máshol születik. A negyedik rétegben számítanak.

Negyedik réteg, a kifizetéskor: a csalásszűrő. A kifizetések egy szerverfüggvényen mennek át, amely beolvassa a fiók elmúlt kilencven napjának elkapásait. Ha bármelyik szimulátorból jött, vagy az Android mock szolgáltatót jelentett, vagy a fiók tíz másodpercen belül két sikeres elkapást végzett, vagy a fiók két elkapási koordináta között gyorsabban mozgott, mint ahogy egy ember utazni képes, vagy egy másik fiók ugyanarról az eszköz-ujjlenyomatról vett ki pénzt, a kifizetés emberi átvizsgálásra kerül ahelyett, hogy automatikusan jóváhagynánk. A felhasználó nem tudja meg, melyik drót jelzett, és a fiókja a szokásos módon játszik tovább. A felderítés a kifizetésekről szóló üzleti döntés, nem büntetés.

Azért választjuk szét az elkapást és a kifizetést, mert különböző dolgokat védenek. Az elkapási réteg a játékot védi. Ha az elkapás csalás volt, játékpénzzé válik, amely soha nem hagyja el az appot, és semmibe sem kerül. A kifizetési réteg a valódi pénzt védi. Minden dollár, amely elhagyja a rendszert, átmegy az egyenleghez vezető út kilencvennapos átvizsgálásán, és egyetlen gyanús jel ebben az ablakban elég ahhoz, hogy a döntés emberhez kerüljön. A két réteg együtt azt jelenti, hogy egy becsületes játékos az elkapás pillanatában soha nem találkozik akadállyal, egy támadó pedig, aki átcsempészett egy rossz elkapást, soha nem látja a pénzt.

Ötödik réteg, az elkapáskor: mozgásnyom. Minden telefonban van gyorsulásmérő és giroszkóp ugyanazon a chipen, amely a GPS-szel kommunikál. A Seek most rögzít egy rövid mozgásablakot az elkapást megelőző másodpercekből, kiszámít néhány statisztikát (a gyorsulás nagyságának szórását, a forgási aktivitást, a mozdulatlan képkockák számát), és ezt az összegzést elküldi a begyűjtési kéréssel. Egy telefon, amely elsétált egy spawnhoz, más mozgási mintázatot mutat, mint egy asztalon fekvő telefon, amelyen GPS-szimulátor fut. A mintázatot ma nem kényszerítjük ki az elkapási rétegben, ugyanazért, amiért a környezeti jelzőket sem: egy módosított kliens hazudhat. A kilencvennapos csalásszűrőbe kerül a szimulátor- és mock-jelek mellé, és egy lapos mozgásnyom a nyilvántartásban újabb drót, amely egy kifizetést emberi átvizsgálásra küld.

Egy kidolgozott példa. Egy tesztelő GPS-hamisítót futtat, a koordinátát a város másik végén lévő Seek-dropra állítja, és megnyomja az elkapást. A távolságellenőrzés átmegy, mert a hamisított koordináta egyezik. A hitelesítés átmegy, mert az app módosítatlan. Az elkapás rögzül. Két órával később ugyanez a tesztelő még hármat kap el, az egyiket egy tíz kilométerrel arrébb lévő koordinátáról. A mozgásnyom mind a négynél lapos (a telefon meg sem mozdult), és a lehetetlen mozgás ellenőrzése jelez annál a két koordinátánál, amelyeket két óra alatt gyalog nem lehetett elérni. A fiók tovább játszik, tovább gyűjt, és nem tud róla, hogy bármi baj van. Amikor a tesztelő kifizetést kér, az egy emberi átvizsgálói asztalon köt ki, csatolva a lehetetlen mozgás jelzőjével és a lapos mozgásnyommal. Az átvizsgáló elutasítja. A tesztelő negyven dollárnyi begyűjtött egyenlege soha nem ér semmit az appon kívül.

A gazdasági keret. Nem az számít, hogy magát az elkapást lehetetlen meghamisítani; hanem az, hogy a kifizetési szűrő visszaolvassa mindazt, amit a fiók az egyenlegig eljutva tett. Egy hitelesítéssel és távolsággal védett, két eurót érő dropot egyszer olcsó megtámadni, ismételten pedig értelmetlen, mert a kifizetési ellenőrzés elkapja a mintázatot, mielőtt a mintázatból pénz lesz. Egy tízezer eurót érő drophoz erősebb keret kell az elkapási rétegben, és erről szól az alábbi ütemterv.

Mi van az ütemtervben. A következő védelem a beacon-alapú tartalék a beltéri dropokhoz. Egy épületen belül elhelyezett spawnnál, ahol a GPS értelmetlen, egy a drophoz regisztrált kis Bluetooth-beacon lehetővé teszi, hogy az app a műholdas pozíciótól teljesen függetlenül bizonyítsa a jelenlétet. A hitelesítés kikényszerítése a második szál: ma a hitelesítés nélküli kéréseket naplózzuk, de még elfogadjuk, hogy megmérhessük a becsületes eszközökkel szembeni téves elutasítási arányt, mielőtt átfordítjuk a kapcsolót, és azonnal elutasítjuk őket. Mindkettő kicsi, unalmas, ellenőrizhető kiegészítés lesz ugyanahhoz az elkapási és kifizetési mintához, amely már most is használatban van.

Ami még nem működik jól. A beltéri GPS egy bevásárlóközpontban tíz-tizenöt métert téved, és ezt semmilyen szerveroldali ötletesség nem javítja meg; az igazi válasz a beacon, ezért van az ütemtervben. A másodperc alatti késleltetés nincs meg, és valószínűleg nem is lesz, mert a csalásszűrő előzményeket olvas, nem egyetlen kérést. A viselhető eszközök érzékelőkészlete kisebb, mint a telefonoké, így egy telefonokra hangolt helyszínigazolási terv nem vihető át tisztán szemüvegekre. És egy állam egy teherautónyi rádiós berendezéssel ma bármely mobiltelefonos ellenőrzőt legyőzhet; minden protokoll, amely mást állít, nem őszinte veled. A miénk nem fog ilyet állítani.

A tervezési elv, amelyet érdemes hangosan kimondani. Egy ellenőrzőnek őszintének kell lennie arról, mit tud bizonyítani, és mit nem. Egy valószínűségi pontszámot abszolút igenként vagy nemként bemutatni rosszabb, mint szigorú szabályokból adódó abszolút igent vagy nemet bemutatni, mert a pontszám csúszkát teremt, és minden csúszkát több begyűjtés elfogadása felé tolnak, amikor az aktivitási célok elmaradnak. Az elkapási rétegünkben nincs csúszka. Vagy átmegy az ellenőrzéseken, vagy nem. A csalási rétegben van csúszka, és az egy embernél van, nem a kódban.

Ez az a rész a Seek alatt, amitől a horgonyzott eszközök és a helyszínnel igazolt airdropok megérik. Egy kiadó azért tesz valódi pénzt érő tokent egy koordinátára, mert akinél végül landol, az hitelesített eszközzel azon a koordinátán volt, és mert a kifizetési szűrő visszaolvassa a fiók előzményeit, mielőtt a pénz megmozdul. A teljes specifikáció a whitepaperben található. Ez a cikk annak érthető változata, ami az appon belül történik.

Röviden. A jelenlét nem koordináta. Egyetlen jel nem bizonyítja a jelenlétet. A Seek két rétegben igazolja a jelenlétet: hitelesítéssel, távolsággal és mozgásnyommal az elkapás pillanatában, és egy kilencvennapos csalásszűrővel a kifizetés pillanatában. Az egyetlen még nyitott elem, a beacon-alapú tartalék a beltéri dropokhoz, lezárja azt az utolsó koordinátás esetet, amelyet a GPS egymagában nem tud. Ez a helyszínigazolás valójában a Seekben ma, és ezért számít ez a réteg többet bármelyik látványosabb dolognál, amelyet lehetővé tesz.