440 likes | 585 Views
This document provides an in-depth examination of the Android APK architecture, highlighting its structure as a Jar file filled with essential components like the Android Manifest, resource files, and classes.dex. We delve into the APK installation process, discussing normal and abnormal scenarios, as well as potential vulnerability points. The analysis covers the exploitation process, signing mechanisms (JarSigner), and compilation steps using tools like aapt, javac, and dx. Conclusively, the paper reviews similar approaches and offers critical insights into mitigating risks associated with Android APKs.
E N D
One Root To Own Them All Black Hat US 2013 Jeff Forristal @ Bluebox
Outline • Introduction • Android APK Overview • Jar and Jar Signer • Exploit Analyze • APK Install Process • Normal Case • Abnormal Case • Vulnerability Point • Patch • Similar Approach • Conclusion • Reference
Android APK • APK stands for Android application package file. • Just a Jar file with some other new files that Android need.
Android APK Content • Package resource files: • Android Manifest • Some Pictures, Audio files…. • Etc… • classes.dex • META-INF/Manifest.MF
Compile Android APK • What we usually do: • 1. writing code in Eclipse/ Android Studio • 2. press compile button • Simple and Easy
Compile Android APK • 1. aapt will create R.java according to the following files: • Android Manifest • Recourses • Assets • 2. use javac to compile source code with some libraries -> generate many *.class files. • 3. use dx to transform Java bytecode into Dalvikbytecode -> many *.class files will be merged into 1 classes.dex • 4. use apkbuilder to generate unsigned APK with following files: • classes.dex • Package Resources Files • 5. use jarsigner to signed the unsigned APKinto signed APK • E(unsigned APK, Key) = signed APK
Jar • Jar stands for Java Archive • Jar File Format is Same as Zip file • File Contents: • *.classes • Resources • META-INF/Manifest.MF
Jar Android APK
JarSigner • Generate Signature for JAR (Java Archive) • Verify Signature for Signed JAR file. • Two Additional file placed in META-INF directory: • signature file with .SF as extension • signature block file with .DSA extension
JarSigner - Signing jarsigner aapt
JarSigner - Signing Integrity
JarSigner - Signing Integrity
JarSigner - Signing Identity
JarSigner - Signing Identity
JarSigner - Signing Certificate
Public Key Digital Signature for the Certificate
PackageManager PackageParser Installer PackageHandler Parsing Package And Verify Sending Command to installd Handle Event
Overview • Parsing • Verify • Install
Parsing JarEntry.Class File 1 JarFile.Class File 2 File 3 File 4 Central Directory Android APK
Parsing JarEntry.Class File 1 JarFile.Class File 2 File 3 File 4 File 1 Meta-Data File 2 Meta-Data Central Directory File 3 Meta-Data File 4 Meta-Data End of Central Directory Android APK
Parsing, Verify and Install • 1. Get entries list from Central Directory. • 2. Create JarEntry object for each entry and put into mEntriesHashMap. • The index is calculate by : • secondHash(String entry name) • 4. JarVerifier will verify each entries according to the mEntries. • 5. After Verify, find classes.dex entry and install it.
Parsing, Verify and Install • 1. Get entries list from Central Directory. • 2. Create JarEntry object for each entry and put into mEntriesHashMap. • The index is calculate by : • secondHash(String entry name) • 4. JarVerifier will verify each entries according to the mEntries. • 5. After Verify, find classes.dex entry and install it.
Parsing, Verify and Install • 1. Get entries list from Central Directory. • 2. Create JarEntry object for each entry and put into mEntriesHashMap. • The index is calculate by : • secondHash(String entry name) • 4. JarVerifier will verify each entries according to the mEntries. • 5. After Verify, find classes.dex entry and install it.
Parsing, Verify and Install • 1. Get entries list from Central Directory. • 2. Create JarEntry object for each entry and put into mEntriesHashMap. • The index is calculate by : • secondHash(String entry name) • 4. JarVerifier will verify each entries according to the mEntries. • 5. After Verify, find classes.dex entry and install it.
Parsing …….. mEntries Manifest.xml Manifest.xml META-INF Classes.dex res ZipEntry object META-INF classes.dex res 1. Manifest.xml Meta-Data 2. META-INF Meta-Data Central Directory 3. classes.dex Meta-Data 4. res Meta-Data Android APK End of Central Directory
Verify …….. mEntries Manifest.xml META-INF Classes.dex res ZipEntry object
Install installd Manifest.xml META-INF classes.dex res 1. Manifest.xml Meta-Data 2. META-INF Meta-Data Central Directory 3. classes.dex Meta-Data 4. res Meta-Data Android APK End of Central Directory
What If … Manifest.xml classes.dex Manifest.xml META-INF META-INF classes.dex classes.dex res res Central Directory Central Directory Android APK
Parsing …….. mEntries Manifest.xml classes.dex META-INF Manifest.xml META-INF Classes.dex res Classes.dex ZipEntry object classes.dex res 1. Manifest.xml Meta-Data Central Directory 2. META-INF Meta-Data 3. classes.dex Meta-Data 4. classes.dex Meta-Data 5. res Meta-Data End of Central Directory
Verify …….. mEntries Manifest.xml META-INF Classes.dex res Classes.dex ZipEntry object !!!!!!
Install installd Manifest.xml classes.dex META-INF classes.dex !!!!!! res 1. Manifest.xml Meta-Data Central Directory 2. META-INF Meta-Data 3. classes.dex Meta-Data 4. classes.dex Meta-Data 5. res Meta-Data End of Central Directory