問題解説:ぼよよんのみ

問題文

近年のゲーム市場拡大に感化され我が社でも仮想遊戯開発部が新設された。
新サービスに向けてオンラインゲームを試作し、制作環境での複数人対戦は仕様書通りの動作が確認されている。
しかし、ステージング環境ではなんらかの設定ミスにより動作に支障が生じた。
原因を調べ、仕様書通りに動作するようにしてほしい。
また、ゲームの仕様に脆弱性があれば合わせて報告してほしい。

制約

ゲーム自体のソースコードの改変は禁止。

スタート

ゲーム開始後、ユーザ登録を行ってもmainシーンに遷移しない。

ゴール

仕様通りにゲームがプレイできる。
local portが枯渇する仕様やパフォーマンスを指摘できている。
スコアを無限に増やせる脆弱性等を指摘できている。

解説

この問題は、取引先から仕様書を渡され、仕様通りにオンラインゲームを動作させるというものでした。

トラブルの内容

Webサーバ上では、以下のような現象が発生していました。
– ゲームがスタートしない
– 攻撃ができない・アイテムが取れない
– ランキングが反映されない

これらは、以下に挙げるトラブルが原因でした。

1. Redisの使用できるメモリが足りない

参加者の情報は、Redisサーバで管理されていましたが、設定ミスでmaxmemoryを1にしてしまっていました。
そのため、/etc/redis/redis.conf内のmaxmemoryを1gなどに変更する必要がありました。

2. ufwの開放しているポートが間違っている

ufwをセキュリティを考慮して有効にしていましたが、ゲームで使うポートを開けていないトラブルがありました。
そのため、正しく使うポートのみを解放する必要がありました。

3. 使えるローカルポートの数が制限されている

通常、ネットワーク通信をする側はローカルポートを消費します。使えるローカルポートの範囲はカーネルパラメータで設定することができます。このゲームは、redisにたくさんコネクションを貼るため、sysctlでパラメータをいじったのですが、ip_local_port_rangeの値を間違えて設定していたため、疎通が取れなくなっていました。
そのため、ポートの範囲を広げる必要がありました。

その他

このゲームはできるだけ短い間隔でudpによる通信を行い、その度に新しいコネクションをredisにはる仕様になっていました。
このため、パフォーマンスがどうしても制限されてしまいます。

また、ユーザIDは他のプレイヤーに通知されない仕組みになっていましたが、自分のIDはわかるため高さを偽装しスコアを伸ばす、または任意の座標に攻撃を行うことができる仕様的な脆弱性がありました。

そのため、この2点について言及されていた場合は加点の対象としました。