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

Post on 28-Jun-2015

1.848 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

1. ARM 개요

1.1 ARM 이란?

ARM(Application DRM) 이란?

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

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

ARM 동작 방식.

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

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

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

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

을 실행할 수 없음.

1.1 ARM 3.0

손쉬운 적용 방법

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

강력한 보안

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

빠른 적용 시간

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

2. Bionic Libc

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

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

3. ELF(Executable & Linable Format)

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)

1.5 ELF File Format 구조 – ELF Header

ELF Header: readelf –h func.so

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

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

1.5 ELF File Format 구조 – Section Header

Section Header: readelf –S func.so

4. Dynamic Linker & Loader

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 소스코드

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));

1.6 Dynamic Linker 동작 – Load Library

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

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’.

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 할당.

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)

1.6 Dynamic Linker 동작 – Link Image

Dynamic Section: readelf –d func.so

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 할당)

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) { }

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/

5. Android Native Code 보안

-  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].

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 수행.

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 수행.

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

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

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

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

-  mmap & mprotect 사용.

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

1.8 Other Applications ?

1.  JIT(Just In-Time) Compiler Runtime

- Dynamic linking & loading the JIT compiled native binary.

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

Q&A

THANK YOU

top related