Steam Browser Protocolの脆弱性について
なんか変なデマが日本で蔓延する前に真実を調べとこうということで調べてみた。一番最初はHacker Newsあたりかな。 簡単に言うとSteamっていうゲームプラットフォームがインストールされた環境では、steam://っていうURLリンクでサーバーにjoinしたりできるんだけど、そこに脆弱性があるんじゃないかっていう話。
情報元: http://revuln.com/files/ReVuln_Steam_Browser_Protocol_Insecurity.pdf
ブラウザでクリックするだけで任意のサーバーにjoinできる機能とかかなり便利だからさ、そういうのが極端に無効化される風潮になっちゃうのもあれなので、ちゃんと調べていきたい。
いろいろ複合的な要因はあるんだけど、とりあえず
- SourceEngineゲーム
- UnrealEngineゲーム
- ARP Reloaded
- MicroVolts
がインストールされてるSteam環境で出来ると主張している。動作原理としてはいくつかって、それらを今から順番にこのPDFを読んで俺が理解した感じで説明していく。
1. steam://retailinstallというのを指定する方法
retailinstallはSteam Browser Protocolで文書化されていない機能で、指定したゲームを再インストールするための機能らしい。これに任意のパスを指定するとそこにあるsplash.tgaファイルとsku.sis(インストールファイル)が読み込まれるらしい。これは再インストール画面でゲームのロゴ画像を表示するときのためにsplash.tgaを使ってる、みたいな。
で、Steamにこのtgaファイル読み込み処理に問題があって、LoadTGA関数にInteger Overflow Conditionの脆弱性があってSteamのプロセスとして任意のコードが実行できてしまうという問題。これ単体だとローカルのtgaファイルを攻撃者が生成出来ないためあんま意味は無いはず、なんだけどもWindows Network Folderを指定することでリモートのファイルを指定できると書いてある。
One of its parameter is path that is used to specify this local directory but obvi- ously this directory can be a Windows network folder available on a remote host.
2. steam://run, rungameid, runsafe, rungameの脆弱性
steam://run/id/language/url_encoded_parameters
でSteam Browser上で任意のjavascriptが実行できるとのこと
3. Source Engine特有の脆弱性
起動時のオプションで以下を指定できるのだけどこれらを組みわせて任意のパスに実行ファイル(batファイルなど)を生成することが出来る。で、steam://でこれらを指定できる、みたいな。
- con_logfile path
- で任意のパスにSourceEngineのコンソールログを出力可能。
- echo string
- コンソールに指定の文字を出力可能。
- quit
- SourceEngineを終了させる。
これを組み合わせて実行ファイルを組み立てる。
hijackコマンドで既に起動済みのゲームに対してコマンドを送信できる。128charsの制限有り
4. Unreal Engineの脆弱性
興味ないので割愛
5. ARP ReloadedとMicroVoltsの脆弱性
興味ないので割愛
この問題に対しての可能な対処
A. ユーザー側
steam:// URLのハンドラを無効化するか、ブラウザでsteam://の実行を求められた時に非許可にする
B. Steam側
コマンドライン引数をthird party softwareに送ったりとか、untrusted sourcesからの文書化されてないcommandを実行するのをやめる。
C. ゲーム側
この問題の主体はsteam browser protocolであるため、ゲームの開発者側が出来る対策はあまりないが、以下の関連した問題をfixしたほうがいいよ。
- ネットワーク関連のコードではなくとも、安全なプログラミング技法を採用
- auto patchingをするときに、証明書の確認をするようにすること
FAQ
以下FAQを翻訳
Q. これはWindowsのみの問題ですか?
A. 違います。あなたのOSでSteamをインストールして実行出来るのであればあなたは脆弱です
Q. これはブラウザのみの問題ですか?
A. 違います。URLのクリックをきっかけとしてなんでも実行をすることができちゃうという問題です。
Q. ブラウザは常にwarning/popupをユーザーに表示しますか?
A. いいえ。ユーザーはsteam://リンクをクリックしたときの警告をブラウザの設定で沈静化できます。これは多くのゲーマー達が、Steam Protocolを使ってゲームサーバーに接続するときに使われてます。
Q. この問題はあなたの提示した4つのゲームのみに関連した問題ですか?
A. いいえ。ゲームはたいてい同じエンジンが使われます。(たとえばSourcEngine, UnrealEngine, あるいはなにか) なので、エンジンに起因したバグは幾つかのゲームに影響を与えます。
Q. あなたはSteamに存在するすべてのゲームでテストしましたか?
A. いいえ。私達が約束できるのはSteam Browser Protocolの問題の詳細についてです。我々の例では2つの異なるエンジン(SourceEngine, UnrealEngine)と、2津のよく知られているMMOゲームをカバーした。
Q. retailinstall問題はリモートから悪用可能ですか?
A. Yes
Q. ユーザーにsteam://リンクをクリックさせなければダメージを与えることができない?
A. No. In fact all the links used in our PoC video point to normal HTML
pages.
Q. ユーザーはブラウザのステータスバーに表示されているreal linkを常に見ることが出来る?
A. いいえ
Q. Steam Browserを安全に利用しているユーザーはいますか?
A. いいえ。Youtube Bouncing Scenarioのデモンストレーションを見て下さい。
Q. ビデオにある幾つかのバグが出来ないんだけど、なぜ?
なぜならそれは私達のこのpublic paperのあとに、Valveがcon_logfileコマンドを制限したからと、APBはleagcy commandからこれらを消した。詳細: http://store.steampowered.com/news/9120/