めんどうくさいゲームセキュリティ

20c5ddcad23304aed77ce8c3aa020562?s=47 @tkmru
December 18, 2019

 めんどうくさいゲームセキュリティ

社内勉強会にて

20c5ddcad23304aed77ce8c3aa020562?s=128

@tkmru

December 18, 2019
Tweet

Transcript

  1. めんどうくさい ゲームセキュリティ アカツキ セキュリティエンジニア 小竹 泰一

  2. タイトルの元ネタ

  3. 自己紹介 • 名前: 小竹 泰一 • 入社: 2019年9月 • 職種:

    セキュリティエンジニア • 脆弱性診断、ツールの検証/開発などなど
  4. 脆弱性診断とは!? • 攻撃者目線で自社サービスに対して攻撃し、脆弱性を発見する • 自社サービスのセキュリティホールを修正するために実施 • セキュリティインシデントによる被害を未然に防ぐ

  5. いろいろな脆弱性診断

  6. ネットワーク診断 • ミドルウェアの設定不備や、古い バージョンのソフトウェアが放置さ れていることによる脆弱性などを発 見 • 社内ネットワークにやる場合だと... • 社内ネットワークにつないだ診断員の

    PCからネットワーク上の端末へ攻撃 • 脆弱性を持つ端末が放置されていると、 社内ネットワークに攻撃者が何らかの 形で侵入した場合、その端末が攻撃の 起点となる可能性
  7. アプリケーション診断 • Webアプリケーションやスマホア プリなどに対する脆弱性診断 • XSS、SQLi、CSRF、SSRF、権限管理 の不備などを見つける • ゲームアプリの場合だとチートのしや すさという観点からも確認

    • ユーザー自身が攻撃してくるので、 他のアプリケーションとは観点が 異なる
  8. 今日のお話 • ゲームアプリの診断で確認するところとチート対策について、 ざっくりお話しします • 時間の都合上、すべて網羅しているというかんじではないです

  9. ゲーム以外のアプリケーションの診断 • プロキシツールをつかってアプリケーションとサーバーの間の 通信の詳細を見て、改ざんし脆弱性がないかチェック • プロキシツールを使うと通信内容を確認、改変しやすい サーバーの証明書 プロキシの証明書 公開鍵の証明書 公開鍵の証明書

  10. Burp Suiteで通信内容を見る様子

  11. ゲームアプリの診断 • 通信内容が暗号化されていることが多く、ただプロキシを使う だけでは中身を読み取れない プロキシの証明書 サーバーの証明書 公開鍵の証明書 公開鍵の証明書

  12. Burp Suiteで通信内容を見る様子 暗号化されている

  13. 診断準備が必要 • 暗号化に使われている鍵とアルゴリズムを特定 • BurpやPacketProxyといったプロキシツールのencoderを開発 • 有償版のBurp Suiteはスキャナーがついていて便利 • PacketProxyはTCP/UDPを利用したバイナリ通信に対応していたり、

    DNSサーバーが組み込まれていたりして便利
  14. ありがちな脆弱性 • 複数のリクエストを同時に送信することで回数の制限を突破 • 例: 有料のガチャを1回分のコストで何度も引く • ガチャを引く際のリクエストをプロキシ上に保存 • 複数の同一のガチャを引くリクエストを同時に送信

    • 例えば20個のリクエストを同時に送信すると9割程度のリクエストが 通るケースがある • 原因: DBでのロックの不備 • SELECT FOR UPDATEを用いて規定回数以上に処理が通らないように する
  15. 見るべきところは 通信レイヤーだけではない

  16. クライアント上にもゲームロジックが 載っていると.... • メモリ上のデータ • apk/ipa内のバイナリ • ローカルファイル

  17. クライアント上にもゲームロジックが 載っていると.... • メモリ上のデータ • apk/ipa内のバイナリ • ローカルファイル 攻撃可能!

  18. メモリ改ざん • デバッガやチートツールを用いて、メモリ上の値を検索 • GDB、IDA Pro、GameGuardianなど • 見つかった値を改ざんしチート • スコアや所持金などを不正に上昇させる

    • チートツールがあるので、チーターがカジュアルにチート可能 • この辺はゲーム以外のスマホアプリでも見ることもある
  19. ありがちな脆弱性 • メモリ改ざんが有効な画面が一部だけ存在する • バトル画面は対策されていても、ショップ画面では対策されていない 場合がある • 対策: メモリ上のデータのエンコード/暗号化 •

    くわしくは後ほど
  20. バイナリの改ざん • 逆アセンブルした結果やデコンパイルした結果を元にバイナリ を解析 • パッチを当てることでチート • メモリ改ざんより難易度が高い • シンボル(関数名、変数名)が残っている、あるいはメタデー

    タから復元できると容易 • Unityのglobal-metadata.datに注意
  21. ローカルファイルの改ざん • ローカルファイル内にゲーム情報が保存されていることがある • 改ざんすることでチートができる • この辺はゲーム以外のスマホアプリでも見ることもある

  22. チート対策方法

  23. バイナリ改ざん対策 • シンボル情報の削除 • メタデータからも復元できないように • コード難読化 • 逆アセンブル、デコンパイルされても処理がわからないように •

    コード改ざん検知 • パッチを当てられたらゲームが起動しないように • 攻撃者には無限に時間があるため、完全なリバースエンジニアリン グ対策は難しい
  24. パケットの改ざん対策 • SSL Pinning • HTTPSで通信する際の証明書 or 公開鍵が一致するか検証 • プロキシツールの証明書を弾くことができる

    • 通信内容の暗号化 • リバースエンジニアリング対策も併用 • バイナリからのシンボル情報の削除 • バイナリの難読化 多層防御が重要!
  25. パケットの改ざん対策 • より強くするには.... • コード改ざん検知 • SSL Pinningを解除させないために • リクエスト/レスポンス改ざん検知

    • 暗号化 + bodyに入っているデータのハッシュの検証でより強く • 独自暗号 • 一般的な暗号方式だと、暗号に使われている定数でバイナリをgrepされると 暗号方式がバレてしまう
  26. メモリ改ざん対策 • メモリ上の値のエンコード/暗号化 • デバッガアタッチの検知 • GDBなどのデバッガの使用を検知 • Root化端末/Jailbreak端末の検知 •

    チートツールはRoot化端末/Jailbreak端末のみで動作することが多い
  27. ローカルファイル改ざん対策 • ゲームの進行を左右するようなファイルを置かない仕様に • 置く場合は暗号化 • リバースエンジニアリング対策も併用 • バイナリからのシンボル情報の削除 •

    バイナリの難読化 多層防御が重要!
  28. チート対策のポイント • クライアント側にロジックを載せると、100%の対策は不可能 • 時間と技術があれば理論上突破できる • 攻撃者には無限に時間がある • できるだけサーバー側にロジックを寄せるのが好ましい •

    カジュアルなチートは阻止したい • 簡単にツールを使うだけでチートできるようなのは対策マスト • 他ユーザーに影響が及ぶようなチート、脆弱性は防ぎたい • 他ユーザーのアイテムの使用、サーバーが落ちる(DoS)など
  29. まとめ • ゲームアプリの診断は他のアプリケーションの診断に比べてめ んどうくさい • 高レイヤーと低レイヤーに両方に触れられるのは面白い!! • クライアントサイド、サーバーサイド両方で対策を行う必要が あり、めんどうくさい •

    多層防御が重要
  30. おしまい