Vaši paketi nisu ničija stvar osim vaša.
Wi-Fi je dijeljeni medij. Kafići, hoteli, studentski domovi, LAN partiji. Svako na istoj mreži može vidjeti vaš saobraćaj. Dish je napravljen s tim na umu.
Threat model
Dish je napravljen da ostane siguran na mrežama kojima ne vjerujete u potpunosti:
- Cimer ili komšija na istoj Wi-Fi mreži ne bi trebao moći ubaciti ulaze kontrolera u vašu igru.
- Neko ko pokreće
tcpdumpna ruteru ne bi trebao vidjeti šta igrate ili kako igrate. - Uhvaćeni paket ne bi trebao biti ponovljiv sat kasnije.
- Uparivanje bi trebalo da ne uspije zatvoreno. Nikada tiho vraćanje na plaintext.
- Konfiguraciona površina ne bi trebala biti dostupna iz LAN-a. Samo šifrirana putanja kontrolera jeste.
Uparivanje
Prvi put kada povežete Dish sa Satellite-om, Satellite baca 4-cifreni PIN na vaš gaming PC. PIN živi pet minuta, zatim istječe. Ukucajte ga u Dish na vašem telefonu, laptopu ili drugom klijent uređaju.
Uparivanje se dešava preko HTTPS na portu 9443, na samopotpisanom sertifikatu koji Satellite generiše lokalno. Transport štiti od pasivnih prisluškivača; PIN štiti od bilo koga ko prevarom natjera Satellite da im vjeruje. Klijent šalje 32-byte X25519 javni ključ, Satellite izračunava dijeljenu tajnu sa crypto_scalarmult, i od tada oba kraja drže 256-bitni simetrični ključ izveden bez ikakvog slanja preko žice. Sam PIN se uništava nakon što uparivanje završi.
Dijeljeni ključ se pohranjuje lokalno na oba kraja i koristi se za autentikaciju svakog sljedećeg ponovnog povezivanja. Na Satellite strani, živi u per-user konfiguracijskom direktoriju vaše platforme, mode-protected za vaš nalog (Windows DPAPI na V1); na Android klijent strani, živi u privatnim SharedPreferences aplikacije, sandboxed od strane Androida na Dish aplikaciju i isključen iz cloud backup-a i prenosa uređaja. Nijedan ključ nikada ne napušta nijedan uređaj.
Per-paket AEAD
Svaki paket kontrolera (ulaz kontrolera, otkucaj, dodavanje kontrolera, vibracije, pokret, baterija, touchpad, lightbar) zapečaćen je sa ChaCha20-Poly1305 (IETF), istim AEAD koji TLS 1.3, WireGuard i SSH koriste. ChaCha20 je brz i konstantnog vremena na svakom CPU-u koji nas zanima, uključujući Android ARMv8 i Apple Silicon.
Wire format je mali i krut: 4-byte session token, 4-byte brojač, šifrovani tekst, 16-byte Poly1305 autentikacioni tag. Token služi i kao additional authenticated data (AAD), tako da zamjena u replay-ovanom paketu uzrokuje da verifikacija ne uspije. Nonce je brojač zero-paddovan na 12 byte-a, bez ponovne upotrebe nonce-a bez rolanja sesije.
Zaštita od replay napada
Satellite pohranjuje najviši brojač koji je prihvatio na svakoj vezi. Bilo koji paket čiji je brojač manji ili jednak tom high-water mark-u odbacuje se prije nego što ikada dođe do gamepad backend-a. Uhvaćeni šifrovani tekst sa jučerašnje sesije, ili čak prije jedne sekunde, ne može se ponovo pustiti da pokrene pritisak dugmeta.
Šta ne morate brinuti
- Prisluškivanje. Niko na LAN-u ne uči koja ste dugmad pritisnuli.
- Spoofing. Bez session ključa, nijedan napadač ne može ubaciti pritisak „B dugmeta“, čak i ako zna vašu IP adresu.
- Replay. Jučerašnji „pucaj“ paket neće pucati danas. Neće ni jučerašnji heartbeat ili pairing paket.
- Downgrade. Bez plaintext fallback-a. Ako kripto verifikacija ne uspije, paket tiho umire.
- Daljinsko mijenjanje konfiguracije. Admin API (
localhost:9877) veže se samo na127.0.0.1. LAN-okrenuti HTTPS API na 9443 izlaže samo pair i session endpointe, sve zaštićeno ID-jem uparenog uređaja.
Nula analitike, nula reklama
Dish i Satellite prikupljaju nikakve podatke o korištenju, nikakve identifikatore, nikakvu analitiku, nikakve advertising ID-jeve. Jedini odlazni tok koji TinkerNorth dodirne na Dish-u za Android je opcionalni Firebase Crashlytics za crash i ANR izvještaje: stack trace, model uređaja, install UUID, i to je to. Nikada ulaz kontrolera, nikada Satellite IP-ovi, nikada Wi-Fi SSID-ovi. Postoji opt-out u jedan dodir u Postavkama aplikacije pod Dijagnostika, poštovan prije nego što bilo koji crash može biti uploadovan pri sljedećem pokretanju. Satellite sam dolazi bez ikakvog crash-reporting SDK-a. Cijeli obim je na politici privatnosti Dish-a za Android.
Ne pokrećemo sistem naloga. Nema clouda. Nema šta da procuri jer ničega nema na serveru.
Lanac snabdijevanja koji se može auditovati
Svaka tagovana verzija isporučuje:
- SHA-256 checksum datoteku za svaki artefakt, potpisanu keyless preko
cosigni OIDC identiteta GitHub Actions release workflow-a. - SLSA Level 3 provenance atestaciju koja dokazuje da je artefakt napravljen iz tagovanog commit-a u CI-ju.
- Software bill of materials u oba SPDX i CycloneDX formata, tako da možete revidirati svaku tranzitivnu zavisnost.
Verify-blob recept živi u SECURITY.md u Satellite repu. Ako preuzimanje ne odgovara objavljenom checksumu, nemojte ga instalirati.
Otvoreni kôd i auditibilan
Svaka linija crypto-touching koda živi u javnom repu. Satellite koristi libsodium; Dish za Android koristi libsodium-stable izgrađen preko NDK-a i Android standardni Conscrypt za HTTPS pairing transport. Bez improvizirane kriptografije. Bez „napisali smo svoj ChaCha“.
Distribuirano pod GNU Lesser General Public License v3.0 or later. Pronašli ste nešto čudno? SECURITY.md u Satellite repu ima našu politiku obavještavanja.