2012年02月21日

探検ドリランドのカード増殖問題について

昨日驚きのニュースが飛び込んできました。
グリーが提供している「探検ドリランド」というゲームのレアカードを、不正に入手して、転売して儲けている人がいたそうです。

レアカードの転売自体にも問題はありそうですが、それはおいていて、なぜレアカードの増殖なるゲームのバグが存在したのか考えてみましょう。

○2つの端末で同時アクセスを行うと
2chなどにレアカードの増殖方法がアップされて問題が発覚したそうですが(問題自体はずっと前から存在していたらしい?)その方法が、同一IDをもった2台の端末で”同時に”アクセスする方法のようです。

携帯ゲームだと、そもそも携帯の固定IDで認証していれば、同じIDは存在しないから、同時にアクセスするような状況は考えなくてよかったというのがあったのでしょう。
スマホなどだとこの方法では駄目だと思いますが、昔ながらの携帯ゲームを作っていたプログラマが大勢いただろうグリーでは、携帯文化が残っていた可能性もあります。

○インフラ側から今回の問題を考えると(中の人でないので、もちろん推測)
もしかしたら、マスター/スレーブ間のレプリケーションのずれを利用した可能性も考えられます。

例えば、カード管理用DB1とトレーディング管理用DB2があったとして
トレーディング時には
1、DB1からカードを抜き出して、DB2へカードをセットする。
2、DB2上でトレーディング条件があえばトレーディング成功
3、【受け取り】DB2からトレーディング後のカードを抜き出して、DB1へ追加する。
のような手順になると思われます。

ここからは思いっきり推測ですが、グリーほどの規模のソーシャルゲームになると、DB1もDB2も複数あって、しかもマスター/スレーブ構成になっている可能性が高いです。
例えば3番のカードを受け取る処理ですが、実際はもっと複雑になっていて
3番の受け取り処理はきっとこんな感じ
1、DB2のスレーブから、受け取るカードがあるか確認する。
2、受け取るカードがあれば、DB1へ受け取ったカードを追加する。
3、DB2のマスターで受け取ったカードを削除する。

この一連の処理は一瞬で終わるので普通は問題ないのですが、3番目のマスターを変更したものがスレーブに反映される前に、同じIDを持った端末で受け取り処理を実行されると、無いはずのカードが受け取れてしまうという問題が発生することがあります。

もちろんこれは推測ですが、グリーの開発者の昔の記事を読むと、トランザクションなどはなるべく使わなく、そして途中で失敗してもユーザが損しない方法で処理するようなことが書かれていました。

グリーの規模のソーシャルゲームについては経験ないですが、それよりももっと小さい規模のゲームでも、DB周りの処理は本当に気をつけないとすぐに過負荷で落ちてしまうことがあったので、きっと探検ドリランドも負荷対策には苦労していたと予想出来ます(きっと自分の予想以上でしょう)
トランザクションをなるべく使わないような方針にしていた可能性は高いと思われ、そこを今回利用されてしまったと思われます。

○改善案
ちゃんとロックして問題が起こらないようにするのが一番ですが、DBの負荷は大幅に高まる可能性もあり、きっと大変でしょう。
同一IDの同時アクセスのみを防ぐだけならそんなに難しくないと思いますが、他にも同じような処理をしている可能性も高く、それら全てに同時アクセスのチェック機構を組み込むのも面倒だし漏れる可能性も高くなるので、難しい判断になるでしょうね。


◆楽天オークションでも売っていたようですね(下は既に出品キャンセルのようですが)


posted by zjapan at 15:34| Comment(0) | TrackBack(1) | 事件です | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

人気ゲームのバグで、数百万円稼いだ輩があ...
Excerpt: 「探検ドリランド」に大きな問題が発見されたそうです。既知のバグだったようで、それに気づかなかったグリーの罪は重いと思われ、特に(結果的に)裏社会に資金を提供したことは酷...
Weblog: Webエンジニアのちび活動記
Tracked: 2012-02-23 16:06