Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
とあるセキュリティ技術者の奮闘録/On_client-side_game_security_t...
Search
Doraneko
August 27, 2022
Technology
0
1.1k
とあるセキュリティ技術者の奮闘録/On_client-side_game_security_techniques
Shibuya.gamesec #2で話した内容。
Doraneko
August 27, 2022
Tweet
Share
More Decks by Doraneko
See All by Doraneko
ゲームセキュリティからみたAndroid解析/android-analysis-from-a-game-security-perspective
doraneko
0
2.1k
Other Decks in Technology
See All in Technology
12 Days of OpenAIから読み解く、生成AI 2025年のトレンド
shunsukeono_am
0
410
サービスでLLMを採用したばっかりに振り回され続けたこの一年のあれやこれや
segavvy
2
560
型情報を用いたLintでコード品質を向上させる
sansantech
PRO
2
150
LINE Developersプロダクト(LIFF/LINE Login)におけるフロントエンド開発
lycorptech_jp
PRO
0
150
Oracle Cloud Infrastructure:2024年12月度サービス・アップデート
oracle4engineer
PRO
1
300
Google Cloud で始める Cloud Run 〜AWSとの比較と実例デモで解説〜
risatube
PRO
0
120
レンジャーシステムズ | 会社紹介(採用ピッチ)
rssytems
0
300
Unlearn Product Development - Unleashed Edition
lemiorhan
PRO
2
120
プロダクト開発を加速させるためのQA文化の築き方 / How to build QA culture to accelerate product development
mii3king
1
290
Working as a Server-side Engineer at LY Corporation
lycorp_recruit_jp
0
400
AWS re:Invent 2024 ふりかえり勉強会
yhana
0
530
TSKaigi 2024 の登壇から広がったコミュニティ活動について
tsukuha
0
170
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
88
5.7k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
Visualization
eitanlees
146
15k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
A better future with KSS
kneath
238
17k
Music & Morning Musume
bryan
46
6.2k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Navigating Team Friction
lara
183
15k
RailsConf 2023
tenderlove
29
940
Automating Front-end Workflow
addyosmani
1366
200k
Thoughts on Productivity
jonyablonski
68
4.4k
Transcript
shibuya.gamesec#2 Kenjiro Ichise
• 自己紹介 • とあるセキュリティ技術者の奮闘禄 • Reversing経歴 • ゲームセキュリティ診断について • Unity
il2cppの分析と対策 • 世にも不思議なAndroid端末 • スピードハックの原理と対策 • 動的解析ツールFrida • まとめ
• 名前:一瀬 健二郎 • Twitter:猫@DoranekoSystems • 職業:セキュリティ系のお仕事 • ゲームセキュリティに関する主な業務経験: •
ソーシャルゲーム、モバイルアプリの脆弱性診断(4年程) • 不正対策のためのセキュリティ製品の開発(Android/iOS/Win) • 横浜在住 • 趣味:登山、音楽 • 登壇歴:DroidKaigi 2020
Reversing経歴 1. 初めて起動した解析ツールは『Cheat Engine』。アングラな雰囲気のかなり怪しいソフト ウェアだと感じたのを今でも覚えている。 2. 『アセンブラ入門』というサイトを参考に、x86アセンブリ言語を学ぶ。 3. Win32APIの存在を知り、自分でプロセスメモり検索ツールを作るようになる。 4.
Android解析を学び、ARMアセンブリについて理解を深める。 5. 腕試しに参加した『SECCON 2017 x CEDEC CHALLENGE』で2位という結果に。 肝心な通信解析が出来ず、優勝したHarekaze様との力の差を感じる。 6. 大会をきっかけに知り合った方を通してCTFチームに加入したり勉強会に参加するように なる。情報セキュリティ企業に入社して診断員として活躍する。 7. 現在は上記とは別の企業でセキュリティ関連のお仕事をしています。
• 私自身の経験の中では、主にブラックボックス診断で本番環境とほぼ同一の状態で診断を 行ってきました。基本的に商用チート対策製品によって保護がかかっているアプリについて も、そのまま診断するというような形です。 • 診断タイトル数的には数十タイトルで日本国外のものも診断経験があります。 • 診断対象プラットフォームはWindows、Android、iOSと一通り経験しました。 • 良く使う解析ツール
• Frida、Ghidra、LLDB、PacketProxy
Unity il2cppの分析と対策① UnityはMonoビルドとil2cppビルドの2つのビルド方式がある。最近のアプリではil2cppビル ドが良く用いられる。 il2cppビルド:ILからcppに変換してビルド。C#で記述したゲームのロジックはネイティブバイ ナリとして出力され、シンボル情報がglobal-metadata.datというファイルに出力される。 Unityの人気も相まってil2cppの解析ツールは活発に開発されており、ツールを使えば比較的簡 単に解析が可能になってしまう。il2cppの解析ツールは静的解析タイプと動的解析タイプの2つ がある。 1.
静的解析タイプ:Il2CppDumper • 実行バイナリとglobal-metadata.datのファイルをパースしてシンボル取得。 2. 動的解析タイプ: • il2cppのAPIを動的に呼び出し、情報を取得。
Unity il2cppの分析と対策② 静的解析タイプの対策例: 左: Il2CppDumperでのdump結果 右: 文字列情報暗号化
Unity il2cppの分析と対策③ il2cppの動的解析タイプの原理 1. 何らかの形で処理を対象プロセスにインジェクションする。 2. dlsym関数等を用いてネイティブバイナリ内のil2cppのAPIを動的に呼び出す。 • アセンブリ列挙 •
il2cpp_domain_get_assemblies • アセンブリからイメージ取得 • Il2cpp_assembly_get_image • イメージからクラス取得 • il2cpp_image_get_class • クラスからメソッド取得 • il2cpp_class_get_methods
Unity il2cppの分析と対策④ il2cppAPIの動的解析タイプでどのような情報が取得できるか確認してみましょう。 自作ツール(非公開): Frida-Il2CppDataCollector ※既存ツールのAndroid/iOSヘの移植
Unity il2cppの分析と対策⑤ 静的解析タイプの対策例: libil2cppのソースコードを書き換えることで対策が可能。(要Unityライセンス) ※iOS:ソースコード書き換えでは対策できないが、別の方法で可能。 1. global-metadata.dat暗号化 2. 文字列情報等の暗号化 3.
il2cppの動作ロジック修正(オリジナルから可能な限り遠ざける) 動的解析タイプの対策例: =>対策が難しく、いたちごっこになりがち。 1. soインジェクション、dylibインジェクションの阻止 2. Riru、Zygisk、Frida等の解析系ツールの検知・阻止 総合的な解析対策が重要!!
脆弱性診断の中で商用チート対策製品の検知がどうしても回避できない場面がありました。方 法を幾つか考えたところ、AndroidはオープンソースなのでOS自体書き換えれば良いのではと 思いつきます。 AndroidKernelのビルドについての情報は少なく、手持ちのAndroid端末用の情報を何とか調 べ上げました。Kernelのソースコードを睨めっこしながら検知を回避できる箇所を探してX日。 ついにチート対策製品の検知を回避することに成功しました。(もちろん通常の診断業務を並行 しながらの調査) そこからはワンコマンドでroot権限を取得出来る端末など、LinuxのRootkit等を参考に作成し て調査を行っています。
「kill 99999」とコマンドを入力する とroot権限を強制的に取得できる端末。
• 通常MagiskやSuperSU等を利用して取得するRoot権限も、Kernelを改変することで容易に取 得出来る。またそもそもRoot権限不要で他のプロセスをデバッグ可能にすることも出来る。 • ファイルが存在するか等の〇〇検知系は、最終的にシステムコールに帰着される。 Kernelを改変すれば、ほぼ全ての〇〇検知系は回避することが出来る。 =>攻撃者が物凄く頑張れば、多くの解析対策は無効化される可能性がある。 あくまで物凄く頑張ればという前提で、ほとんどのチーターは物凄く頑張らない。 実際は楽してチートしたいだけの「カジュアルチーター」が大半。 AndroidKernelを改変しなければ検知を回避できない時点で、対策者側の勝利。
端末:iPhone アプリ:時計 自作ツール: SpeedHack-Tool スピードハックとは何か。 実際に体験してみましょう!
時計アプリに何が起こったのか!? SpeedHack-Toolでは時間関連の以下の二つの関数を偽の関数に置き換えています。 1. clock_gettime 2. gettimeofday システム・アプリに対して「経過時間を誤認させる」ことでスピードハックを実現している。 スピードハック計算式 start_time =
スピードハック開始時間 current_time = 現在時間 return_time = 戻り値 speed = 加速・減速率 return_time = start_time + (( curren_time – start_time ) * speed )
元の関数を偽の関数に置き換えるってどうやるの? フッキングという手法で行っています。 一般的にフッキングで関数を置き換える方法は二種類あります。 1. 関数の先頭処理をジャンプ命令に置き換える方法 • この手法は一般的にインラインフック(InlineHook)と呼ばれる。 各レジスタの値が破壊されないように複雑な手法が必要。 2. アドレステーブルにある関数のアドレスを書き換える方法
• この手法は一般的にpltHook(Windowsの場合IATHook)と呼ばれる。 AndroidのGameGuardianというアプリはこの手法を用いてフッキングしている。 フッキングを行うために、多くの解析ツールは前段階として対象プロセスに共有ライブラリを インジェクションします。元の関数をライブラリ内にある偽の関数に置き換えるためです。
スピードハックの対策方法について 多くの解析ツールは全ての時間関連の関数をフッキングする訳ではないという点は重要です。 例えばSpeedHack-Toolによる改変を検知するには、 1. gettimeofday関数による経過時間を取得する 2. sleep関数などを利用して経過時間を取得する 1と2を比較し一定以上の差異が見られた場合アプリを終了するなどの処理を組み込めば検知す ることが可能です。 また前述のように多くの解析ツールはスピードハックの前段階として共有ライブラリをイン
ジェクションします。ptraceシステムコールによるアンチデバッグを用いることでインジェク ションを防止することが可能です。
ゲームセキュリティに限らず、特にモバイルアプリの解析において現在は神器といっても過言 ではない解析ツールだと思っています。私自身は脆弱性診断において最も頻繁に使用するツー ルです。 例えば通信解析というとローカルプロキシツール等で行うイメージが強いですが、商用ゲーム の多くは通信の暗号化や固有のシグネチャが付与されておりそのままでは解析・改変すること が出来ません。 Fridaによって通信の暗号化前/復号後をキャプチャすることで、AESや独自暗号等の強固な暗 号方式を採用していても解析が可能になります。勿論これはFridaでないと出来ないという訳で はないですが、Javascriptによる記述の容易さやPython等との連携のしやすさ、ツール自体の 安定性なども相まって非常に有用なツールであると思います。
Frida検知・対策はすべきかどうか Fridaは診断員目線では非常に便利な反面、対策側としては非常に脅威な解析ツールであると思 います。 簡易的な実装だとFrida検知自体もまたFridaによって回避される危険性が高いです。またOSS 等で検知を難しくしたVersionのFridaも公開されています。 チート対策全般について、所謂『カジュアルチーター』によるチートを防止出来るか否かは重 要だと思います。診断員目線でも最終的には回避できてもFrida検知その他があると解析は煩雑 になるため、やりづらくなります。 結局の所は常に情報をキャッチアップし、より安定性と実効性のある対策を調査・研究して実 装していく必要があると思います。
まとめ 実際にチート・不正行為を対策するのは非常に難しいと思われます。 攻撃手法に関する情報交換や解析ツールの公開は日々世界中で行われており、対策側 はそういった解析者と戦って行かなければいけません。 今後も脆弱性診断などを通して、困っているゲーム会社様等の一助になれればと思っ ています。 最後になりますが、私はゲームセキュリティを通して多くの人と出会い、学びを得た と思っています。そういった方々にいつか恩返しが出来るように、どこまでも奮闘し ていく所存です。 ご清聴ありがとうございました!
おまけ