[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freewnn:00699] Re: Fw: Re: security bug report



むつみ@Debian Projectです。

>>>>> In [freewnn : No.00688] 
>>>>>	Hiroo ONO (小野寛生) <hiroo@oikumene.gcd.org> wrote:

>> 田畑さんからの返事がきました。

>> Cc: yusuke@kmc.kyoto-u.ac.jp
>> Subject: Re: security bug report
>> From: yusuke@kmc.kyoto-u.ac.jp (TABATA yusuke)
>> Date: Tue, 14 Aug 2001 21:44:48 +0900 (JST)

>> 田畑です

>> 対策としては

>> *辞書のディレクトリの外にはファイル操作をできないようにする

 とりあえず、Debian のは影響範囲がでかそう(jserver が root で動いてい
た...) ので、早急に対策を施す必要があったので、うかいさん
(ukai@debian.org)が書いた 以下のパッチを適用したものを 配布することに
しました。

 以下 パッチです。jserver_dir 以外の場所には ファイルを書き込めない
ようにしています。

diff -Nru freewnn-1.1.0+1.1.1-a017-6/Xsi/Wnn/jserver/dispatch.c freewnn-1.1.0+1.1.1-a017/Xsi/Wnn/jserver/dispatch.c
--- freewnn-1.1.0+1.1.1-a017-6/Xsi/Wnn/jserver/dispatch.c	Tue Mar 21 01:31:44 2000
+++ freewnn-1.1.0+1.1.1-a017/Xsi/Wnn/jserver/dispatch.c	Wed Aug 15 23:28:55 2001
@@ -260,7 +260,13 @@
 {
   char *q;
 
+#ifdef WNN_ALLOW_UNSAFE_PATH
   if (*buffer != '/')
+#else
+    /* XXX: path under jserver_dir only */
+  if (*buffer != '/' 
+      || strncmp(buffer, jserver_dir, strlen(jserver_dir)) != 0)
+#endif
     {
       char *path;
       size_t path_len;
@@ -275,6 +281,9 @@
 
       strcpy (path, jserver_dir);
 /*      strcat(path,c_c->user_name);   */
+#ifndef WNN_ALLOW_UNSAFE_PATH
+      if (path[strlen(path)-1] != '/' && *buffer != '/')
+#endif
       strcat (path, "/");
       strcat (path, buffer);
       strcpy (buffer, path);
@@ -282,6 +291,32 @@
       free (path);
     }
 
+#ifndef WNN_ALLOW_UNSAFE_PATH
+ {
+   char *p, *pp, *p0;
+   p = pp = p0 = malloc(strlen(buffer)+1);
+   for  (q = buffer; *q; p++, q++) {
+     if (*q == '/') {
+       while (*(q+1) == '/')
+	 q++;
+       if (strncmp(q, "/..", 3) == 0 && (*(q+3) == '/' || (*(q+3) == '\0'))) {
+	 q += 2;
+	 p = pp-1;
+	 continue;
+       }
+       pp = p;
+     }
+     *p = *q;
+   }
+   *p = '\0';
+   strcpy(buffer, p0);
+   free(p0);
+ }
+ if (strncmp(buffer, jserver_dir, strlen(jserver_dir)) != 0) {
+   /* unsafe path */
+   return NULL; /* XXX */
+ }
+#endif
   for (q = buffer; *q++;)
     ;
   q -= 2;
diff -Nru freewnn-1.1.0+1.1.1-a017-6/Xsi/Wnn/jserver/do_filecom.c freewnn-1.1.0+1.1.1-a017/Xsi/Wnn/jserver/do_filecom.c
--- freewnn-1.1.0+1.1.1-a017-6/Xsi/Wnn/jserver/do_filecom.c	Tue Mar 21 01:21:12 2000
+++ freewnn-1.1.0+1.1.1-a017/Xsi/Wnn/jserver/do_filecom.c	Wed Aug 15 17:58:12 2001
@@ -65,9 +65,10 @@
 
 /*      mkdir   */
 
-#define MODE (0000000 | 0000777)
+/* #define MODE (0000000 | 0000777) */
 /* #define      MODE (0040000 | 0000731) */
 /* #define      MODE (0000000 | 0000733) */
+#define      MODE (0000000 | 0000755)
 
 void
 js_mkdir ()

-- 
いしかわ むつみ
 <ishikawa@linux.or.jp>, <ishikawa@debian.org>, <ishikawa@redhat.com>


http://www.freewnn.org/ FreeWnn Project