Open7

CS2のPanorama UIにXSS脆弱性が見つかったので深堀してみる

FlowingSPDGFlowingSPDG

まずは「Panorama UIってなんじゃ?」という説明から。
2018年のCS:GOベータ版アップデートで、古いUIを撤廃してPanoramaなる新規UIに置き換えるアップデートが発表された。

CSGOの長い歴史を持ったUIを完全に革新し、モダンで新しいUIを導入する。
しかも、内部的にはHTML5/CSS/JSを使っていて、Web開発者にも優しい。
https://developer.valvesoftware.com/wiki/Panorama
https://developer.valvesoftware.com/wiki/Dota_2_Workshop_Tools/Panorama

FlowingSPDGFlowingSPDG

実際の脆弱性のわかりやすい説明は、以下の動画を見れば早いと思う。
https://twitter.com/onscreenlol/status/1734184272825663840

HTMLタグを使った際に実際にリクエストが送信され、IPの特定が可能になったり、投票画面にGIF画像を表示することが出来る、という脆弱性だ。

この脆弱性のレベルに関して、「実際にどの程度の権限が付与されているか」が争点になると考えている。
例えばこの動画の例ではimgタグからIPを特定したが、もしscriptタグのロードが可能になっていたら。
任意のスクリプトが実行可能になっていたら、Steamへのアクセス権限すら持っていたら。

気になったので、実際に修正前のCS2クライアントを手元に用意してテストを行ってみようと思う。

FlowingSPDGFlowingSPDG

余談だが、Panoramaの実装当初、僕たちはGOTV+という、HTTPを経由した観戦システムを利用して、ベータ版CS:GOクライアントで現行版サーバー上のマッチを観戦するという力業を行い、当時はベータ版でしか利用できなかったPanoramaを使って大会配信をしたことがある。
https://github.com/FlowingSPDG/gotv-plus-go

内部的にはdem(ゲームのリプレイ)を見ているのと同じなので、古いバージョンのゲームで記録されたdemファイルでも互換性があれば再生が可能、という話。
同時に、dem経由なのでVAC認証もスルーしており、HLAEの導入を可能としている。
(ただ複数クライアントで同期ズレ起きたり巻き戻ったりイベントのバグが起きたり結構しんどかった)
https://www.twitch.tv/videos/327930140

今振り返ると、確かにそうだけどよく思いついたな、と感心する。

FlowingSPDGFlowingSPDG

本題に戻って、PanoramaUIのデータ確認。
まずは、実際のJavaScriptの実行が可能かどうか判断したい。
いくつかステップを分けて検証する。

  1. 実際のゲームファイルを確認する。必要であれば、CS:GO時代のデータも解凍しチェックする。
  2. Panorama APIのドキュメントを読んでみる。
  3. 実際にSteam名を変更し、XSSが機能するか確認する。
  4. 使える関数やAPIを細部まで確認し、「ここまで実現可能」「これから先は不可能」の境界を明確にする。

CS:GO時代の知識だが、Panorama自体の中身を見たり書き換える方法は確かあって、vpkファイルを解凍したらcsgo/resource/ui あたりにxmlファイルとかが吐き出されていたような気がする。

FlowingSPDGFlowingSPDG

知らなかったけど、XSSを正しく動作させるために、ゲーム内で「投票」を行う必要があるらしい。
あと、二次被害として配信者の画面上にR18のエログロ絵を張られたり、ハーケンクロイツを表示させられたりしてたらしい。人の心無さすぎるだろ。

https://twitter.com/csmoneytrade/status/1734203656856342637

FlowingSPDGFlowingSPDG

なんかワークショップのマップからもスクリプト経由でPanorama APIにアクセスしてアイテムの売買が可能、みたいな話も出てきた。
https://twitter.com/Ozzny_CS2/status/1734293629470916708

多分だけど、動画中のCS2クライアントはデバッグ用途でWorkshop Toolsから起動している気がする。
コンソールが別ウィンドウで出現してるのはそういう事だと思う(多分)。