株式会社Ninjastars 技術研究部

「もっと楽しく安全なゲームの世界を創る」

SECCON 2018 Akihabara 初心者向けゲームセキュリティワークショップ 参加記録

株式会社Ninjastarsセキュリティエンジニアの一瀬です。
少し前の話になりますが、今日はSECCON 2018 Akihabaraで開催された「初心者向けゲームセキュリティワークショップ」について書かせていただきます。
こういった体験型のゲームセキュリティ関連のワークショップは非常に少なく、私自身も大変勉強になりましたのでこのブログで共有させていただければと思います。

概要
対象アプリケーションはUnityのTutorialのゲームである「Survival Shooter」を機能追加したものとなります。
ゲーム開始時にユーザー名を入力する部分と、ゲームオーバー時にオンラインでのScoreランキングを表示する処理が追加されています。

・ビルドタイプ
Monoビルド。
ゲームのメイン処理がC#のAssembly-CSharp.dllに記述されるタイプのビルドタイプです。
場所:app\assets\bin\Data\Managed\Assembly-CSharp.dll

・Assembly-CSharp.dllについて
暗号化無し。

・スコア、HPのゲーム内数値
暗号化無し。
ゲーム上の数値がそのままにメモリ上に保存されています。

・ローカルファイル
暗号化無し。

・通信方式
http通信。
暗号化無し。

上記のように特にリバースエンジニアリング対策を施さず、初心者向けの名の通り説明のために作成されたアプリケーションとなっているようです。

f:id:Ninjastars:20190206224431p:plain
対象アプリケーション。

このアプリケーションに対して、想定されうるような幾つかの攻撃手法を紹介させていただきます。
※実際のワークショップの内容で説明されたものとは一部異なります。

①メモリ改竄
Androidでのメモリ改竄の原理はこのブログでの記事である以下をお読みいただけると幸いです。
自作ゲーム:チートチャレンジ - 株式会社Ninjastars 技術研究部
自作ゲーム:チートチャレンジ2 - 株式会社Ninjastars 技術研究部
Android 他のプロセスのメモリを読み書きする - 株式会社Ninjastars 技術研究部

まずptraceシステムコールで対象プロセスにアタッチすることで、対象プロセスメモリ空間をread/write可能となります。
攻撃者は次に「フィルタリング」という作業を行うことで改竄すべきメモリアドレスを特定します。

①現在の数値でプロセスメモリのアドレス全てから値を検索する
②ゲームの状態を遷移させ、変化した値で前回該当したアドレスを再度検索する
③該当アドレスが1つ又はごく少数に絞り込まれるまで②を繰り返す
④該当アドレスが絞り込まれたところで、メモリの値を書き換える。

f:id:Ninjastars:20190207004426p:plain
Scoreを大幅上昇。無敵化。

このメモリ改竄攻撃の重要な点として、ptraceによる対象プロセスに対するアタッチが必要であるという点が挙げられます。
ptraceによる他プロセスへのアタッチはroot権限が必要なため、端末がroot化されていないかどうかチェックすることは重要な意味を持ちます。

上記例外としてAndroidエミュレータ上でアプリケーションが起動可能な場合、エミュレータのプロセスメモリ空間を検索・改竄することでも内部で起動しているアプリケーションのメモリを書き換えることは可能です。
そもそもメモリ改竄をさせないという観点からは、エミュレータ上での起動も同時に阻止する必要があるということになります。

②Assembly-CSharp.dll改変

GitHub - 0xd4d/dnSpy: .NET debugger and assembly editor

f:id:Ninjastars:20190207010917p:plain
元のソースコードをdnspyで復元。

dnspyではソースコードを復元するだけでなく、復元したコードを改変後再コンパイルも可能です。
特にMonoビルドの場合元のソースコードの難読化、Assembly-CSharp.dllの暗号化等の対策を施さないと非常に容易にチート行為が行われてしまう危険性があります。

セキュリティエンジニアからみたUnityのこと - LINE ENGINEERING

Mono(更にIL2CPP等)についてはLINE株式会社の愛甲健二さんが書いた上記記事に詳細に記載されているため、是非ご一読していただければと思います。

③通信解析・改変

mitmproxy - an interactive HTTPS proxy

f:id:Ninjastars:20190207013641p:plain
mitmproxyによる通信キャプチャ。
mitmproxyではスクリプトによりクライアントからのリクエスト、サーバからのレスポンスを任意に改変可能です。
このゲームではプレイヤーから敵への一回当たりの攻撃のダメージがサーバから送信される仕様のため、例えば"attack " : 10 => "attack" : 999999とすれば全ての敵を一撃で倒すことが可能となります。

また実際にはプレイしていなくてもサーバに対して偽のidとスコアのrequestを送信することで、大量にランキング登録させるといった行為も可能です。

最後に
今回のようなワークショップを開催されたSECCON運営の方々には心から敬意を表するとともに、当社社員一同こういった機会で得た技術を正しいことに使い世の中の人々のために貢献してきたいと思います。

注意事項
本レポートに記載されている内容を許可されていないソフトウェアで行うと、場合によっては犯罪行為となる可能性があります。そのため、記事の内容を試す際には許可されたソフトウェアに対してのみ実施するようにしてください。

本レポートについて
お問い合せ
E-mail:ichise@ninjastars-net.com

株式会社Ninjastarsエンジニア
一瀬健二郎