vuln.sg  

vuln.sg Vulnerability Research Advisory

Lhaz におけるバッファオーバーフローの脆弱性

by Tan Chew Keong タン チュー ケオン
Release Date: 2006-08-06

   [en] [jp]

概要

Lhaz にバッファオーバーフローの脆弱性があります。悪意のある人は、この脆弱性を利用しLhaz ユーザのシステムに、任意のコードを実行ことがで きます。


問題を確認したバージョン

Lhaz version 1.31


問題

Lhaz にバッファオーバーフローの脆弱性があります。それが、巧妙に細工された LZH ファイルを解凍するとき、バッファオーバーフローが発生します。悪意のある 攻撃者は、この問題を利用し Lhaz を実行するユーザの権限で任意のコードを実行できる可能性があります。

Lhaz が、異常に長いファイル名のファイルを含む LZH ファイルを解凍するとき、バッファオーバーフローは発生し ま す。

この脆弱性は、「LHa for UNIX version 1.14d」 のコードにあります。「LHa for UNIX version 1.14d」 の脆弱性は、前に Ulf Harnhammarさん と Lukasz Wojtowさん が CVE-2004-0234CVE-2004-0769  で 公開しました。


バッファオーバーフローの脆弱性が Lhaz.exe の以下の似ているの function にあります。

// Possible modified version of extract_one() function.

sub_41D940(arg_0, arg_4, arg_8, arg_c)
{
DWORD var1;
time_t utimebuf[2];
struct stat stbuf;
char overflowedBuffer[MAX_PATH]; // 260-bytes
char loadStringBuf[0x20]; // 32-bytes
char textBuffer[0x100]; // 256-bytes

if(someFlag && strrstr(compressedFilename, '/'))
{
// Buffer Overflow when compressedFilename > 260-bytes. (including NULL)
// 552 bytes is required to overwrite saved EIP.

// LZHファイルに、異常長いファイル名であるとき、
// バッファオーバーフローが発生します。

strcpy(overflowedBuffer, strrstr(compressedFilename, "/') + 1);
}
else
{
// Buffer Overflow when compressedFilename > 260-bytes. (including NULL)
// 552 bytes is required to overwrite saved EIP.

// LZHファイルに、異常長いファイル名であるとき、
// バッファオーバーフローが発生します。

strcpy(overflowedBuffer, compressedFilename);
sub_529A70(overflowedBuffer, '/');
}

...
...
...
...
...
if (... && calculatedFileCRC != fileCRC)
{
LoadStringA(hInstance, 0x2A, &stbuf, 32);
LoadStringA(hInstance, 0x76, loadStringBuf, 32);

// This code may be Lhaz specific, and is executed only when the compressed file can be
// extracted, but the CRC do not match.
// Note: The name of the compressed file must not be too long such that it can't be
// created.

// Buffer overflow occurs due to unsafe use of sprintf() to construct the
// "File ...compressFileName.... is damaged" error message.

// 「ファイル ...compressFileName.... が壊れています。」のエラーメッセージをつくるのとき、
// バッファオーバーフローが発生します。

sprintf(textBuffer, "%s %s %s", &stbuf, overflowedBuffer, loadStringBuf);
MessageBox(hWnd, textBuffer, NULL, MB_OKCANCEL | MB_ICONEXCLAMATION | MB_APPLMODAL);
}

...
...
}

The following screen capture shows the saved EIP being overwritten by the "sprintf()" overflow.

 


脆弱性のテストファイル

これは脆弱性のテストのためにファイルです。この LZH ファイルは、バッファオーバーフローを利用し calc.exe を実行します。このLZHファイルは、英語版のWindows XP SP2 か 日本語版のWindows 2000 SP4 が必要です。

  • lhazEXP.lzh (strcpy() バッファオーバーフローを利用し、calc.exe を実行します)
  • lhazCRASH.lzh (sprintf() バッファオーバーフローを利用し、Lhaz.exe を異常終了します)
  • lhazEXP2.lzh (sprintf() バッファオーバーフローを利用し、日本語版のWin2K SP4で、calc.exe を実行します)

Instructions:

  1. 「c:\test」 ディレクトリに、この LZH ファイルを保存してください。
  2. Lhaz を実行してください。
  3. Lhaz でLZH ファイルをオープンしてください。
  4. Lhaz に 「このフォルダに解凍」 をクリックしてください。
  5. Successful exploit will run calculator (calc.exe). Failed exploit will crash Lhaz.

 


対策

Version 1.32 へのバージョンアップをしてください。修正版のダウンロード


発見と報告の経緯

2006年08月02日 - 脆弱性の発見。
2006年08月03日 - ベンダに報告しました。
2006年08月06日 - ベンダは修正版をリリースしました。
2006年08月06日 - 本脆弱性の公開。


Contact
For further enquries, comments, suggestions or bug reports, simply email them to