- Um die langsame Bedienung der PureGym-App und den umständlichen Einlassprozess zu beheben, wurde dieser privat für Apple Wallet optimiert
- Der bisherige QR-Code ist ineffizient, weil man jedes Mal die App öffnen und die Informationen laden muss; der Eintritt dauert dabei etwa 47 Sekunden
- Durch verschiedene technische Schritte wie Reverse Engineering, den Einsatz von mitmproxy und das PassKit-Framework wurde ein automatisch aktualisierbarer Wallet-Pass umgesetzt
- Dabei wurden interne Abläufe von PureGym sichtbar, darunter Sicherheitslücken beim PIN-Code, die Struktur der API-Authentifizierung und Standortdaten der Filialen
- Am Ende entstand eine Nutzererfahrung mit 3 Sekunden bis zum Einlass; es blieb jedoch ein persönliches Experiment und ist kein offizieller Service
47 Sekunden: der Anfang des Ärgers
- An einem Werktag um 11:15 Uhr dauerte es am PureGym-Eingang 47 Sekunden, bis die App geöffnet war
- Schwaches Signal, WLAN-Verbindung, App-Start, diverse Push-Benachrichtigungen und Sonderangebote mussten erst übersprungen werden, bevor der QR-Code erschien
- Bis der eigentliche QR-Code sichtbar wurde, verging so viel Zeit, dass es vor anderen Mitgliedern unangenehm wurde
- Bei 6 Wiederholungen pro Woche summiert sich diese ineffiziente Erfahrung auf 282 Sekunden wöchentlich
- Verglichen mit berührungslosen Erlebnissen wie bei Amazon Fresh ist die Einlass-UX von PureGym deutlich rückständig
Das Rätsel um den 8 Jahre alten PIN
- Der Autor verwendet seit 8 Jahren denselben 8-stelligen PIN-Code
- Dieser PIN läuft weder ab noch wird er geändert
- Der QR-Code in der App hingegen wird jede Minute durch einen neuen Wert ersetzt
- Zwischen dem tatsächlichen Sicherheitsniveau und der realen Implementierung besteht also ein großer Widerspruch
- Das PIN-Verfahren bleibt extrem lange unverändert, während nur der QR-Code streng geschützt wird – eine Art „Security Show“
PureGym mit mitmproxy verstehen
- Zunächst wurde versucht, einen Screenshot des QR-Codes in Apple Wallet zu verwenden, was jedoch sofort scheiterte
- Der QR-Code von PureGym wird dynamisch erzeugt, läuft ungefähr nach einer Woche ab, wird in der App aber jede Minute erneuert
- Durch die Suche nach „PureGym“-Repos auf GitHub wurde die Struktur der API-Authentifizierung gefunden
- Der 8-stellige PIN für den Login wird identisch als API-Passwort verwendet
- Auch die Base64-kodierten Basis-Authentifizierungsdaten bieten nur geringe Sicherheit
- Um den App-Traffic zu analysieren, wurden Anfragen mit Proxy-Tools wie mitmproxy abgefangen
- Die JSON-Struktur des QR-Codes besteht aus part1 (feste id), part2 (Zeitstempel) und part3 (salt für die Erneuerung)
- Die API gibt sogar den Zeitpunkt der Erneuerung und die Ablauflogik vor
PassKit: das Potenzial von Apple Wallet
- Apple-Wallet-Pässe sind keine statischen Karten, sondern eher Mini-Apps mit eigener Aktualisierung, Push-Benachrichtigungen und ortsabhängigem Verhalten
- Für eine PassKit-Implementierung werden eine JSON-Spezifikation, Bildressourcen, Zertifikatssignaturen und ein Webservice für Echtzeit-Aktualisierungen benötigt
- Im Apple-Developer-Portal sind die Ausstellung einer Pass Type ID und eines WWDR-Zertifikats erforderlich
- Die Zertifikatssignierung und -verwaltung ist kompliziert, ermöglicht bei Erfolg aber eine nahtlose Erfahrung auf echten Geräten
Swift-Backend aufbauen
- Normalerweise würde dafür Node.js verwendet, hier wurde der PassKit-Webservice jedoch direkt mit Swift und Vapor umgesetzt
- Wenn ein Pass aktualisiert werden muss, erfolgt das Update automatisch per stillem Push
- Dadurch wird eine natürliche Pass-Aktualisierung erreicht, die der Nutzer gar nicht bemerkt
Automatisierung der PureGym-Standorte im ganzen Land
- Apple-Wallet-Pässe können an bestimmten Orten automatisch eingeblendet werden
- Auf der offiziellen PureGym-Website fehlen detaillierte Koordinaten, über die API ließ sich jedoch eine Liste der Koordinaten aller Filialen im Land abrufen
- Alle Standortkoordinaten wurden geparst und jedem Pass die nächstgelegene Filiale zugewiesen
- Nachteil: Befindet sich ein PureGym in einem Einkaufszentrum, erscheint der Pass gelegentlich schon beim bloßen Shopping
Apple-Watch-Integration
- Apple-Wallet-Pässe werden ohne zusätzliche Arbeit automatisch mit der Apple Watch synchronisiert
- Zweimal am Handgelenk klicken, scannen, eintreten: Das dauert nur noch 3 Sekunden
- Damit wird eine Zeitersparnis von mehr als 93 % erreicht
Die Veränderung in Zahlen
- Bisherige Einlasszeit mit der PureGym-App: 47 Sekunden
- Einlasszeit mit dem Apple-Wallet-Pass: 3 Sekunden
- Durchschnittlich gesparte Zeit pro Woche: 4,4 Minuten (3,8 Stunden pro Jahr)
- Andere Mitglieder fragten 23-mal, ob es so eine App gebe; jedes Mal wurde erklärt, dass sie inoffiziell ist
- Es gibt Anfragen, aber aus Urheberrechts- und Servicegründen ist keine Veröffentlichung geplant
Bonus: Home-Assistant-Integration
- Über den Endpoint für die Anzahl der Personen im Innenbereich der PureGym-API wird die aktuelle Auslastung des Fitnessstudios in einem IoT-Dashboard angezeigt
- So lässt sich datenbasiert entscheiden, wann man zu ruhigeren Zeiten zurückkehrt, was Effizienz und Motivation beim Training steigert
Technische Realität und Ethik
- Ausgangspunkt war reiner persönlicher Frust, doch intern bei PureGym blieb dieser Bereich über Jahre unbeachtet
- Ein außerhalb der Organisation entstandener Prototyp kann Probleme manchmal schneller lösen als die offizielle Roadmap
- Offiziell könnte dies jedoch gegen die Nutzungsbedingungen verstoßen, und PureGym könnte es jederzeit blockieren
- Es wurde niemals automatisiert oder geteilt; das Ganze blieb ein rein persönliches Experiment, wobei aus Stabilitätsgründen Prinzipien wie Caching eingehalten wurden
Nächste Schritte und Fazit
- Künftig wären Erweiterungsideen wie „Scham-Push-Benachrichtigungen“ denkbar
- Der praktische Nutzen mag klein sein, doch die Optimierung von jährlich 3,8 Stunden „unnötiger Bewegungen“ wird als befriedigend empfunden
- Würde PureGym das offiziell umsetzen, könnte es den Komfort für deutlich mehr Nutzer verbessern
- Der Fall bleibt als Beispiel für eine „inoffizielle, aber wirksame Erfahrung“ bestehen
1 Kommentare
Hacker-News-Kommentare
Als ich drei Monate in den USA war, habe ich mich bei PureGym angemeldet und einen PIN bekommen, später dann die Mitgliedschaft gekündigt. Danach hat Chrome mich darauf hingewiesen, dass mein PureGym-PIN geleakt wurde.
Zwei Jahre später war ich wieder in den USA und bekam denselben PIN erneut, was ich für ein massives Sicherheitsproblem halte.
Auch die PureGym-App und das Token waren interessant; ich habe außerdem eine Sicherheitslücke im Aktivierungssystem der Hydro-Massage-Stühle gefunden, das offenbar jeden beliebigen PIN akzeptierte.
Zum Beispiel wird ein PIN wie 87623103 in den Hash 558B4C37F6E3FF9A5E1115C66CEF0703E3F2ADEE umgewandelt, und wenn man im HaveIBeenPwned-Hashbereich sucht, sieht man, dass er tatsächlich mehrfach in Leaks aufgetaucht ist.
Auf die Frage, ob API-Zugriff tatsächlich direkt möglich ist: ja, und ich bin weder in der App noch auf der Website jemals an Rate Limits gestoßen; das System ist bei Fehlversuchen ziemlich großzügig.
Der im Beitrag gezeigte Scope ist derselbe, den auch die offizielle App und inoffizielle Clients auf GitHub verwenden.
Dass es zusätzliche Scopes gibt, ist sehr unwahrscheinlich; siehe auch PureGym PHP Wrapper und PureGym Attendance Python.
So nach dem Motto: „Wenn wir dieses Feature bauen, müssen wir danach selbst die Verantwortung dafür tragen.“
Und dann der übliche Witz: „Stimmt, dann packen wir es auf die Roadmap für 2028.“
Die eigentliche To-do-Liste und Wunschliste sind ohnehin schon lang, daher kommen neue Features kaum durch.
Das Beste, was PureGym jetzt tun könnte, wäre meiner Meinung nach, dem Entwickler dieser App ein paar tausend Pfund und eine lebenslange Gratis-Mitgliedschaft zu geben.
Ich würde gern Apple-Wallet-Pässe bauen, aber die Einrichtung des Entwicklerkontos und mögliche Zusatzkosten schrecken mich ab.
Bei niedrigem Akkustand oder im Stromsparmodus werden sie gar nicht zugestellt; das ist ausdrücklich so gebaut, um den Batterieverbrauch zu minimieren.
Wichtigere Benachrichtigungen müssen ein UI-Element anzeigen und kommen unabhängig vom Energiesparzustand an.