ボードゲーム「Hitster」は、QRコードが記載された物理的なカードをプレイヤーに提供することで機能します。Hitsterモバイルアプリでこれらのコードをスキャンすると、SpotifyやApple Musicのサブスクリプションを通じて特定の楽曲の再生がトリガーされます。このアプリは正常に機能するためにアクティブなサブスクリプションを必要とするため、ある研究者は、カードIDと楽曲の間のマッピングがソフトウェア内でどのように保存され保護されているかを調査することに乗り出しました。

物理的なカード上のQRコードのアップ
Hitsterモバイルアプリは、物理的なカード上のQRコードをスキャンして音楽の再生をトリガーします。wuemeli.com

研究者は、アプリがスキャンされたQRコードを特定の楽曲にどのようにマッピングしているかを調査しました。

Hitsterボードゲームの物理的なカード
物理的なカードは、Hitsterゲームの楽曲選択のための主要なインターフェースとして機能します。wuemeli.com

このゲームは、QRコードが含まれた物理的なカードをプレイヤーに提供することで機能します。

`jadx`を使用してAndroid APKをデコンパイルした研究者は、アプリのリソース内に`gameset_database_4.json`という名前を含むいくつかのJSONファイルを特定しました。このファイルは、Base64エンコーディングの後にAES(Advanced Encryption Standard)暗号化を用いて暗号化されているようでした。Javaソースコード、特に`k43.java`とラベル付けされたファイルを分析することで、研究者は復号ロジックをマッピングしました。このプロセスにより、アプリがAES-GCMモードを使用しており、ハードコードされた文字列と残りのデータ長のハッシュを組み合わせて秘密鍵を導出していることが明らかになりました。開発者コミュニティの他のメンバーと協力することで、研究者は最終的にコードベース内で見つかった2つのバイト配列をXOR演算することでこの隠れた文字列を復元し、ローカルでデータベースを復号するためのカスタムRustスクリプトを作成することができました。

この取り組みにより、複数の地域にわたるカードIDと楽曲の約31,000件のマッピングを含むファイルが得られました。しかし、調査の最終段階でより単純な経路が判明しました。ローカルアプリケーションは複雑な暗号化によってこれらのアセットを隠そうとしていましたが、同じ情報がセキュリティ対策なしで公開サーバー上でアクセス可能であったのです。特定のアセットURL(`hitster.jumboplay.com/hitster-assets/`)にアクセスすることで、研究者は暗号化されていない状態の`gameset_database.json`ファイル全体を発見しました。これは、クライアント側の難読化とサーバー側の露出の間に共通して見られる不一致を浮き彫りにしており、開発者がアプリのバイナリ内でのデータ隠蔽に集中する一方で、Webインフラ上では公開したままにしている可能性があることを示しています。