2005/01/11

友人の家でいたストSPやってきた。そんなに出来は悪くないようで安心しましたが、友人が買ったので私が買う必要はなさそうです。がんばってはやく隠し要素全部出してください、それが持ち主の宿命です(あぁもうオレがいたスト3買ったときは1日中いたストやる日が1週間続いたりしたこともあった)。

ROのはなし

PT機能に脆弱性

RO TENPAIあたりで大々的に悪用されて最近世間が騒然としてるPTを乗っ取れるバグ。とりあえずいろいろ再現試験をやって何が脆弱なのか、何があぶないのか、どう対策するのか、という辺を調べてみました。2時間ほどで全解明出来ましたんで、とりあえず手法は伏せるとして(まぁ調べればWebででてきますが)どういったことになっているのかを簡単にご紹介。

っていうか、デマが飛び交いすぎなので、本当の情報をFAQ形式でお届けします。

現象を教えてください

正規クライアント上でゲーム上から得られるPT名を元にして、正規クライアント上で特定の操作を行うことによってそのPTを乗っ取ることができます。乗っ取ることにより乗っ取った人間はリーダー権を得ることができます。

正確に言うと、その操作を行うことによりターゲットになったPTのメンバーをすべて乗っ取り側が作成したPTに移動させることができ、移動させた瞬間にその旧PTを機能不全に陥れることができます(マップ移動、再ログインによって乗っ取り側が作成したPTのほうでPT情報が読み込まれるので、それらによってPTの機能は回復し、他人にリーダー権を握られてはいるもの、PT自体は稼働します。

なお、これを応用した事例として、乗っ取りをかけた直後にさらに正規クライアントから特定の操作をすることにより、乗っ取られたPTのメンバーを別の不使用PTへ「飛ばす」こともできることが確認されています。見た目には乗っ取られ側からはPT名が勝手に変わったように見えます。

全角8文字だと乗っ取られると聞きましたが

RO TENPAIでは全角8文字のPTにターゲットをあわせて乗っ取り活動を行っていたようですが、正規クライアントから全角8文字に満たないPT名のPTを乗っ取ることも可能です。よく対策として全角8文字より短い文字数のPTをつくればOKといわれていますが、これはデマです。3文字とか4文字のPT名でも同様にPTを乗っ取られる脆弱性が存在します(こちらは世間では条件が確定しておらず、あまり公になっていないようですが、acidlemonの手元では任意のPT名を乗っ取れることを確認しています)。

対策はなにをすればいいですか

PTをつくらなきゃいいです。

と言いたいところですがそうもいかないでしょう。しかし、ROのサーバーの仕様ではPT名として有効なのは半角16文字(全角だと8文字)です。よく24バイトと言われていますが、これはROのクライアントがサーバーに送るときのパケットのバッファが24バイトであるだけであり、今回の問題はサーバー側でバッファオーバーフローして文字列の比較判定で不味い処理をしていることにより、既存のPTに対してアタックを行うことでそのPTを別のPTで上書きしてPTメンバーを移動させることができるのが今回の脆弱性の要因になっています。

なお、17バイト以上のPT名で作ればいいといった対策がいわれていますが、それはデマです。そもそも17バイト以上の名前ではPTを作ることができません。結局の所、PT名がはっきりしている限りすべてのPTに対して脆弱性を利用して乗っ取りをかけることが可能なので、対策はありません。あんまり目立たないようにしろよ、とかしか…

結局なにが悪いんですか

今回はサーバー側のバッファ関係で不味い処理を行っているのが原因になっていますが、クライアントでバッファを未チェックのまま(鯖側と仕様をあわせずに)PT名作成要求をおくっていることも一つの悪い点です。とりあえずクライアント側で17バイト以上のPT名を16バイトに詰めて送るようにすれば正規クライアントからこの脆弱性を突くことはできなくなりますが、パケット改変を行えばサーバーの脆弱性を突くことはできますので、サーバー側で対策を行わない限り根本的な解決には至らないと思われます。

とまぁこんなかんじです。対策はない、とかそんな悲観的なことを書いてしまいましたが、事実です。PT名が見えている限りそのPTを乗っ取ることは可能なので、せいぜいギルド抜けてPT名見えないようにするとかぐらいしか回避法はないのではないでしょうか。この脆弱性を応用することによってPT名のないPTというのを運で作成することができるので、それを実行すれば乗っ取られる可能性は事実上なくなりますが、脆弱性対策として脆弱性を使わないとならないというのは皮肉なものですね。

さすがに脆弱性がふさがっていない現状で手法とその仕組みについて長々と書くわけには行きませんので、ここまでで止めておきます。ふさがったらどういうからくりになっていたのかについては補足として入れたいと思います。脆弱性解析に協力していただいたMitsukiさんどうもでした。あと相方にもありがと(なんとなく)。

うされもん @acidlemonについて

|'-')/ acidlemonです。鎌倉市在住で、鎌倉で働く普通のITエンジニアです。

30年弱住んだ北海道を離れ、鎌倉でまったりぽわぽわしています。

外部サイト情報

  • twitter
  • github
  • facebook
  • instagram
  • work on kayac