[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[harden-mac:0632] Re: First Mac OS X Trojan Horse
- To: harden-mac@xxxxxxxxxx
- Subject: [harden-mac:0632] Re: First Mac OS X Trojan Horse
- From: SHIROYAMA Takayuki <puresnow@xxxxxxx>
- Date: Fri, 9 Apr 2004 13:12:39 +0900
しろやまです。
> コンセプトファイルでは、MP3のID3タグの中に、
> Joy!peffpwpc
> で始まる一連のコードが存在していました。
要するに LaunchCFMApp が本来 PEF(CFM)バイナリでないものを
実行できてしまうというのが問題なのではないでしょうか?
っというわけで、ちょっと実験してみました。
1. 添付のソースをコンパイルし、LaunchCFMApp という名前の実行バイナリを作る
2. cd /System/Library/Frameworks/Carbon.framework/Versions/A/Support
3. sudo mv LaunchCFMApp LaunchCFMApp.orig
4. sudo cp ~/LaunchCFMApp ./LaunchCFMApp
この作業を行う事で、少なくともコンセプトファイルをダブルクリックしてもアプリケー
ションは実行されない事を確認しました。
ソースの方は見れば自明ですが、「LaunchCFMApp に渡されたバイナリの頭をちょ
っと読んで、「Joy!peffpwpc」があるかを確認しています。
file コマンドの magic を見る限りは、0バイト目からこのシグネチャがあるのがPEF
バイナリの条件のため、この識別方法は問題ないと考えております。
(何故Cで書いたかですが、どうも LaunchCFMApp はどこかで自身の実行ファイル
のパスをチェックしているらしく、argv[0]にはその名前が入ってないといけない模
様だからです。execv 相当の事ができるなら、スクリプト言語を使っても問題ない
でしょう。)
昼休みでちょこっとためしただけなので、不正な場合は何も起こりません。ただ、これ
もちょっと凝ればアラートパネルを出すぐらいはすぐにできるでしょう。
---
SHIROYAMA Takayuki
/*
* ese-LaunchCFMApps : SHIROYAMA Takayuki :<puresnow@xxxxxxx>
* Fri Apr 9 13:11:58 JST 2004
*
*/
#include <stdio.h>
#include <fcntl.h>
#include <strings.h>
#define LAUNCHCFMAPPSPATH "/System/Library/Frameworks/Carbon.framework/Versions/A/Support/LaunchCFMApp.orig"
#define PEF_SIGNATURE "Joy!peffpwpc"
int main( int argc, char *argv[] )
{
int fh, ret;
char buf[ sizeof( PEF_SIGNATURE ) + 2 ];
if( argc < 2 ) exit( 9 );
fh = open( argv[1], O_RDONLY );
if( fh < 0 ) perror( "eseLaunchCFMApps" );
ret = read( fh, buf, sizeof( PEF_SIGNATURE ) );
close( fh );
if( ret < sizeof( PEF_SIGNATURE ) ) exit ( 8 );
if( ! strncmp( PEF_SIGNATURE, buf, sizeof( PEF_SIGNATURE ) ) )
{
execv( LAUNCHCFMAPPSPATH, argv );
}
exit(7);
}