vuln.sg  

vuln.sg Vulnerability Research Advisory

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

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

   [en] [jp]

概要

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


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

Lhaplus version 1.52


問題

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

Lhaplus は、LZHファイルから 「Extended Header Size」を読みました。しかし、「Extended Header Size」チェックしないで、256バイトのバッファへ「Extended Header Data」を読みました。 悪意のあるLZH ファイルに「Extended Header Size」 > 256 のとき、バッファオーバーフローが発生します。


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


sub_4B64C8()
{
...
...
struct HEADER *lzhHeader;
char *buffer;
char extendedHeaderType;
..
..
..
if(lzhHeader->headerLevel == 0)
{
...
}
else if(lzhHeader->headerLevel == 1)
{
...
}
else if(lzhHeader->headerLevel == 2)
{
readData(handle, 2, &(lzhHeader->fileCRC));
readData(handle, 1, &(lzhHeader->OSID));
...
}
else
{
...
}

if(lzhHeader->headerLevel == 1 || lzhHeader->headerLevel == 2)
{
buffer = allocateMem(0x100); // 256 bytes

// Extended header reading loop
while(true)
{
// Read Extended Header Size from LZH file
// LZHファイルから 「Extended Header Size」を読みます。
bytesread = readData(handle, 2, &(lzhHeader->extendedHeaderSize));

if(lzhHeader->extendedHeaderSize == 0 || bytesread == 0)
break;

readData(handle, 1, &extendedHeaderType);
if(bytesread == 0)
break;

clearMemory(buffer, 0x100);

// NOTE: "lzhHeader->extendedHeaderSize" is read from the LZH file
// and not sanitised.

// This causes a heap-based buffer overflow if the value of the extended
// header size is > 0x100.

// 「Extended Header Size」 > 256 のとき、バッファオーバーフローが発生します。

// Potential integer underflow can also occur due to the subtraction of 3
// from the extended header size value.

// 「Extended Header Size」 < 3 のとき、integer underflow が発生します。

// i.e Must check lzhHeader->extendedHeaderSize > 3 and <= 0x100

bytesread = readData(handle, lzhHeader->extendedHeaderSize - 3, buffer);
...
if(extendedHeaderType == 1)
{
...
}
else if(extendedHeaderType == 2)
{
...
}
}
}
...
}

By overwriting saved pointers on the heap using the buffer overflow, it is possible to execute arbitrary code.

 


脆弱性のテストファイル

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

Note: Due to the nature of the heap-based buffer overflow. Successful exploit is dependent on the current heap allocation. On certain systems, failed exploit may not crash the software or show any symptom.

  • lhaplusEXP.lzh (バッファオーバーフローを利用し、日本語版のWindows 2000 SP4で calc.exe を実行します)

Instructions:

  1. 「c:\test」 ディレクトリにこの LZH ファイルを保存してください。
  2. Explorer で 「c:\test」 ディレクトリをオペンします。
  3. LZH ファイルをダブルクリックしてください。
  4. Successful exploit will run calculator (calc.exe). Failed exploit will crash Lhaplus.
 


対策

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


発見と報告の経緯

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


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