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

[harden-mac:0632] Re: First Mac OS X Trojan Horse




しろやまです。 > コンセプトファイルでは、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);
}