Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[CEDEC2012]ネットワークゲームの不正行為と対策

 [CEDEC2012]ネットワークゲームの不正行為と対策

以前、CEDEC2012にて行われた、堀口 真司/池添徹による講演資料です。
http://cedec.cesa.or.jp/2012/program/NW/C12_P0011.html

<セッション内容>

コンシューマゲームでのメモリ改変ツールの登場から、オンラインゲーム黎明期のチート手法や対策。
MMORPG でのチート行為とその影響から見る対策。
ブラウザ、モバイルになり変化していった手法からその対策を考えていきます。

gree_tech

December 16, 2014
Tweet

More Decks by gree_tech

Other Decks in Technology

Transcript

  1. 自己紹介 • 堀口真司 (Shinji Horiguchi) • ネトゲ好き • DQN •

    池添徹 (Toru Ikezoe) • セキュリティ専門 • DEFCON-CTF
  2. ネトゲ初期の症状 • ふつうに遊んでたらステータスが変わっ てる • レベルが下がったり • 装備やインベントリ内容が変わったり • 見たことないモノがある

    • しらない魔法やアイテム • 存在しないはずのエリア • いつもの倍速でゲームが進んだり • 自分には心当たりがない。 x 2
  3. 原因 • キャラ名問い合わせ API がある • getName(0x1234) • 値は登録時に連番で割り当てられている •

    戻り値に ID と名前があるので集める • Id:0x1234,name:fizzbuzz • 応答がないときはその地域に居ない • 問い合わせに制限なし • 問い合わせ API は要注意!
  4. 原因 • 同じ API で Mob の名前も引ける • getName(0x0011) ←低い値は

    NPC 用とか • 連番なので数千個調べれば分布がわかる • しかも値は敵毎に固定 • ひとつの API を使いまわさない!
  5. 原因 • 受信パケットにレベル値が含まれている • パケット内の名前に文字列をくっつけて表示 • name:“hoge”,lv:80 • name=name+” ”+lvのように。

    • クライアントプログラム改造よりお手軽! • アイテム利用パケットにも値が。 • user:0x1234,type:10,quantity:5 • 自分が使っても他人が使っても同じフォーマ ット
  6. 原因 • 地面に置かれるアイテムパケットのフラ グ • 受信パケット書き換えるだけ • Identified:0 → 1

    • アイテムの構成要素も含まれる • 可視化フラグのようなものは注意! • アイテムは特に狙われやすい
  7. 原因 • 受信するダメージパケットから敵のライ フ計算 • 敵の最大ライフは統計を取る • 与えたダメージの累積から残りライフを出す • スキルパケットを送信するときに書き換

    え • target:0x1234,skill:5,lv:9 → lv:3 • 計算すればよいだけの仕組みは要注意! • 超強い AI とか、風向き計算してホールインワ ン
  8. 原因 • プログラムを書き換える • 描画関係のコードを nop で埋める • 半透明にしたり Z

    バッファを OFF にしたり • カメラの動きの制限解除 • if の書き換え • if の書き換えは歴史的にも多いので要注意 • 各プレイヤー間の視線チェックもサーバで
  9. 症状 • 未実装の敵やアイテムが見える • パッチ内容を先取り • 有名人に不適切な発言をさせる • スクリーンショットを撮って掲示板などに載 せる

    • 画像編集ツールを使うと JPEG 圧縮の癖などか ら鑑定師による判定を回避 見抜きいい? しかたないなぁ …
  10. 原因 • 受信パケットを変更したり増やしたり • say( 0x1234 , ”foobar” ) •

    クライアントアプリに受信させる • 未実装の敵に見た目を変更したり • 敵の種類の数値を書き換え • クライアントへの受信にも要注意!
  11. 原因 • パケット内の固定長の文字列がある • char msg[24]; • “hello world” の後に

    “hi” を発言すると • メモリ内では“hi¥0lo world”になるので • 短い発言をすると他人の会話が取得できる • パケットには隙間を作らない! • パケット構築は慎重に • 解析ツールで検出されるかも
  12. 原因 • クライアントプログラムを書き換える • if( distance < range ) •

    → if( true ) • サーバでチェックする • 経路や障害物の判定は実装しにくいので、狙 われやすい
  13. 原因 • ひとつのサーバプロセスに複数の地域が ある • 座標系は同じ。 • 他の地域でも ID を指定して対象に

    • アイテム盗むスキルは通用したり • NPC と会話できたり • アジトの奥の近接攻撃しか通用しない敵も同 じ • 複数インスタンスを扱うときは要注意! • まったく依存しないならプロセス分けよう
  14. 原因 • インベントリはスタックタイプ • 10個あればx10みたいな表示 • 0 個で分割するパケットを送る • アイテムが増える。

    • たぶん if( request <= quantity) みたいな • ゼロはもちろん、マイナスが通る事がある • ゼロや符号に注意!
  15. ブラウザ本体をいじる • IE はすごい難しいが Opera なんかは簡単 • オールドタイプ向け • DLL

    インジェクションしたり • 通信などをジャック • スピードハックなどは Flash にも有効 • 既存ツール流用
  16. ブラウザアプリ • 変数の書き換えは特殊な技術いらず • クライアント実装は JavaScript として、 • F12 押してブラウザの機能だけでできる

    • GUI でポチポチするだけ • アドオンで色々できる • テストツールを流用 • Selenium など
  17. スマホも視野に • NIC が2個あるノート PC など • 有線と無線で NAT を組む

    • 仮想 PC 使ってタダで構築 • NAT を構築して • hosts を書き換えたり • iptables で向きを変える • HTTP を ReverseProxy などでいじる • HTTPS でも自前の証明書をインストール
  18. サーバ特性の傾向 • フルスタック HTTP なソリューション増加 • プロセス内に複数インスタンス • プロセス寿命の増加 •

    非同期プログラミング • WebSocket の常時接続 • これらはオンラインゲーム構成に近い
  19. ブラウザアプリ特徴 • 送受信内容をいじる • いままでより容易 • クライアントアプリをいじる • いままでより容易 •

    アセットをいじる • いままでより容易 • 別インスタンスへの攻撃 • いままでより容易
  20. スマホアプリ特徴 • HTTP であれば、同じ方法で • そうでない場合は root 奪取など必要 • しかし家庭用ゲーム機よりはずっと楽

    • PC よりは面倒 • 常時接続型+スマホアプリパッケージ • いままでの PC オンラインゲームに似てる
  21. • 問い合わせ API • API の使いまわし、再利用 • 不要なデータ、データ間の隙間 • disable/enable

    系フラグ • すばやく計算できたら有利になる要素 • 経路や地形に依存する • アイテムに多くの機能