Your SlideShare is downloading. ×
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
141 deview 2013 발표자료(박준형) v1.1(track4-session1)
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

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

1,761

Published on

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,761
On Slideshare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
72
Comments
0
Likes
3
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Android Bionic Linker 구조 분석 및 보안 활용 방안 고찰 박준형 매니저 / 모바일소프트웨어개발1팀 SK Planet
  • 2. 1. ARM 개요
  • 3. 1.1 ARM 이란? ARM(Application DRM) 이란? T store 를 통해 유통되는 어플리케이션에 대해서 불법 복제 및 변조가 불가능 하게 하 는 T store 만의 전용 Application DRM(Digital Rights Management) 솔루션. ARM 동작 방식. -  ARM 이 적용된 Application 을 구매한 사용자가 Application 실행 시, -  T store 에서 해당 어플리케이션을 구매하였는지, 적절한 사용 권한을 가지고 있는 지를 확인한 다음, 암호화된 코드(APK) 를 해제하여 실행함. -  불법 유통된 Application 이나 권한을 부여 받지 못한 사용자는 해당 Application 을 실행할 수 없음.
  • 4. 1.1 ARM 3.0 손쉬운 적용 방법 더 이상 여러 명이 고생할 필요 없습니다 ! ARM 3.0은 별도의 소스 코드 수정 없이도 개발자센터를 통해서 간단하게 향상 된 보안 모듈을 적용할 수 있도록 적용 과정을 혁신적으로 개선되었습니다. 강력한 보안 코드 보안이 강력해졌습니다. ARM 3.0이 적용된 APK(SS-APK)가 실행되면 해당 단말에 설치되어 있는 ARM Client Service 모듈과 연동을 통해서 사용자의 어플리케이션 실행 권 한 여부를 체크하고, 적합한 권한을 보유한 경우에만 어플리케이션의 실행을 허가, 실행 가능하도록 암호화된 코드의 복호화를 수행합니다. 빠른 적용 시간 1분이면 뚝딱! ARM 적용을 시작하는 시점에 바로 Application 내 코드 암호화가 이루어 지며, ARM 모듈이 자동으로 탑재됩니다. 1분이면 최고 수준의 보안이 이뤄집니다.
  • 5. 2. Bionic Libc
  • 6. 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
  • 7. 1.4 Android Native App. 실행 과정 _start() Shell __linker_init() ./helloWorld Dynamic Linker link_image() __linker_init_post_ relocation() Bionic execve() __libc_init() exit() SYS_execve Kernel SYS_exit Check & Load Binary main() (helloWorld) Start Loader (interpreter) dlopen() 참조: http://blog.csdn.net/freshui/article/details/8695463
  • 8. 3. ELF(Executable & Linable Format)
  • 9. 1.5 ELF File Format 구조 .text .rodata Program String Values (RO) .data 참조: http://en.wikipedia.org/wiki/Elf_format Executable Code (RO) Initialized Global Arrays and V ariables (RW)
  • 10. 1.5 ELF File Format 구조 – ELF Header ELF Header: readelf –h func.so
  • 11. 1.5 ELF File Format 구조 –Program Header (PHDR) Program Header(PHER): readelf –l func.so
  • 12. 1.5 ELF File Format 구조 – Section Header Section Header: readelf –S func.so
  • 13. 4. Dynamic Linker & Loader
  • 14. 1.6 Dynamic Linker 동작 –Find Library 1.  Dynamic Library 검색(find_library) •  struct soinfo linked list 에서 library 가 있는지 검색. .base soinfo #1 .name: lib1 .next lib #1 .base soinfo #2 .name: lib2 .next lib #2 .base soinfo #n .name: libn .next lib #n 참조: AOSP 4.1 /biolic/linker 소스코드
  • 15. 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));
  • 16. 1.6 Dynamic Linker 동작 – Load Library Program Header(PHER): readelf –l func.so
  • 17. 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’.
  • 18. 1.6 Dynamic Linker 동작 – Load Library .bss section 이 있을 경우 extra memory 할당. base Page 0 base+VirtualAddr FileSize extrabase .bss section (Fill with 0) Page 1 MemSize Extra_len Page n Page n+1 참조: /bionic/linker/linker.c
  • 19. 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). Support for PIC (Global Offset Table) .got ex) CFLAGS = –fpic or –fPIC .plt Support for Dynamic Linking (Procedure Linkage Table)
  • 20. 1.6 Dynamic Linker 동작 – Link Image Dynamic Section: readelf –d func.so
  • 21. 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 할당)
  • 22. 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) { }
  • 23. 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/
  • 24. 5. Android Native Code 보안
  • 25. 1.7 Native Binary 보안 활용 방안 - 1 UPX: Packer (Self Modifying Code) -  Android Bionic Libc 를 지원하도록 코드 수정. -  p_lx_elf.cpp : -  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].
  • 26. 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 수행.
  • 27. 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 수행.
  • 28. 1.7 mmap 을 이용한 코드 실행 – 1 -  NDK Standalone Toolchain 만들기 -  $(NDK_ROOT)/build/tools/make-standalone-toolchain.sh -  Compile: arm-linux-androideabi-gcc –c –o add.o add.c -  Disassmble: arm-linux-androideabi-objdump –d add.o
  • 29. 1.7 mmap 을 이용한 코드 실행 – 2 -  .text 섹션에서 add function code 추출.
  • 30. 1.7 mmap 을 이용한 코드 실행 – 3 -  mmap & mprotect 사용.
  • 31. 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
  • 32. 1.8 Other Applications ? 1.  JIT(Just In-Time) Compiler Runtime - Dynamic linking & loading the JIT compiled native binary. - RenderScript Runtime 에 Dynamic Linker 기법이 사용되고 있음.
  • 33. Q&A
  • 34. THANK YOU

×