スクリーンショットが通用しないバーコード型電子チケットの仕組みをエンジニアが分析
コンサートやライブのチケットはかつて紙に印刷されたものを使っていましたが、近年は不正行為や転売に対策するため、電子化が進んでいます。アメリカのチケット販売サービスであるTicketMasterは、「SafeTix」と呼ばれるサービスで15秒ごとに更新されるバーコード型電子チケットを発行しており、チケットの盗難やコピーを防止できるとしています。エンジニアのconduition氏が、このSafeTixをリバースエンジニアリングして検証しました。
Reverse Engineering TicketMaster's Rotating Barcodes (SafeTix)
https://conduition.io/coding/ticketmaster/
conduition氏は、紙に印刷されるアナログチケットについて、「オフラインでの使用可能性」「スマートフォンがなくても使えること」「友人と簡単に共有できること」を利点として挙げています。
conduition氏は2023年にTicketMasterからSafeTixを使った電子チケットを購入したとのこと。しかし、当日は会場が非常に混雑しており、携帯電話の通信やWi-Fiが過負荷状態になってネットワークがパンクしていたため、チケットのバーコードを取得できず、入場に非常に苦労したとのこと。
こうしたトラブルが多いにもかかわらず、TicketMasterがSafeTixを推進しているのは、チケットの偽造や転売を防ぐため。SafeTixは15秒ごとにPDF417バーコードを自動更新するため、バーコードをスクリーンショットして印刷したとしても、すぐに効力を失ってしまうというわけです。
しかし、TicketMasterの主張にある「TicketMaster外でチケットを転送できない」という点はオフラインで保存できないという点で問題がある、とconduition氏は指摘。そこで、conduition氏はリバースエンジニアリングを行い、SafeTixの技術的分析を行いました。
conduition氏は、AndroidスマートフォンのChromeブラウザをデスクトップPCのChromeデベロッパーツールに接続しました。そして、TicketMasterのバーコードビューアをロードする際のネットワークリクエストを記録したところ、/api/render-ticket/secure-barcodeというAPIエンドポイントへのPOSTリクエストのレスポンスデータに、デバイスID、チケット情報、トークンなどの重要な情報が含まれていたことが判明。
さらにconduition氏は、TicketMasterのウェブサイトにあるJavaScriptのソースコードから、バーコードデータを生成する関数を特定しました。
SafeTixのバーコードはUTF-8テキストをエンコードしており、その内容はBase64エンコードされた48バイトのデータ、2つの6桁の数字、そしてUNIXタイムスタンプで構成されています。バーコードは15秒ごとに更新されますが、その際にBase64データは変化せず、6桁の数字とタイムスタンプのみが変化します。
conduition氏は、2つの6桁の数字が共有秘密鍵とタイムスタンプから生成されるTime-based One-Time Password(TOTP)であると推測。さらにBase64データが、チケット保有者とチケットを識別するためのランダムな「Bearerトークン」であると考えました。
conduition氏によれば、まずBearerトークンを使ってチケットのメタデータが検索され、次にデータベースに保存された「eventKey」と「customerKey」という2つの秘密鍵でTOTPが検証されるとのこと。また、TOTPは業界標準のSHA-1を用いて15秒間隔で生成されているとconduition氏は考えました。
これらの推測を検証するため、conduition氏はoathtoolを使用して抽出した共有秘密鍵とタイムスタンプからTOTPを生成し、実際のバーコードデータと一致することを確認しました。さらに、Base64データはウェブアプリを更新するたびに変化するものの、長時間ページを開いたままにすると変化しないことが分かりました。一方、eventKeyとcustomerKeyは変化せず、それぞれイベントとチケット保有者に固有であると推測されます。つまり、Base64データとeventKeyとcustomerKeyさえあれば、有効なバーコードが生成できるというわけです。
これらの分析により、TicketMasterのウェブアプリがブラウザのコンソールに出力するログからトークンを抽出できることが分かりました。さらに、ドキュメントでは「イベント開始20時間前に更新する必要がある」と記されていたものの、生成されたトークンの有効期限が明確ではなく、不確実であるとconduition氏は指摘しています。
conduition氏は、TicketMasterがSafeTixを推進するのは不正や転売の防止目的ではなく、「TicketMaster外でのチケット転売を困難にし、自社の高マージン転売マーケットプレイスの利用を促進するため」「ユーザーに独自アプリのインストールを強制し、より多くのユーザーデータを収集するため」だと強く批判しています。特に、技術的に不利な立場にある人々を排除するようなシステムを設計したことに対して、開発者の倫理的責任を問いました。
なお、conduition氏はTicketMasterのSafeTixと互換性のあるバーコードをレンダリングする「TicketGimp」のソースコードをGitHubで公開しています。
GitHub - conduition/ticketgimp: Create TicketMaster-compatible rotating barcodes from encoded ticket secrets.
https://github.com/conduition/ticketgimp
◆フォーラム開設中
本記事に関連するフォーラムをGIGAZINE公式Discordサーバーに設置しました。誰でも自由に書き込めるので、どしどしコメントしてください!Discordアカウントを持っていない場合は、アカウント作成手順解説記事を参考にアカウントを作成してみてください!
• Discord | "電子チケットのトラブルに遭遇したことある?" | GIGAZINE(ギガジン)
https://discord.com/channels/1037961069903216680/1260524742327275571
07/10 12:42
GIGAZINE