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

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



Tomio Arisakaです。

私は、Windowsからlzhファイルを持って来る事があるので、LHaは重宝しています。

ところが、今月初旬「LHa-1.14i」にSecurity-holeが存在することが発表されました。
>> LHa has two stack-based buffer overflows and two directory traversal problems.
<http://www.st.ryukoku.ac.jp/~kjm/security/ml-archive/full-disclosure/ 2004.05/msg00057.html>

この問題に対処する為のパッチは「FreeBSD ports archivers lha」で入手できます。
<http://www.freebsd.org/cgi/cvsweb.cgi/ports/archivers/lha/>
このページの下部にあるリンク[Download this directory in tarball]からパッチ
ファイル「lha.tar.gz」をダウンロードします。
これを展開してパッチファイル「patch-traversal」と「patch-symlink」を入手します。
(上記欠陥の他にsymlinkに関する欠陥がありました)
(1) patch-symlink
- Security Fix: symlink vulnerability
patch from: <ftp://updates.redhat.com/9/en/os/SRPMS/lha-1.14i-9.1.src.rpm>
(2) patch-traversal
- Security Fix: two stack buffer overflows and two directory traversal flaws
patch from: Ulf Harnhammar <http://lists.netsys.com/pipermail/full-disclosure/2004-May/ 020776.html> CAN-2004-0234 CAN-2004-0235


以下、私が行ったLHaへのパッチ作業手順です。
まず、両方とも元のLHa-1.14iからの差分パッチで、かつ、「lhext.c」からの差分を
含むため、手作業で結合しました。「patch-symlink」を「patch-traversal」に挿入
しました。そして、出来上がったファイル名を「patch-traversal-symlink.diff」と
しました。(文末に添付しますが、信用できない方はご自分で行って下さい)(笑)
加えて、昔、SHIROYAMAさんから教えて頂いた日本語化パッチ情報(下記URL参照)も
使用しました。
<http://www.e-e.to/~kki/diary/?20020426#26-2>
(この日本語化パッチは、前述のSecurityパッチとはバッティングしません)

[G3:~] mio% curl -O http://www2m.biglobe.ne.jp/~dolphin/lha/prog/lha-114i.tar.gz
[G3:~] mio% curl -O http://www.e-e.to/~kki/MacOSX/lha-114i-macosx-20020426.diff
[G3:~] mio% gnutar -xzf ./lha-114i.tar.gz
[G3:~] mio% pushd ./lha-114i/
[G3:~/lha-114i] mio% patch -p0 < ../patch-traversal-symlink.diff
[G3:~/lha-114i] mio% patch -p1 < ../lha-114i-macosx-20020426.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ファイルのインストールは失敗
   しますが、私は不要なので無視しています)

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



「patch-traversal-symlink.diff」
vvvvvvvvvvvvvvv この行の次から始まります vvvvvvvvvvvvvvvvvvvvvvvvvv
--- src/header.c.old 2000-10-05 19:36:03.000000000 +0200
+++ src/header.c 2004-04-17 23:55:54.000000000 +0200
@@ -538,6 +538,10 @@
/*
* filename
*/
+ if (header_size >= 256) {
+ fprintf(stderr, "Possible buffer overflow hack attack, type #1¥n");
+ exit(109);
+ }
for (i = 0; i < header_size - 3; i++)
hdr->name[i] = (char) get_byte();
hdr->name[header_size - 3] = '¥0';
@@ -547,6 +551,10 @@
/*
* directory
*/
+ if (header_size >= FILENAME_LENGTH) {
+ fprintf(stderr, "Possible buffer overflow hack attack, type #2¥n");
+ exit(110);
+ }
for (i = 0; i < header_size - 3; i++)
dirname[i] = (char) get_byte();
dirname[header_size - 3] = '¥0';
--- src/lhext.c.old 2000-10-04 16:57:38.000000000 +0200
+++ src/lhext.c 2004-04-18 01:27:44.000000000 +0200
@@ -190,8 +190,13 @@
q = (char *) rindex(hdr->name, '/') + 1;
}
else {
+ if (is_directory_traversal(q)) {
+ fprintf(stderr, "Possible directory traversal hack attempt in %s¥n", q);
+ exit(111);
+ }
+
if (*q == '/') {
- q++;
+ while (*q == '/') { q++; }
/*
* if OSK then strip device name
*/
@@ -351,6 +351,7 @@ extract_one(afp, hdr)
}

unlink(bb1);
+ make_parent_path(bb1);
l_code = symlink(bb2, bb1);
if (l_code < 0) {
if (quiet != TRUE)
@@ -419,6 +424,33 @@
return;
}

+int
+is_directory_traversal(char *string)
+{
+ unsigned int type = 0; /* 0 = new, 1 = only dots, 2 = other chars than dots */
+ char *temp;
+
+ temp = string;
+
+ while (*temp != 0) {
+ if (temp[0] == '/') {
+ if (type == 1) { return 1; }
+ type = 0;
+ temp++;
+ continue;
+ }
+
+ if ((temp[0] == '.') && (type < 2))
+ type = 1;
+ if (temp[0] != '.')
+ type = 2;
+
+ temp++;
+ } /* while */
+
+ return (type == 1);
+}
+
/* Local Variables: */
/* mode:c */
/* tab-width:4 */
^^^^^^^^^^^^^^^ この行の直前で終わりです ^^^^^^^^^^^^^^^^^^^^^^^^^^
====================================================================
Tomio Arisaka (Rhapsody) <tomio-a@xxxxxxxxxxxxxxx>
Key fingerprint = 8A27 9324 C820 9813 BF7C E1D8 E8B7 67AD 8581 B018
====================================================================