141 deview 2013 발표자료(박준형) v1.1(track4-session1)

34
Android Bionic Linker 구조 분석 및 보안 활용 방안 고찰 박준형 매니저 / 모바일소프트웨어개발1팀 SK Planet

Upload: naver-d2

Post on 28-Jun-2015

1.848 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

Android Bionic Linker 구조 분석 및 보안 활용 방안 고찰

박준형 매니저 / 모바일소프트웨어개발1팀 SK Planet

Page 2: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1. ARM 개요

Page 3: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.1 ARM 이란?

ARM(Application DRM) 이란?

T store 를 통해 유통되는 어플리케이션에 대해서 불법 복제 및 변조가 불가능 하게 하

는 T store 만의 전용 Application DRM(Digital Rights Management) 솔루션.

ARM 동작 방식.

-  ARM 이 적용된 Application 을 구매한 사용자가 Application 실행 시,

-  T store 에서 해당 어플리케이션을 구매하였는지, 적절한 사용 권한을 가지고 있는

지를 확인한 다음, 암호화된 코드(APK) 를 해제하여 실행함.

-  불법 유통된 Application 이나 권한을 부여 받지 못한 사용자는 해당 Application

을 실행할 수 없음.

Page 4: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.1 ARM 3.0

손쉬운 적용 방법

더 이상 여러 명이 고생할 필요 없습니다 ! ARM 3.0은 별도의 소스 코드 수정 없이도 개발자센터를 통해서 간단하게 향상된 보안 모듈을 적용할 수 있도록 적용 과정을 혁신적으로 개선되었습니다.

강력한 보안

코드 보안이 강력해졌습니다. ARM 3.0이 적용된 APK(SS-APK)가 실행되면 해당 단말에 설치되어 있는 ARM Client Service 모듈과 연동을 통해서 사용자의 어플리케이션 실행 권한 여부를 체크하고, 적합한 권한을 보유한 경우에만 어플리케이션의 실행을 허가, 실행 가능하도록 암호화된 코드의 복호화를 수행합니다.

빠른 적용 시간

1분이면 뚝딱! ARM 적용을 시작하는 시점에 바로 Application 내 코드 암호화가 이루어지며, ARM 모듈이 자동으로 탑재됩니다. 1분이면 최고 수준의 보안이 이뤄집니다.

Page 5: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

2. Bionic Libc

Page 6: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.3 GNU Libc vs. Bionic Libc ?

GNU Libc 와 Bionic Libc 비교

GNU Libc Bionic Libc 비고

License LGPL BSD

Size Large Small

Speed Slow Fast (Low CPU Clock)

Dynamic Linker /lib/i386-linux-gnu/ld-linux.so.2 /system/bin/linker

libdl /lib/i386-linux-gnu/libdl-so.2 /system/bin/linker libdl.so is

dummy.

_start() __libc_start_main() __libc_init() crtbegin_xx.o

1) libdl.so is implemented in /bionic/linker/dlfcn.c

Page 7: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.4 Android Native App. 실행 과정

Bionic

Kernel

./helloWorld Dynamic Linker

execve()

SYS_execve SYS_exit

__libc_init()

exit()

main() (helloWorld)

Check & Load Binary

Shell

dlopen()

Start Loader (interpreter)

_start()

__linker_init()

link_image()

__linker_init_post_relocation()

참조: http://blog.csdn.net/freshui/article/details/8695463

Page 8: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

3. ELF(Executable & Linable Format)

Page 9: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.5 ELF File Format 구조

참조: http://en.wikipedia.org/wiki/Elf_format

.text Executable Code (RO)

.rodata Program String Values (RO)

.data Initialized Global Arrays and Variables (RW)

Page 10: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.5 ELF File Format 구조 – ELF Header

ELF Header: readelf –h func.so

Page 11: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.5 ELF File Format 구조 –Program Header (PHDR)

Program Header(PHER): readelf –l func.so

Page 12: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.5 ELF File Format 구조 – Section Header

Section Header: readelf –S func.so

Page 13: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

4. Dynamic Linker & Loader

Page 14: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.6 Dynamic Linker 동작 –Find Library

1.  Dynamic Library 검색(find_library) •  struct soinfo linked list 에서 library 가 있는지 검색.

lib #1

lib #2

lib #n

.base

.name: lib1

.next

.base

.name: lib2

.next

.base

.name: libn

.next

soinfo #1

soinfo #2

soinfo #n

참조: AOSP 4.1 /biolic/linker 소스코드

Page 15: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.6 Dynamic Linker 동작 – Load Library

2. Dynamic Library 메모리 로딩 (load_library)

1.  open_library: library 파일을 open 하여 file descripter(fd) 반환.

2.  get_lib_extents: library 의 PHDR 에서 할당해야 할 사이즈 반환.

3.  alloc_mem_region: mmap 을 이용하여 메모리 할당(base address).

4.  load_segments: mmap 을 이용하여 library 의 fd 의 내용을 메모리에 적재.

