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

[harden-mac:0682] Re: LHa-1.14iのSecurity-hole対策



Tomio Arisakaです。

Windows環境では、LHa展開ツールのSecurity-holeが問題になっていますが、
MacOSX環境でも似たような問題があります。

先日「LHa-1.14i」にSecurity-holeが存在することが発表されました。
今年5月に続いて二度目になります。
<http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0694>
<http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0745>
<http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0769>
<http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2004-0771>

この問題に対処する為のパッチは「FreeBSD ports archivers lha」で入手できます。
<http://www.freebsd.org/cgi/cvsweb.cgi/ports/archivers/lha/>
このページの下部にあるリンク[Download this directory in tarball]からパッチ
ファイル「lha.tar.gz」をダウンロードします。
これを展開して下記の4つのパッチファイルを入手します。
最初の2つが今回のSecurity-hole用パッチで、後の二つは、5月の時のパッチです。
patch-command_buffer
patch-dir_length_bounds_check
patch-symlink
patch-traversal


以下、私が行ったLHaへのパッチ作業手順です。
まず、パッチファイルが4つあるので、バッティングしていない事を確認するために
手作業で結合させてみました。(結合させなくとも大丈夫だと思います)
そして、出来上がったファイル名を「lha-114i-security-patch-20040905.diff」と
しました。
加えて、昔、SHIROYAMAさんから教えて頂いた日本語化パッチ情報(下記URL参照)も
使用しました。
<http://www.e-e.to/~kki/diary/?20020426#26-2>
< http://www.e-e.to/~kki/MacOSX/lha-114i-macosx-20020426.diff >
今回、この日本語化パッチは、前述のSecurityパッチとlhlist.cでバッティングして
しまいましたので、その部分を修正したパッチを作りました。
そのファイル名を「lha-114i-macosx-20040911.diff」としました。
(このパッチファイルは、前述のSecurityパッチを当てた後でないと当てられません)

[G3:~] mio% curl -O http://www2m.biglobe.ne.jp/~dolphin/lha/prog/lha-114i.tar.gz
[G3:~] mio% gnutar -xzf ./lha-114i.tar.gz
[G3:~] mio% pushd ./lha-114i/
[G3:~/lha-114i] mio% patch -p0 < ../lha-114i-security-patch-20040905.diff
[G3:~/lha-114i] mio% patch -p1 < ../lha-114i-macosx-20040911.diff
[G3:~/lha-114i] mio% make
ここまでの作業で実行ファイル「lha」が「src」ディレクトリ内に生成されました。
  よって、OpenUp.app等で利用するなら、このlhaをコピーすれば終わりです。
もし「/usr/local/bin」にインストールしたい場合は、次のコマンドも実行します。
[G3:~/lha-114i] mio% sudo make MANSECT=1 install
(但し、man用のパス指定が異なっているので、manファイルのインストールは失敗
   しますが、私は不要なので無視しています)

以上です。
何か問題点がありましたら、ご指摘下さい。よろしくお願いします。



「lha-114i-macosx-20040911.diff」
vvvvvvvvvvvvvvv この行の次から始まります vvvvvvvvvvvvvvvvvvvvvvvvvv
diff --recursive --unified --ignore-space-change lha-114i.orig/Makefile lha-114i/Makefile
--- lha-114i.orig/Makefile Fri Dec 15 21:13:16 2000
+++ lha-114i/Makefile Sun Apr 21 01:24:58 2002
@@ -13,14 +13,14 @@
SHELL=/bin/sh
MAKE = make

-#CC = cc
-CC = gcc
+CC = cc -framework Carbon
+#CC = gcc
SWITCHES = -DNEED_INCREMENTAL_INDICATOR \
-DTMP_FILENAME_TEMPLATE="\"/tmp/lhXXXXXX\""

