脆弱性 について

04445, Today: 001, Yesterday: 001 Hits


Buffer Overflow in JOIN Command Leads to DoS

絶対に真似はしないで下さい。手順(サーバとのやりとり)に関しては一部省き、コピーアンドペースト等では出来ないように書いています。言い換えれば、一部補完をすることにより実現可能となってしまうからです。 また、この文章により発生した損害/障害等、何かあっても一切責任もちません。個人の責任の元で行って下さい。
また、IRCNet-JPのサーバや、国内の大きなIRCネットワークの大半が対策されたため、情報公開します。 対応していないところが有れば、機会を見つけ、早急にアップデートすることをお勧めします。

影響するバージョン

2003.10.13 に発見され修正された。影響するバージョンは 2.10 〜 2.10.3p3 です。修正済みバージョンは irc2.10.3p4 です。 しかし、irc2.10.3p4 も公開されましたが、別のバグが発見されすぐに公開が停止、irc2.10.3p5 が公開となりました。また、一般向けには公開されていませんが、一般公開前の irc2.11.0a1 でも影響すること確認されました。

概要

一定の法則で1つのJOINコマンドで同時に JOIN したときに発生、ircd のプロセスが死ぬことを確認されました。

ex: JOIN !50byteA,!50byteB,…,!50byteN

また、' ./common/struct_def.h ' の ' #define CHANNELLEN 50 ' および、' #define BUFSIZE 512 ' を修正したところで、結果は変わりません。

IRCNet-JP で実際に発生した影響範囲

この ' irc2.10.3p3 and maybe below remote DOS exploit tool ' は IPv4 にしか対応していません。 その為、irc.*.wide.ad.jp / irc.dti.ne.jp / irc.huie.hokudai.ac.jp / irc.media.kyoto-u.ac.jp が狙われましたが、 irc6.nara.wide.ad.jp は 殆ど被害が有りませんでした。しかし、ツールを使わず、 telnet で同様のことを行えば、直接落とすことが可能となりました。(尚、全て修正されてからこのドキュメントは公開されています。)

修正パッチ

Patch: The patch is also avialable for download from: http://akson.sgh.waw.pl/~chopin/ircd/patches/m_join.diff

--- ../../cvs/irc2.10.3/ircd/channel.c  Fri Oct 10 22:34:05 2003
+++ channel.c  Sat Oct 11 00:03:40 2003
@@ -2001,7 +2001,7 @@
   Reg  Link  *lp;
   Reg  aChannel *chptr;
   Reg  char  *name, *key = NULL;
-  int  i, flags = 0;
+  int  i, tmplen, flags = 0;
   char  *p = NULL, *p2 = NULL, *s, chop[5];
 
   if (parc < 2 || *parv[1] == '\0')
@@ -2150,10 +2150,20 @@
              parv[0]), name);
       continue;
         }
+    tmplen = strlen(name);
+    if (i + tmplen + 2 /* comma and \0 */
+      >= sizeof(jbuf) )
+    {
+
+      break;
+
+    }
     if (*jbuf)
-      (void)strcat(jbuf, ",");
-    (void)strncat(jbuf, name, sizeof(jbuf) - i - 1);
-    i += strlen(name)+1;
+    {
+      jbuf[i++] = ',';
+    }
+    (void)strcpy(jbuf + i, name);
+    i += tmplen;
       }
 
   p = NULL;
@@ -2305,6 +2315,16 @@
              parv[0], name, chop);
     else if (*chptr->chname != '&')
         {
+      /* ":" (1) "nick" (NICKLEN) " JOIN :" (7), comma (1)
+      ** possible chop (4), ending \r\n\0 (3) = 16
+      ** must fit in the cbuf as well! --B. */
+      if (strlen(cbuf) + strlen(name) + NICKLEN + 16
+         >= sizeof(cbuf))
+      {
+        sendto_serv_butone(cptr, ":%s JOIN :%s",
+          parv[0], cbuf);
+        cbuf[0] = '\0';
+      }
       if (*cbuf)
         strcat(cbuf, ",");
       strcat(cbuf, name);

検証

実際に公開された exploitツールを用い、ローカルサーバで実験してみました。

USER fbmbgfith localhost localhost mauer
NICK fbmbgfith
 - snip -  ← motd 等が表示される
JOIN !#fxflmlkkbicftrlpsvuhmboqpryvbsfgrkrevfoyntejlsygov,!#qeafurxv … (以下略)
:fbmbgfith!~fbmbgfith@localhost JOIN :!0CH13fxflmlkkbicftrlpsvuhmboqpryvbsfgrkrevfoyntej
:fbmbgfith!~fbmbgfith@localhost JOIN :!0CH13qeafurxv … (以下略)
 - snip -  ← JOIN した数のチャンネルだけ表示され、途中で ircd 落ちる。

すなわち、同等のことを、telnet でやればサーバを落とすことが可能となる。

また、' irc2.10.3p3 and maybe below remote DOS exploit tool 'を使用してみた感じは以下の通り。

tomo@VM-Ayu:~/ircd$ ./a.out -h 127.0.0.1 -p 6667
irc2.10.3p3 remote dos exploit delivered by millhouse
-----------------------------------------------------
[x] connected to 127.0.0.1:6667 ..
[x] trying to logon with nick gpiwlrujl ..
[x] we're logged on, sending evil data ..
[x] exploit worked, ircd unreachable ..

原因

safe channel を使っているところがポイントです。 実際、safe channel を使用すると、'!XXXXXほげ' な感じになりますが、そのID部分(5byte分)が増えることから起因しています。

この問題の原因はバッファオーバーランによる脆弱性で、channel.c に含まれている m_join() 関数に存在していました。この関数では、クライアントから送信された JOIN 先チャンネルのリストを別のバッファにコピーする処理を行いますが、この際にコピー先バッファのサイズのチェックを行っていませんでした。このため、同時に JOIN するチャンネル名の長さとその数によっては、文字列バッファコピー処理中にプロセスのメモリ空間が破壊され、IRCサーバがクラッシュする原因となっていたのです。

m_join.diff パッチはこの問題を修正するものです。このパッチを適用すると、同時 JOIN を試みた場合に一部チャンネルへの JOIN が暗黙的に取り消されることがありますが、これはあくまでも作為的に長い JOINコマンド を送信したときのみに発生するものであり実害はないでしょう。

情報提供:匿名希望さんより

情報取得元

http://www.securiteam.com/exploits/6Q00F0U8KM.html
http://www.security-corporation.com/exploits-20031013-000.html
http://www.securitylab.ru/_exploits/ircd.c.txt

Copyright (C) 1998-2004 tomocha
Last update: 2004-07-22
tomo@gyojya.jp