flag 값을 이용하여 mprotect 수행. tmp = base + (phdr->p_vaddr & (~PAGE_MASK)); len = phdr->p_filesz + (phdr->p_vaddr & PAGE_MASK); pbase = mmap((void *)tmp, len,

PFLAGS_TO_PROT(phdr->p_flags), MAP_PRIVATE | MAP_FIXED, fd, phdr->p_offset & (~PAGE_MASK));

Page 16: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.6 Dynamic Linker 동작 – Load Library

Program Header(PHER): readelf –l func.so

Page 17: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.6 Dynamic Linker 동작 – Load Library

BSS(Block Started by Symbol)

-  Non-initialized Global arrays and variables.

-  Statically-allocated variables.

-  ZI(Zero Initialized) Section.

-  BSS is called like ‘Better Save Space’.

Page 18: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.6 Dynamic Linker 동작 – Load Library

base

base+VirtualAddr

Page 0

FileSize

MemSize extrabase

Extra_len

Page 1

Page n

Page n+1

.bss section (Fill with 0)

참조: /bionic/linker/linker.c

.bss section 이 있을 경우 extra memory 할당.

Page 19: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.6 Dynamic Linker 동작 – Link Image

3. Dynamic Library Relocation (link_image)

1.  dynamic section 에서 유용한 정보 추출해서 soinfo 에 저장.

2.  DT_NEEDED 정보에서 해당 library 검색/로드 (soinfo linked list 에 add).

3.  reloc_library: rel.dyn, rel.plt 정보를 사용하여 참조 재배치(relocation).

.got Support for PIC (Global Offset Table) ex) CFLAGS = –fpic or –fPIC

.plt Support for Dynamic Linking (Procedure Linkage Table)

Page 20: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.6 Dynamic Linker 동작 – Link Image

Dynamic Section: readelf –d func.so

Page 21: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.6 Dynamic Linker 동작 – Link Image

Relocation Section: readelf –r func.so

-  R_ARM_RELATIVE : *(base + offset) += base

-  R_ARM_JUMP_SLOT: _do_lookup(soinfo linked list 에서 Symbol Addr 할당)

Page 22: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.6 Dynamic Linker 동작 – Call Constructors

4. Dynamic Library Constructors 호출(call_constructors_recursive)

1.  Library initialzation : call the init_array.

ex) __attribute__((constructor)) static void initialize(void) { } __attribute__((destructor)) static void finalize(void) { }

Page 23: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.6 Dynamic Linker 동작 – Lookup Symbol

5. Dynamic Library 에서 Symbol 검색 (_do_lookup)

Lookup Symbol in soinfo linked list with .hash section.

-  hash = elfhash(name)

-  sym = _elf_lookup(si, hash, name);

참조: http://lwn.net/Articles/192624/

Page 24: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

5. Android Native Code 보안

Page 25: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

-  Android Bionic Libc 를 지원하도록 코드 수정.

-  p_lx_elf.cpp :

1.7 Native Binary 보안 활용 방안 - 1

UPX: Packer (Self Modifying Code)

-  Android Dynamic Shared Library 에는 적용이 안됨.

-  Detailed Changed Log (http://upx.sourceforge.net/upx-news.txt) -  Compress shared library on ELF i386 only [ld.so threatens even this case].

Page 26: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.7 Native Library 보안 활용 방안 - 1

Secure Dynamic Linker

1.  Custom Dynamic Linker

1.  LDFLAGS = nostdlib -Wl,--dynamic-linker,"/system/bin/linker”

2.  Encrypted Library 를 Dynamic Linker 에서 Decrypt & Loading.

1.  암호화 해제 후 link & load 수행.

Page 27: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.7 Native Library 보안 활용 방안 - 2

Secure Loading Library (instead of libdl)

1.  dlopen 을 대신할 secure dynamic linking library.

2.  Encrypted Library 를 dlopen 에서 Decrypt & Loading.

1.  암호화 해제 후 link & load 수행.

Page 28: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.7 mmap 을 이용한 코드 실행 – 1

-  NDK Standalone Toolchain 만들기 -  $(NDK_ROOT)/build/tools/make-standalone-toolchain.sh

-  Disassmble: arm-linux-androideabi-objdump –d add.o

-  Compile: arm-linux-androideabi-gcc –c –o add.o add.c

Page 29: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.7 mmap 을 이용한 코드 실행 – 2

-  .text 섹션에서 add function code 추출.

Page 30: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.7 mmap 을 이용한 코드 실행 – 3

-  mmap & mprotect 사용.

Page 31: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.7 mmap 을 이용한 코드 실행 – 4

-  Build Executable: arm-linux-androideabi-gcc –o test main.c -  Android Emulator 실행

-  android avd

-  테스트 코드 실행

-  adb push test /data/ -  adb shell chmod 777 /data/test -  adb shell /data/test

Page 32: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

1.8 Other Applications ?

1.  JIT(Just In-Time) Compiler Runtime

- Dynamic linking & loading the JIT compiled native binary.

- RenderScript Runtime 에 Dynamic Linker 기법이 사용되고 있음.

Page 33: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

Q&A

Page 34: 141 deview 2013 발표자료(박준형) v1.1(track4-session1)

THANK YOU