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분이면 최고 수준의 보안이 이뤄집니다.
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
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
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)
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 할당)
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/
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 기법이 사용되고 있음.