#MACHINE = -DSYSTIME_HAS_NO_TM -DFTIME -DEUC
#MACHINE = -DSYSTIME_HAS_NO_TM -DEUC -DHAVE_TM_ZONE -DSYSV_SYSTEM_DIR
-MACHINE = -DSYSTIME_HAS_NO_TM -DEUC -DSYSV_SYSTEM_DIR -DMKTIME
+MACHINE = -DSYSTIME_HAS_NO_TM -DEUC -DSYSV_SYSTEM_DIR -DMKTIME -DHAVE_NO_LCHOWN -DMULTIBYTE_CHAR

#OPTIMIZE = -O2 -fstrength-reduce -fomit-frame-pointer
OPTIMIZE = -O2 -DSUPPORT_LH7 -DMKSTEMP
diff --recursive --unified --ignore-space-change lha-114i.orig/src/append.c lha-114i/src/append.c
--- lha-114i.orig/src/append.c Wed Oct 4 23:57:38 2000
+++ lha-114i/src/append.c Thu Apr 18 11:53:27 2002
@@ -68,7 +68,7 @@
#ifdef NEED_INCREMENTAL_INDICATOR
switch (quiet_mode) {
case 0:
- m = MAX_INDICATOR_COUNT - strlen(name);
+ m = MAX_INDICATOR_COUNT - (strlen(name) / 8 * 8 + 8);
if (m < 1) /* Bug Fixed by N.Watazaki */
m = 3; /* (^_^) */
printf("\r%s\t- %s : ", name, msg);
diff --recursive --unified --ignore-space-change lha-114i.orig/src/extract.c lha-114i/src/extract.c
--- lha-114i.orig/src/extract.c Wed Oct 4 23:57:38 2000
+++ lha-114i/src/extract.c Fri Apr 26 20:56:54 2002
@@ -7,6 +7,7 @@
/* Ver. 1.14 Source All chagned 1995.01.14 N.Watazaki */
/* ------------------------------------------------------------------------ */
#include "lha.h"
+#include <Carbon/Carbon.h>

int
decode_lzhuf(infp, outfp, original_size, packed_size, name, method)
@@ -17,6 +18,11 @@
char *name;
int method;
{
+ char tmpbuf[2000];
+ CFStringRef pathStr;
+ pathStr = CFStringCreateWithCString(kCFAllocatorDefault, name, kCFStringEncodingDOSJapanese);
+ CFStringGetCString(pathStr, tmpbuf, 2000, kCFStringEncodingEUC_JP);
+
interface.method = method;
interface.dicbit = 13; /* method + 8; -lh5- */
interface.infile = infp;
@@ -27,13 +33,13 @@
switch (method) {
case LZHUFF0_METHOD_NUM:
case LARC4_METHOD_NUM:
- start_indicator(name, original_size
+ start_indicator(tmpbuf, original_size
,verify_mode ? "Testing " : "Melting ", 2048);
copyfile(infp, (verify_mode ? NULL : outfp), original_size, 2);
break;
case LARC_METHOD_NUM: /* -lzs- */
interface.dicbit = 11;
- start_indicator(name, original_size
+ start_indicator(tmpbuf, original_size
,verify_mode ? "Testing " : "Melting "
,1 << interface.dicbit);
decode(&interface);
@@ -42,7 +48,7 @@
case LZHUFF4_METHOD_NUM: /* -lh4- */
case LARC5_METHOD_NUM: /* -lz5- */
interface.dicbit = 12;
- start_indicator(name, original_size
+ start_indicator(tmpbuf, original_size
,verify_mode ? "Testing " : "Melting "
,1 << interface.dicbit);
decode(&interface);
@@ -54,12 +60,12 @@
interface.dicbit = (method - LZHUFF6_METHOD_NUM) + 15;

default:
- start_indicator(name, original_size
+ start_indicator(tmpbuf, original_size
,verify_mode ? "Testing " : "Melting "
,1 << interface.dicbit);
decode(&interface);
}
- finish_indicator(name, verify_mode ? "Tested " : "Melted ");
+ finish_indicator(tmpbuf, verify_mode ? "Tested " : "Melted ");

return crc;
}
diff --recursive --unified --ignore-space-change lha-114i.orig/src/lharc.c lha-114i/src/lharc.c
--- lha-114i.orig/src/lharc.c Fri Oct 6 02:33:34 2000
+++ lha-114i/src/lharc.c Thu Apr 18 09:56:24 2002
@@ -120,7 +120,7 @@
ignore_directory = FALSE;
verify_mode = FALSE;

- noconvertcase = FALSE;
+ noconvertcase = TRUE;

extract_directory = NULL;
xfilec = 257;
diff --recursive --unified --ignore-space-change lha-114i.orig/src/lhext.c lha-114i/src/lhext.c
--- lha-114i.orig/src/lhext.c Wed Oct 4 23:57:38 2000
+++ lha-114i/src/lhext.c Fri Apr 26 20:58:29 2002
@@ -14,6 +14,7 @@
/* Ver. 1.14e bugfix 1999.04.30 T.Okamoto */
/* ------------------------------------------------------------------------ */
#include "lha.h"
+#include <Carbon/Carbon.h>
/* ------------------------------------------------------------------------ */
static int skip_flg = FALSE; /* FALSE..No Skip , TRUE..Skip */
static char *methods[] =
@@ -128,11 +129,16 @@
{
FILE *fp;

- if ((fp = fopen(name, WRITE_BINARY)) == NULL) {
+ char tmpbuf[2000];
+ CFStringRef pathStr;
+ pathStr = CFStringCreateWithCString(kCFAllocatorDefault, name, kCFStringEncodingDOSJapanese);
+ CFStringGetCString(pathStr, tmpbuf, 2000, kCFStringEncodingUTF8);
+
+ if ((fp = fopen(tmpbuf, WRITE_BINARY)) == NULL) {
errno = 0;
- if (!make_parent_path(name) ||
- (fp = fopen(name, WRITE_BINARY)) == NULL)
- error("Cannot extract", name);
+ if (!make_parent_path(tmpbuf) ||
+ (fp = fopen(tmpbuf, WRITE_BINARY)) == NULL)
+ error("Cannot extract", tmpbuf);
errno = 0;
}
return fp;
@@ -145,12 +151,16 @@
LzHeader *hdr;
{
time_t utimebuf[2];
+ char tmpbuf[2000];
+ CFStringRef pathStr;
+ pathStr = CFStringCreateWithCString(kCFAllocatorDefault, name, kCFStringEncodingDOSJapanese);
+ CFStringGetCString(pathStr, tmpbuf, 2000, kCFStringEncodingUTF8);

/* adjust file stamp */
utimebuf[0] = utimebuf[1] = hdr->unix_last_modified_stamp;

if ((hdr->unix_mode & UNIX_FILE_TYPEMASK) != UNIX_FILE_SYMLINK)
- utime(name, utimebuf);
+ utime(tmpbuf, utimebuf);

if (hdr->extend_type == EXTEND_UNIX
|| hdr->extend_type == EXTEND_OS68K
@@ -159,15 +169,15 @@
Please need your modification in this space.
#else
if ((hdr->unix_mode & UNIX_FILE_TYPEMASK) != UNIX_FILE_SYMLINK)
- chmod(name, hdr->unix_mode);
+ chmod(tmpbuf, hdr->unix_mode);
#endif
if (!getuid()) {
#ifndef HAVE_NO_LCHOWN
if ((hdr->unix_mode & UNIX_FILE_TYPEMASK) == UNIX_FILE_SYMLINK)
- lchown(name, hdr->unix_uid, hdr->unix_gid);
+ lchown(tmpbuf, hdr->unix_uid, hdr->unix_gid);
else
#endif /* HAVE_NO_LCHWON */
- chown(name, hdr->unix_uid, hdr->unix_gid);
+ chown(tmpbuf, hdr->unix_uid, hdr->unix_gid);
}
errno = 0;
}
diff --recursive --unified --ignore-space-change lha-114i.orig/src/lhlist.c lha-114i/src/lhlist.c
--- lha-114i.orig/src/lhlist.c Wed Oct 4 23:57:38 2000
+++ lha-114i/src/lhlist.c Fri Apr 26 19:40:54 2002
@@ -13,6 +13,7 @@
/* Ver. 1.14e Bug Fix for many problems 1999.05.25 T.Okamoto */
/* ------------------------------------------------------------------------ */
#include "lha.h"
+#include <Carbon/Carbon.h>

/* ------------------------------------------------------------------------ */
static long packed_size_total;
@@ -137,8 +138,13 @@
char method[6];
char modebits[11];

+ char tmpbuf[2000];
+ CFStringRef pathStr;
+ pathStr = CFStringCreateWithCString(kCFAllocatorDefault, hdr->name, kCFStringEncodingDOSJapanese);
+ CFStringGetCString(pathStr, tmpbuf, 2000, kCFStringEncodingEUC_JP);
+
if (verbose)
- printf("%s\n", hdr->name);
+ printf("%s\n", tmpbuf);

strncpy(method, hdr->method, 5);
method[5] = '\0';
@@ -246,11 +252,12 @@
print_stamp(hdr->unix_last_modified_stamp);

if (!verbose)
- if ((mode & UNIX_FILE_SYMLINK) != UNIX_FILE_SYMLINK)
- printf(" %s", hdr->name);
+ if ((mode & UNIX_FILE_SYMLINK) != UNIX_FILE_SYMLINK) {
+ printf(" %s", tmpbuf);
+ }
else {
char buf[256], *b1, *b2;
- strncpy(buf, hdr->name, sizeof(buf));
+ strncpy(buf, tmpbuf, sizeof(buf)-1);
buf[sizeof(buf)-1] = 0;
b1 = strtok(buf, "|");
b2 = strtok(NULL, "|");
diff --recursive --unified --ignore-space-change lha-114i.orig/src/util.c lha-114i/src/util.c
--- lha-114i.orig/src/util.c Wed Oct 4 23:57:38 2000
+++ lha-114i/src/util.c Thu Apr 25 20:06:13 2002
@@ -160,7 +160,7 @@
/* found "-l??-" keyword (as METHOD type string) */
if (p[0] == '-' && p[1] == 'l' && p[4] == '-') {
/* size and checksum validate check */
- if ( (p[I_HEADER_LEVEL-2] == 0 || p[I_HEADER_LEVEL-2] == 0)
+ if ( (p[I_HEADER_LEVEL-2] == 0 || p[I_HEADER_LEVEL-2] == 1)
&& p[I_HEADER_SIZE-2] > 20
&& p[I_HEADER_CHECKSUM-2] == calc_sum(p, p[-2])) {
fseek(fp, ((p - 2) - buffer) - n, SEEK_CUR);
^^^^^^^^^^^^^^^ この行の直前で終わりです ^^^^^^^^^^^^^^^^^^^^^^^^^^

====================================================================
Tomio Arisaka (Rhapsody) <tomio-a@xxxxxxxxxxxxxxx>
Key fingerprint = 8A27 9324 C820 9813 BF7C E1D8 E8B7 67AD 8581 B018
====================================================================


--[PR]------------------------------------------------------------------
┏┏┏┏━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┳━┓┏┏┏
┏┏┏┃ア┃ウ┃ト┃レ┃ッ┃ト┃商┃品┃を┃激┃安┃仕┃入┃!┃┏┏┏
   ┗━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┻━┛
 ★売り切れ御免!毎日30〜70の新着商品! ≪小売店専門仕入サイト
 ☆毎日開催!0円スタートオークション! http://ad.freeml.com/cgi-bin/ad.cgi?id=cQHQp
------------------------------------------------------------------[PR]--
<GMO GROUP> Global Media Online www.gmo.jp