Android Applications Basics
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.
Android Security Model
λ κ°μ λ μ΄μ΄κ° μμ΅λλ€:
- OS, μ€μΉλ μ ν리μΌμ΄μ μ μλ‘ κ²©λ¦¬ν©λλ€.
- μ ν리μΌμ΄μ μ체, κ°λ°μκ° νΉμ κΈ°λ₯μ λ ΈμΆνκ³ μ ν리μΌμ΄μ κΈ°λ₯μ ꡬμ±ν μ μκ² ν©λλ€.
UID Separation
κ° μ ν리μΌμ΄μ μ νΉμ μ¬μ©μ IDκ° ν λΉλ©λλ€. μ΄λ μ± μ€μΉ μ€μ μ΄λ£¨μ΄μ§λ©°, μ±μ μμ μ μ¬μ©μ IDκ° μμ ν νμΌμ΄λ 곡μ λ νμΌκ³Όλ§ μνΈμμ©ν μ μμ΅λλ€. λ°λΌμ μ± μ체, OSμ νΉμ κ΅¬μ± μμ λ° λ£¨νΈ μ¬μ©μλ§ μ± λ°μ΄ν°λ₯Ό μ κ·Όν μ μμ΅λλ€.
UID Sharing
λ κ°μ μ ν리μΌμ΄μ
μ΄ λμΌν UIDλ₯Ό μ¬μ©νλλ‘ κ΅¬μ±λ μ μμ΅λλ€. μ΄λ μ 보λ₯Ό 곡μ νλ λ° μ μ©ν μ μμ§λ§, κ·Έ μ€ νλκ° μμλλ©΄ λ μ ν리μΌμ΄μ
μ λ°μ΄ν°κ° λͺ¨λ μμλ μ μμ΅λλ€. κ·Έλμ μ΄λ¬ν νλμ κΆμ₯λμ§ μμ΅λλ€.
λμΌν UIDλ₯Ό 곡μ νλ €λ©΄, μ ν리μΌμ΄μ
μ λ§€λνμ€νΈμμ λμΌν android:sharedUserId κ°μ μ μν΄μΌ ν©λλ€.
Sandboxing
Android μ ν리μΌμ΄μ
μλλ°μ€λ κ° μ ν리μΌμ΄μ
μ λ³λμ μ¬μ©μ IDλ‘ λ³λμ νλ‘μΈμ€λ‘ μ€νν μ μκ² ν©λλ€. κ° νλ‘μΈμ€λ μ체 κ°μ λ¨Έμ μ κ°μ§κ³ μμ΄, μ±μ μ½λλ λ€λ₯Έ μ±κ³Ό 격리λμ΄ μ€νλ©λλ€.
Android 5.0(L)λΆν° SELinuxκ° μ μ©λ©λλ€. κΈ°λ³Έμ μΌλ‘ SELinuxλ λͺ¨λ νλ‘μΈμ€ μνΈμμ©μ κ±°λΆνκ³ , κ·Έλ€ κ°μ μμλλ μνΈμμ©λ§ νμ©νλ μ μ±
μ μμ±ν©λλ€.
Permissions
μ ν리μΌμ΄μ
μ μ€μΉν λ κΆνμ μμ²νλ κ²½μ°, μ±μ AndroidManifest.xml νμΌμ uses-permission μμμ ꡬμ±λ κΆνμ μμ²νλ κ²μ
λλ€. uses-permission μμλ name μμ± λ΄μμ μμ²λ κΆνμ μ΄λ¦μ λνλ
λλ€. λν maxSdkVersion μμ±μ΄ μμ΄, μ§μ λ λ²μ λ³΄λ€ λμ λ²μ μμλ κΆν μμ²μ μ€λ¨ν©λλ€.
μλλ‘μ΄λ μ ν리μΌμ΄μ
μ μ²μμ λͺ¨λ κΆνμ μμ²ν νμλ μμΌλ©°, **λμ μΌλ‘ κΆνμ μμ²ν μ μμ§λ§ λͺ¨λ κΆνμ λ§€λνμ€νΈμ λͺ
μλμ΄μΌ ν©λλ€.
μ±μ΄ κΈ°λ₯μ λ
ΈμΆν λ, μ§μ λ κΆνμ κ°μ§ μ±λ§ μ κ·Όν μ μλλ‘ μ νν μ μμ΅λλ€.
κΆν μμλ μΈ κ°μ§ μμ±μ κ°μ§λλ€:
- κΆνμ μ΄λ¦
- κ΄λ ¨ κΆνμ κ·Έλ£Ήνν μ μλ permission-group μμ±
- κΆνμ΄ λΆμ¬λλ λ°©μμ λνλ΄λ protection-level. λ€ κ°μ§ μ νμ΄ μμ΅λλ€:
- Normal: μ±μ μλ €μ§ μνμ΄ μμ λ μ¬μ©λ©λλ€. μ¬μ©μκ° μΉμΈν νμκ° μμ΅λλ€.
- Dangerous: μμ²νλ μ ν리μΌμ΄μ μ μμΉλ μ κ·Όμ λΆμ¬νλ κΆνμ λνλ λλ€. μ¬μ©μμκ² μΉμΈμ μμ²ν©λλ€.
- Signature: κ΅¬μ± μμλ₯Ό λ΄λ³΄λ΄λ κ²κ³Ό λμΌν μΈμ¦μλ‘ μλͺ λ μ±λ§ κΆνμ λΆμ¬λ°μ μ μμ΅λλ€. μ΄λ κ°μ₯ κ°λ ₯ν λ³΄νΈ μ νμ λλ€.
- SignatureOrSystem: **κ΅¬μ± μμλ₯Ό λ΄λ³΄λ΄λ κ²κ³Ό λμΌν μΈμ¦μλ‘ μλͺ λ μ±μ΄λ μμ€ν μμ€ μ κ·ΌμΌλ‘ μ€νλλ μ±λ§ κΆνμ λΆμ¬λ°μ μ μμ΅λλ€.
Pre-Installed Applications
μ΄ μ±λ€μ μΌλ°μ μΌλ‘ /system/app λλ /system/priv-app λλ ν 리μμ λ°κ²¬λλ©°, μΌλΆλ μ΅μ νλμ΄ μμ΅λλ€ (μ¬μ§μ΄ classes.dex νμΌμ μ°Ύμ§ λͺ»ν μλ μμ΅λλ€). μ΄λ¬ν μ ν리μΌμ΄μ
μ λλλ‘ λ무 λ§μ κΆνμΌλ‘ μ€νλκ³ μκΈ° λλ¬Έμ νμΈν κ°μΉκ° μμ΅λλ€ (루νΈλ‘).
- AOSP (Android OpenSource Project) ROMκ³Ό ν¨κ» μ 곡λλ κ²λ€
- μ₯μΉ μ μ‘°μ 체μ μν΄ μΆκ°λ κ²λ€
- μ ν μ 곡μ 체μ μν΄ μΆκ°λ κ²λ€ (κ·Έλ€λ‘λΆν° ꡬ맀ν κ²½μ°)
Rooting
물리μ μλλ‘μ΄λ μ₯μΉμ λ£¨νΈ μ κ·Όμ μ»μΌλ €λ©΄ μΌλ°μ μΌλ‘ **1κ° λλ 2κ°μ μ·¨μ½μ μ μ
μ©ν΄μΌ ν©λλ€. μ΄λ μ₯μΉ λ° λ²μ μ νΉμ μ
λλ€.
μ΅μ€νλ‘μμ΄ μ±κ³΅νλ©΄, μΌλ°μ μΌλ‘ 리λ
μ€ su λ°μ΄λλ¦¬κ° μ¬μ©μμ PATH νκ²½ λ³μμ μ§μ λ μμΉμΈ /system/xbinμ 볡μ¬λ©λλ€.
su λ°μ΄λλ¦¬κ° κ΅¬μ±λλ©΄, λ€λ₯Έ μλλ‘μ΄λ μ±μ΄ su λ°μ΄λ리μ μΈν°νμ΄μ€νμ¬ λ£¨νΈ μ κ·Ό μμ²μ μ²λ¦¬ν©λλ€. μλ₯Ό λ€μ΄ Superuser λ° SuperSU (Google Play μ€ν μ΄μμ μ¬μ© κ°λ₯)μ κ°μ μ±μ΄ μμ΅λλ€.
Caution
루ν κ³Όμ μ λ§€μ° μννλ©° μ₯μΉλ₯Ό μ¬κ°νκ² μμμν¬ μ μμ΅λλ€.
ROMs
컀μ€ν
νμ¨μ΄λ₯Ό μ€μΉνμ¬ OSλ₯Ό κ΅μ²΄νλ κ²μ΄ κ°λ₯ν©λλ€. μ΄λ₯Ό ν΅ν΄ μ€λλ μ₯μΉμ μ μ©μ±μ νμ₯νκ±°λ μννΈμ¨μ΄ μ νμ μ°ννκ±°λ μ΅μ μλλ‘μ΄λ μ½λμ μ κ·Όν μ μμ΅λλ€.
OmniROM λ° LineageOSλ μ¬μ©νκΈ°μ κ°μ₯ μΈκΈ° μλ λ κ°μ§ νμ¨μ΄μ
λλ€.
컀μ€ν νμ¨μ΄λ₯Ό μ€μΉνκΈ° μν΄ μ₯μΉλ₯Ό 루ν ν νμλ νμ μμ΅λλ€. μΌλΆ μ μ‘°μ 체λ μ λ¬Έμνλκ³ μμ ν λ°©μμΌλ‘ λΆνΈλ‘λ μ κΈμ ν΄μ νλ κ²μ νμ©ν©λλ€.
Implications
μ₯μΉκ° 루ν λλ©΄, μ΄λ€ μ±μ΄λ 루νΈλ‘ μ κ·Όμ μμ²ν μ μμ΅λλ€. μ μ± μ ν리μΌμ΄μ μ΄ μ΄λ₯Ό μ»μΌλ©΄ κ±°μ λͺ¨λ κ²μ μ κ·Όν μ μμΌλ©°, μ νκΈ°λ₯Ό μμμν¬ μ μμ΅λλ€.
Android Application Fundamentals
- μλλ‘μ΄λ μ ν리μΌμ΄μ μ νμμ _APK νμΌ νμ_μΌλ‘ μΈκΈλ©λλ€. λ³Έμ§μ μΌλ‘ ZIP νμΌμ λλ€ (νμΌ νμ₯μλ₯Ό .zipμΌλ‘ λ³κ²½νλ©΄ λ΄μ©μ μΆμΆνκ³ λ³Ό μ μμ΅λλ€).
- APK λ΄μ© (ν¬κ΄μ μ΄μ§ μμ)
- AndroidManifest.xml
- resources.arsc/strings.xml
- resources.arsc: μ΄μ§ XMLκ³Ό κ°μ 미리 μ»΄νμΌλ 리μμ€λ₯Ό ν¬ν¨ν©λλ€.
- res/xml/files_paths.xml
- META-INF/
- μ¬κΈ°μμ μΈμ¦μκ° μμΉν©λλ€!
- classes.dex
- κΈ°λ³Έμ μΌλ‘ μ ν리μΌμ΄μ μ΄ μ€ννλ μ»΄νμΌλ Java (λλ Kotlin) μ½λλ₯Ό λνλ΄λ Dalvik λ°μ΄νΈμ½λλ₯Ό ν¬ν¨ν©λλ€.
- lib/
- CPU μν€ν μ²μ λ°λΌ νμ λλ ν λ¦¬λ‘ λΆλ¦¬λ λ€μ΄ν°λΈ λΌμ΄λΈλ¬λ¦¬λ₯Ό ν¬ν¨ν©λλ€.
armeabi: ARM κΈ°λ° νλ‘μΈμλ₯Ό μν μ½λarmeabi-v7a: ARMv7 λ° κ·Έ μ΄μμ νλ‘μΈμλ₯Ό μν μ½λx86: X86 νλ‘μΈμλ₯Ό μν μ½λmips: MIPS νλ‘μΈμ μ μ© μ½λ- assets/
- μ±μμ νμν λ€μν νμΌμ μ μ₯νλ©°, μΆκ° λ€μ΄ν°λΈ λΌμ΄λΈλ¬λ¦¬λ DEX νμΌμ ν¬ν¨ν μ μμΌλ©°, λλλ‘ μ μ± μ½λ μμ±μκ° μΆκ° μ½λλ₯Ό μ¨κΈ°κΈ° μν΄ μ¬μ©ν©λλ€.
- res/
- resources.arscμ μ»΄νμΌλμ§ μμ 리μμ€λ₯Ό ν¬ν¨ν©λλ€.
Dalvik & Smali
μλλ‘μ΄λ κ°λ°μμλ Java λλ Kotlinμ μ¬μ©νμ¬ μ±μ μμ±ν©λλ€. λ°μ€ν¬ν μ±μ²λΌ JVMμ μ¬μ©νλ λμ , μλλ‘μ΄λλ μ΄ μ½λλ₯Ό Dalvik Executable (DEX) λ°μ΄νΈμ½λλ‘ μ»΄νμΌν©λλ€. μ΄μ μλ Dalvik κ°μ λ¨Έμ μ΄ μ΄ λ°μ΄νΈμ½λλ₯Ό μ²λ¦¬νμ§λ§, μ΄μ λ μ΅μ μλλ‘μ΄λ λ²μ μμ Android Runtime (ART)κ° μ΄λ₯Ό μ²λ¦¬ν©λλ€.
리λ²μ€ μμ§λμ΄λ§μ μν΄ Smaliκ° μ€μν΄μ§λλ€. μ΄λ DEX λ°μ΄νΈμ½λμ μ¬λμ΄ μ½μ μ μλ λ²μ μΌλ‘, μμ€ μ½λλ₯Ό λ°μ΄νΈμ½λ λͺ λ ΉμΌλ‘ λ³ννλ μ΄μ λΈλ¦¬ μΈμ΄μ²λΌ μμ©ν©λλ€. Smaliμ baksmaliλ μ΄ λ§₯λ½μμ μ΄μ λΈλ¦¬ λ° μμ΄μ λΈλ¦¬ λꡬλ₯Ό λνλ λλ€.
Intents
μΈν νΈλ μλλ‘μ΄λ μ±μ΄ κ΅¬μ± μμ κ° λλ λ€λ₯Έ μ±κ³Ό ν΅μ νλ μ£Όμ μλ¨μ λλ€. μ΄λ¬ν λ©μμ§ κ°μ²΄λ μ± κ° λλ κ΅¬μ± μμ κ°μ λ°μ΄ν°λ₯Ό μ λ¬ν μλ μμΌλ©°, HTTP ν΅μ μμ GET/POST μμ²μ΄ μ¬μ©λλ λ°©μκ³Ό μ μ¬ν©λλ€.
λ°λΌμ μΈν
νΈλ κΈ°λ³Έμ μΌλ‘ κ΅¬μ± μμ κ°μ μ λ¬λλ λ©μμ§μ
λλ€. μΈν
νΈλ νΉμ κ΅¬μ± μμλ μ±μΌλ‘ μ§ν₯λ μ μμΌλ©°, νΉμ μμ μ μμ΄ μ μ‘λ μλ μμ΅λλ€.
κ°λ¨ν λ§ν΄ μΈν
νΈλ λ€μκ³Ό κ°μ΄ μ¬μ©λ μ μμ΅λλ€:
- νλμ μμνμ¬ μΌλ°μ μΌλ‘ μ±μ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό μ½λλ€.
- μμ€ν κ³Ό μ±μ λ³κ²½ μ¬νμ μ리기 μν λΈλ‘λμΊμ€νΈλ‘ μ¬μ©λ©λλ€.
- λ°±κ·ΈλΌμ΄λ μλΉμ€μ μμ, μ€μ§ λ° ν΅μ ν©λλ€.
- ContentProvidersλ₯Ό ν΅ν΄ λ°μ΄ν°μ μ κ·Όν©λλ€.
- μ΄λ²€νΈλ₯Ό μ²λ¦¬νκΈ° μν μ½λ°±μΌλ‘ μ¬μ©λ©λλ€.
μ·¨μ½ν κ²½μ°, μΈν νΈλ₯Ό μ¬μ©νμ¬ λ€μν 곡격μ μνν μ μμ΅λλ€.
Intent-Filter
μΈν νΈ νν°λ νλ, μλΉμ€ λλ λΈλ‘λμΊμ€νΈ μμ μκ° λ€μν μ νμ μΈν νΈμ μνΈμμ©ν μ μλ λ°©λ²μ μ μν©λλ€. λ³Έμ§μ μΌλ‘, μ΄λ€μ μ΄λ¬ν κ΅¬μ± μμμ κΈ°λ₯μ μ€λͺ νλ©°, μνν μ μλ μμ μ΄λ μ²λ¦¬ν μ μλ λΈλ‘λμΊμ€νΈμ μ’ λ₯λ₯Ό λνλ λλ€. μ΄λ¬ν νν°λ₯Ό μ μΈνλ μ£Όμ μ₯μλ AndroidManifest.xml νμΌ λ΄μ μμ§λ§, λΈλ‘λμΊμ€νΈ μμ μμ κ²½μ° μ½λ©νλ κ²λ μ΅μ μ λλ€.
μΈν νΈ νν°λ μΉ΄ν κ³ λ¦¬, μμ λ° λ°μ΄ν° νν°λ‘ ꡬμ±λλ©°, μΆκ° λ©νλ°μ΄ν°λ₯Ό ν¬ν¨ν μ μλ κ°λ₯μ±μ΄ μμ΅λλ€. μ΄ μ€μ μ κ΅¬μ± μμκ° μ μΈλ κΈ°μ€μ λ§λ νΉμ μΈν νΈλ₯Ό μ²λ¦¬ν μ μκ² ν©λλ€.
μλλ‘μ΄λ κ΅¬μ± μμ(νλ/μλΉμ€/μ½ν
μΈ μ 곡μ/λΈλ‘λμΊμ€νΈ μμ μ)μ μ€μν μΈ‘λ©΄μ κ·Έλ€μ κ°μμ± λλ κ³΅κ° μνμ
λλ€. κ΅¬μ± μμκ° exported μμ±μ΄ **true**λ‘ μ€μ λμ΄ μκ±°λ λ§€λνμ€νΈμ μΈν
νΈ νν°κ° μ μΈλμ΄ μμΌλ©΄, ν΄λΉ κ΅¬μ± μμλ 곡κ°λ‘ κ°μ£Όλλ©° λ€λ₯Έ μ±κ³Ό μνΈμμ©ν μ μμ΅λλ€. κ·Έλ¬λ κ°λ°μλ μ΄λ¬ν κ΅¬μ± μμλ₯Ό λͺ
μμ μΌλ‘ λΉκ³΅κ°λ‘ μ μ§νμ¬ λ€λ₯Έ μ±κ³Ό μλμΉ μκ² μνΈμμ©νμ§ μλλ‘ ν μ μλ λ°©λ²μ΄ μμ΅λλ€. μ΄λ λ§€λνμ€νΈ μ μμμ exported μμ±μ **false**λ‘ μ€μ νμ¬ λ¬μ±λ©λλ€.
λν, κ°λ°μλ νΉμ κΆνμ μꡬνμ¬ μ΄λ¬ν κ΅¬μ± μμμ λν μ κ·Όμ λμ± μμ νκ² ν μ μλ μ΅μ
μ΄ μμ΅λλ€. permission μμ±μ μ€μ νμ¬ μ§μ λ κΆνμ κ°μ§ μ±λ§ κ΅¬μ± μμμ μ κ·Όν μ μλλ‘ νμ¬, λκ° μνΈμμ©ν μ μλμ§μ λν μΆκ° 보μ λ° μ μ΄λ₯Ό μΆκ°ν μ μμ΅λλ€.
<activity android:name=".MyActivity" android:exported="false">
<!-- Intent filters go here -->
</activity>
μμμ μΈν νΈ
μΈν νΈλ μΈν νΈ μμ±μλ₯Ό μ¬μ©νμ¬ νλ‘κ·Έλλ°μ μΌλ‘ μμ±λ©λλ€:
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
μ΄μ μ μ μΈλ μΈν νΈμ μ‘μ μ ACTION_SENDμ΄κ³ , μμ€νΈλΌλ mailto Uriμ λλ€ (μμ€νΈλΌλ μΈν νΈκ° κΈ°λνλ μΆκ° μ 보μ λλ€).
μ΄ μΈν νΈλ λ€μ μμ κ°μ΄ λ§€λνμ€νΈ λ΄μ μ μΈλμ΄μΌ ν©λλ€:
<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
μΈν νΈ νν°λ λ©μμ§λ₯Ό μμ νκΈ° μν΄ action, data λ° categoryμ μΌμΉν΄μΌ ν©λλ€.
βμΈν
νΈ ν΄μλβ νλ‘μΈμ€λ κ° λ©μμ§λ₯Ό μμ ν μ±μ κ²°μ ν©λλ€. μ΄ νλ‘μΈμ€λ μ°μ μμ μμ±μ κ³ λ €νλ©°, μ΄λ μΈν
νΈ νν° μ μΈμμ μ€μ ν μ μκ³ , λ λμ μ°μ μμλ₯Ό κ°μ§ κ²μ΄ μ νλ©λλ€. μ΄ μ°μ μμλ -1000μμ 1000 μ¬μ΄λ‘ μ€μ ν μ μμΌλ©°, μ ν리μΌμ΄μ
μ SYSTEM_HIGH_PRIORITY κ°μ μ¬μ©ν μ μμ΅λλ€. μΆ©λμ΄ λ°μνλ©΄ βμ νκΈ°β μ°½μ΄ λνλ μ¬μ©μκ° κ²°μ ν μ μμ΅λλ€.
λͺ μμ μΈν νΈ
λͺ μμ μΈν νΈλ νκ²μΌλ‘ νλ ν΄λμ€ μ΄λ¦μ μ§μ ν©λλ€:
Intent downloadIntent = new (this, DownloadService.class):
λ€λ₯Έ μ ν리μΌμ΄μ μμλ μ΄μ μ μ μΈλ μΈν νΈμ μ κ·ΌνκΈ° μν΄ λ€μμ μ¬μ©ν μ μμ΅λλ€:
Intent intent = new Intent();
intent.setClassName("com.other.app", "com.other.app.ServiceName");
context.startService(intent);
Pending Intents
μ΄κ²μ λ€λ₯Έ μ ν리μΌμ΄μ μ΄ λΉμ μ μ ν리μΌμ΄μ μ λμ νμ¬ μμ μ μνν μ μλλ‘ νλ©°, λΉμ μ μ±μ μμ΄λ΄ν°ν°μ κΆνμ μ¬μ©ν©λλ€. Pending Intentλ₯Ό ꡬμ±ν λλ μλμ μνν μμ μ μ§μ ν΄μΌ ν©λλ€. μ μΈλ μλκ° λͺ μμ μ΄μ§ μμΌλ©΄ (μ΄λ€ μλκ° νΈμΆν μ μλμ§ μ μΈνμ§ μμ) μ μμ μΈ μ ν리μΌμ΄μ μ΄ νΌν΄μ μ±μ λμ νμ¬ μ μΈλ μμ μ μνν μ μμ΅λλ€. κ²λ€κ°, μμ μ΄ μ§μ λμ§ μμΌλ©΄, μ μμ μΈ μ±μ νΌν΄μλ₯Ό λμ νμ¬ μ΄λ€ μμ μ΄λ μνν μ μμ΅λλ€.
Broadcast Intents
μ΄μ μ μΈν νΈμ λ¬λ¦¬, λ¨μΌ μ±μμλ§ μμ λλ κ²μ΄ μλλΌ, broadcast intentsλ μ¬λ¬ μ±μμ μμ λ μ μμ΅λλ€. κ·Έλ¬λ API λ²μ 14λΆν°λ λ©μμ§λ₯Ό μμ ν΄μΌ νλ μ±μ μ§μ ν μ μμ΅λλ€ Intent.setPackageλ₯Ό μ¬μ©νμ¬.
λν λΈλ‘λμΊμ€νΈλ₯Ό λ³΄λΌ λ κΆνμ μ§μ ν μλ μμ΅λλ€. μμ μ±μ ν΄λΉ κΆνμ κ°μ ΈμΌ ν©λλ€.
λΈλ‘λμΊμ€νΈμλ λ κ°μ§ μ νμ΄ μμ΅λλ€: μ μ (λΉλκΈ°) λ° μ£Όλ¬Έν (λκΈ°). μμλ μμ κΈ° μμ λ΄μμ ꡬμ±λ μ°μ μμμ κΈ°λ°ν©λλ€. κ° μ±μ λΈλ‘λμΊμ€νΈλ₯Ό μ²λ¦¬, μ€κ³ λλ μμ ν μ μμ΅λλ€.
Context ν΄λμ€μ sendBroadcast(intent, receiverPermission) ν¨μλ₯Ό μ¬μ©νμ¬ λΈλ‘λμΊμ€νΈλ₯Ό λ³΄λΌ μ μμ΅λλ€.
λν **LocalBroadCastManager**μ sendBroadcast ν¨μλ₯Ό μ¬μ©νλ©΄ λ©μμ§κ° μ±μ λ λμ§ μλλ‘ λ³΄μ₯ν©λλ€. μ΄λ₯Ό μ¬μ©νλ©΄ μμ κΈ° κ΅¬μ± μμλ₯Ό λ΄λ³΄λΌ νμμ‘°μ°¨ μμ΅λλ€.
Sticky Broadcasts
μ΄λ° μ’
λ₯μ λΈλ‘λμΊμ€νΈλ μ μ‘λ ν μ€λ«λμ μ κ·Όν μ μμ΅λλ€.
μ΄κ²μ API λ 벨 21μμ μ¬μ© μ€λ¨λμμΌλ©° μ¬μ©νμ§ μλ κ²μ΄ μ’μ΅λλ€.
μ΄λ€μ μ΄λ€ μ ν리μΌμ΄μ
μ΄ λ°μ΄ν°λ₯Ό μΏλ³Ό μ μλλ‘ νμ©νμ§λ§, λν μμ ν μ μλλ‘ ν©λλ€.
βstickyβλΌλ λ¨μ΄κ° ν¬ν¨λ ν¨μ, μλ₯Ό λ€μ΄ sendStickyBroadcast λλ **sendStickyBroadcastAsUser**λ₯Ό λ°κ²¬νλ©΄, μν₯μ νμΈνκ³ μ κ±°νλλ‘ μλνμΈμ.
Deep links / URL schemes
μλλ‘μ΄λ μ ν리μΌμ΄μ μμ λ₯ λ§ν¬λ URLμ ν΅ν΄ μ§μ μμ (Intent)μ μμνλ λ° μ¬μ©λ©λλ€. μ΄λ νλ λ΄μμ νΉμ URL μ€ν΄μ μ μΈν¨μΌλ‘μ¨ μ΄λ£¨μ΄μ§λλ€. μλλ‘μ΄λ μ₯μΉκ° μ΄ μ€ν΄μ κ°μ§ URLμ μ κ·Όνλ €κ³ ν λ, μ ν리μΌμ΄μ λ΄μμ μ§μ λ νλμ΄ μμλ©λλ€.
μ€ν΄μ AndroidManifest.xml νμΌμ μ μΈλμ΄μΌ ν©λλ€:
[...]
<activity android:name=".MyActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="examplescheme" />
</intent-filter>
[...]
μ΄μ μμ μ μ€ν΄μ examplescheme://μ
λλ€ (λν **category BROWSABLE**λ μ£Όλͺ©νμΈμ)
κ·Έλ° λ€μ, λ°μ΄ν° νλμμ hostμ pathλ₯Ό μ§μ ν μ μμ΅λλ€:
<data android:scheme="examplescheme"
android:host="example"
/>
μΉμμ μ κ·ΌνκΈ° μν΄ λ€μκ³Ό κ°μ λ§ν¬λ₯Ό μ€μ ν μ μμ΅λλ€:
<a href="examplescheme://example/something">click here</a>
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
μ±μμ μ€νλ μ½λλ₯Ό μ°ΎκΈ° μν΄, λ₯λ§ν¬λ‘ νΈμΆλ μ‘ν°λΉν°λ‘ κ°μ onNewIntent ν¨μλ₯Ό κ²μνμΈμ.
HTML νμ΄μ§λ₯Ό μ¬μ©νμ§ μκ³ λ₯ λ§ν¬λ₯Ό νΈμΆνλ λ°©λ²μ λ°°μ°μΈμ.
AIDL - Android μΈν°νμ΄μ€ μ μ μΈμ΄
**Android μΈν°νμ΄μ€ μ μ μΈμ΄ (AIDL)**λ Android μ ν리μΌμ΄μ μμ νλ‘μΈμ€ κ° ν΅μ (IPC)μ ν΅ν΄ ν΄λΌμ΄μΈνΈμ μλΉμ€ κ°μ ν΅μ μ μ©μ΄νκ² νκΈ° μν΄ μ€κ³λμμ΅λλ€. Androidμμλ λ€λ₯Έ νλ‘μΈμ€μ λ©λͺ¨λ¦¬μ μ§μ μ κ·Όνλ κ²μ΄ νμ©λμ§ μκΈ° λλ¬Έμ, AIDLμ κ°μ²΄λ₯Ό μ΄μ 체μ κ° μ΄ν΄ν μ μλ νμμΌλ‘ λ³ννμ¬ μλ‘ λ€λ₯Έ νλ‘μΈμ€ κ°μ ν΅μ μ μ½κ² ν©λλ€.
μ£Όμ κ°λ
-
λ°μ΄λ μλΉμ€: μ΄λ¬ν μλΉμ€λ IPCλ₯Ό μν΄ AIDLμ μ¬μ©νμ¬ μ‘ν°λΉν°λ κ΅¬μ± μμκ° μλΉμ€μ λ°μΈλ©νκ³ μμ²μ νλ©° μλ΅μ λ°μ μ μκ² ν©λλ€. μλΉμ€ ν΄λμ€μ
onBindλ©μλλ μνΈμμ©μ μμνλ λ° μ€μνλ©°, μ·¨μ½μ μ μ°ΎκΈ° μν 보μ κ²ν μ μ€μν μμμΌλ‘ νμλ©λλ€. -
λ©μ μ : λ°μ΄λ μλΉμ€λ‘ μλνλ λ©μ μ λ
onBindλ©μλλ₯Ό ν΅ν΄ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ λ° μ€μ μ λκ³ IPCλ₯Ό μ©μ΄νκ² ν©λλ€. μ΄ λ©μλλ₯Ό λ©΄λ°ν κ²μ¬νμ¬ μμ νμ§ μμ λ°μ΄ν° μ²λ¦¬λ λ―Όκ°ν κΈ°λ₯μ μ€νμ΄ μλμ§ νμΈνλ κ²μ΄ μ€μν©λλ€. -
λ°μΈλ: AIDLμ μΆμνλ‘ μΈν΄ λ°μΈλ ν΄λμ€λ₯Ό μ§μ μ¬μ©νλ κ²μ λ μΌλ°μ μ΄μ§λ§, λ°μΈλκ° μλ‘ λ€λ₯Έ νλ‘μΈμ€μ λ©λͺ¨λ¦¬ κ³΅κ° κ° λ°μ΄ν° μ μ‘μ μ©μ΄νκ² νλ 컀λ μμ€ λλΌμ΄λ² μν μ νλ€λ κ²μ μ΄ν΄νλ κ²μ΄ μ μ΅ν©λλ€. λ μμΈν μ΄ν΄λ₯Ό μν΄ https://www.youtube.com/watch?v=O-UHvFjxwZ8μμ 리μμ€λ₯Ό νμΈνμΈμ.
κ΅¬μ± μμ
μ¬κΈ°μλ μ‘ν°λΉν°, μλΉμ€, λΈλ‘λμΊμ€νΈ 리μλ² λ° νλ‘λ°μ΄λκ° ν¬ν¨λ©λλ€.
λ°μ² μ‘ν°λΉν° λ° κΈ°ν μ‘ν°λΉν°
Android μ±μμ μ‘ν°λΉν°λ νλ©΄κ³Ό κ°μΌλ©°, μ±μ μ¬μ©μ μΈν°νμ΄μ€μ λ€μν λΆλΆμ 보μ¬μ€λλ€. μ±μ μ¬λ¬ κ°μ μ‘ν°λΉν°λ₯Ό κ°μ§ μ μμΌλ©°, κ° μ‘ν°λΉν°λ μ¬μ©μμκ² κ³ μ ν νλ©΄μ μ 곡ν©λλ€.
λ°μ² μ‘ν°λΉν°λ μ±μ μ£Όμ κ²μ΄νΈμ¨μ΄λ‘, μ± μμ΄μ½μ νν λ μ€νλ©λλ€. μ΄λ μ±μ λ§€λνμ€νΈ νμΌμ νΉμ MAIN λ° LAUNCHER μΈν νΈλ‘ μ μλ©λλ€:
<activity android:name=".LauncherActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
λͺ¨λ μ±μ΄ λ°μ² μ‘ν°λΉν°λ₯Ό νμλ‘ νλ κ²μ μλλ©°, μ¬μ©μ μΈν°νμ΄μ€κ° μλ λ°±κ·ΈλΌμ΄λ μλΉμ€μ κ°μ μ±μ νΉν κ·Έλ μ΅λλ€.
μ‘ν°λΉν°λ λ§€λνμ€νΈμμ βexportedβλ‘ νμνμ¬ λ€λ₯Έ μ±μ΄λ νλ‘μΈμ€μμ μ¬μ©ν μ μλλ‘ λ§λ€ μ μμ΅λλ€. μ΄ μ€μ μ λ€λ₯Έ μ±μ΄ μ΄ μ‘ν°λΉν°λ₯Ό μμν μ μλλ‘ νμ©ν©λλ€:
<service android:name=".ExampleExportedService" android:exported="true"/>
κ·Έλ¬λ λ€λ₯Έ μ±μ νλμ μ κ·Όνλ κ²μ΄ νμ 보μ μνμ μλλλ€. λ―Όκ°ν λ°μ΄ν°κ° λΆμ μ νκ² κ³΅μ λ κ²½μ° μ°λ €κ° λ°μνλ©°, μ΄λ μ 보 μ μΆλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
νλμ μλͺ μ£ΌκΈ° λ onCreate λ©μλλ‘ μμλλ©°, UIλ₯Ό μ€μ νκ³ μ¬μ©μμμ μνΈμμ©μ μν΄ νλμ μ€λΉν©λλ€.
μ ν리μΌμ΄μ μλΈν΄λμ€
μλλ‘μ΄λ κ°λ°μμ μ±μ Application ν΄λμ€μ μλΈν΄λμ€λ₯Ό μμ±ν μ μλ μ΅μ
μ΄ μμ§λ§, νμλ μλλλ€. μ΄λ¬ν μλΈν΄λμ€κ° μ μλλ©΄, μ± λ΄μμ κ°μ₯ λ¨Όμ μΈμ€ν΄μ€νλλ ν΄λμ€κ° λ©λλ€. μ΄ μλΈν΄λμ€μμ ꡬνλ attachBaseContext λ©μλλ onCreate λ©μλ μ΄μ μ μ€νλ©λλ€. μ΄ μ€μ μ μ ν리μΌμ΄μ
μ λλ¨Έμ§ λΆλΆμ΄ μμλκΈ° μ μ μ΄κΈ°νλ₯Ό μ‘°κΈ°μ μνν μ μκ² ν©λλ€.
public class MyApp extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// Initialization code here
}
@Override
public void onCreate() {
super.onCreate();
// More initialization code
}
}
Services
Servicesλ λ°±κ·ΈλΌμ΄λ μμ μλ‘, μ¬μ©μ μΈν°νμ΄μ€ μμ΄ μμ μ μ€νν μ μμ΅λλ€. μ΄λ¬ν μμ μ μ¬μ©μκ° λ€λ₯Έ μ ν리μΌμ΄μ μΌλ‘ μ ννλλΌλ κ³μ μ€νλ μ μμ΄, μ₯κΈ° μ€ν μμ μ μμ΄ μλΉμ€λ λ§€μ° μ€μν©λλ€.
μλΉμ€λ λ€μ¬λ€λ₯νλ©°, λ€μν λ°©λ²μΌλ‘ μμλ μ μμΌλ©°, Intentsκ° μ ν리μΌμ΄μ
μ μ§μ
μ μ μμνλ μ£Όμ λ°©λ²μ
λλ€. startService λ©μλλ₯Ό μ¬μ©νμ¬ μλΉμ€κ° μμλλ©΄, onStart λ©μλκ° μλμ μμνκ³ stopService λ©μλκ° λͺ
μμ μΌλ‘ νΈμΆλ λκΉμ§ κ³μ μ€νλ©λλ€. λλ μλΉμ€μ μν μ΄ νμ± ν΄λΌμ΄μΈνΈ μ°κ²°μ μμ‘΄νλ κ²½μ°, bindService λ©μλλ₯Ό μ¬μ©νμ¬ ν΄λΌμ΄μΈνΈλ₯Ό μλΉμ€μ λ°μΈλ©νκ³ , λ°μ΄ν° μ μ‘μ μν΄ onBind λ©μλλ₯Ό νμ±νν©λλ€.
μλΉμ€μ ν₯λ―Έλ‘μ΄ μμ© νλ‘κ·Έλ¨μλ λ°±κ·ΈλΌμ΄λ μμ μ¬μμ΄λ μ¬μ©μμ μ± κ°μ μνΈμμ©μ λ°©ν΄νμ§ μκ³ λ€νΈμν¬ λ°μ΄ν° κ°μ Έμ€κΈ°κ° ν¬ν¨λ©λλ€. λν, μλΉμ€λ λ΄λ³΄λ΄κΈ°λ₯Ό ν΅ν΄ λμΌν μ₯μΉμ λ€λ₯Έ νλ‘μΈμ€μμ μ κ·Όν μ μλλ‘ μ€μ ν μ μμ΅λλ€. μ΄λ κΈ°λ³Έ λμμ΄ μλλ©° Android Manifest νμΌμμ λͺ μμ μΈ κ΅¬μ±μ΄ νμν©λλ€:
<service android:name=".ExampleExportedService" android:exported="true"/>
Broadcast Receivers
Broadcast receiversλ λ©μμ§ μμ€ν
μμ 리μ€λ μν μ νμ¬ μ¬λ¬ μ ν리μΌμ΄μ
μ΄ μμ€ν
μ λμΌν λ©μμ§μ μλ΅ν μ μλλ‘ ν©λλ€. μ±μ Manifestλ₯Ό ν΅ν΄ λλ registerReceiver APIλ₯Ό μ¬μ©νμ¬ μ± μ½λ λ΄μμ λ κ°μ§ μ£Όμ λ°©λ²μΌλ‘ 리μλ²λ₯Ό λ±λ‘ν μ μμ΅λλ€. Manifestμμλ λΈλ‘λμΊμ€νΈκ° κΆνμΌλ‘ νν°λ§λλ©°, λμ μΌλ‘ λ±λ‘λ 리μλ²λ λ±λ‘ μ κΆνμ μ§μ ν μλ μμ΅λλ€.
Intent νν°λ λ λ±λ‘ λ°©λ² λͺ¨λμμ μ€μνλ©°, μ΄λ€ λΈλ‘λμΊμ€νΈκ° 리μλ²λ₯Ό νΈλ¦¬κ±°νλμ§λ₯Ό κ²°μ ν©λλ€. μΌμΉνλ λΈλ‘λμΊμ€νΈκ° μ μ‘λλ©΄ 리μλ²μ onReceive λ©μλκ° νΈμΆλμ΄ μ±μ΄ μ μ λ ₯ κ²½κ³ μ λ°λΌ νλμ μ‘°μ νλ λ±μ λ°©μμΌλ‘ λ°μν μ μκ² ν©λλ€.
λΈλ‘λμΊμ€νΈλ λΉλκΈ°μΌ μ μμΌλ©°, λͺ¨λ 리μλ²μ μμ μμ΄ λλ¬νκ±°λ λκΈ°μΌ μ μμΌλ©°, 리μλ²κ° μ€μ λ μ°μ μμμ λ°λΌ λΈλ‘λμΊμ€νΈλ₯Ό λ°μ΅λλ€. κ·Έλ¬λ λͺ¨λ μ±μ΄ λΈλ‘λμΊμ€νΈλ₯Ό κ°λ‘μ±κΈ° μν΄ μμ μ μ°μ μν μ μμΌλ―λ‘ μ μ¬μ μΈ λ³΄μ μνμ μ£Όμν΄μΌ ν©λλ€.
리μλ²μ κΈ°λ₯μ μ΄ν΄νλ €λ©΄ ν΄λΉ ν΄λμ€ λ΄μμ onReceive λ©μλλ₯Ό μ°Ύμ보μΈμ. μ΄ λ©μλμ μ½λλ μμ λ Intentλ₯Ό μ‘°μν μ μμΌλ©°, νΉν Intentλ₯Ό μμ νκ±°λ μμ ν μ μλ Ordered Broadcastsμμ 리μλ²μ μν λ°μ΄ν° κ²μ¦μ νμμ±μ κ°μ‘°ν©λλ€.
Content Provider
Content Providersλ μ± κ°μ ꡬ쑰νλ λ°μ΄ν°λ₯Ό 곡μ νλ λ° νμμ μ΄λ©°, λ°μ΄ν° 보μμ 보μ₯νκΈ° μν΄ κΆν ꡬνμ μ€μμ±μ κ°μ‘°ν©λλ€. μ΄λ€μ μ±μ΄ λ°μ΄ν°λ² μ΄μ€, νμΌ μμ€ν
λλ μΉμ ν¬ν¨ν λ€μν μμ€μ λ°μ΄ν°μ μ κ·Όν μ μλλ‘ ν©λλ€. readPermission λ° **writePermission**κ³Ό κ°μ νΉμ κΆνμ μ κ·Ό μ μ΄μ μ€μν©λλ€. λν, μ±μ λ§€λνμ€νΈμμ grantUriPermission μ€μ μ ν΅ν΄ μμ μ κ·Όμ λΆμ¬ν μ μμΌλ©°, path, pathPrefix, pathPatternκ³Ό κ°μ μμ±μ νμ©νμ¬ μΈλΆμ μΈ μ κ·Ό μ μ΄λ₯Ό μνν©λλ€.
μ
λ ₯ κ²μ¦μ SQL μΈμ μ
κ³Ό κ°μ μ·¨μ½μ μ λ°©μ§νκΈ° μν΄ λ§€μ° μ€μν©λλ€. Content Providersλ λ°μ΄ν° μ‘°μ λ° μ ν리μΌμ΄μ
κ° κ³΅μ λ₯Ό μ©μ΄νκ² νλ κΈ°λ³Έ μμ
μΈ insert(), update(), delete(), query()λ₯Ό μ§μν©λλ€.
FileProviderλ νμΌμ μμ νκ² κ³΅μ νλ λ° μ€μ μ λ μ λ¬Ένλ Content Providerμ
λλ€. μ΄λ μ±μ λ§€λνμ€νΈμ μ μλλ©°, ν΄λμ λν μ κ·Όμ μ μ΄νκΈ° μν νΉμ μμ±μ ν¬ν¨νκ³ μμΌλ©°, android:exported λ° android:resourceκ° ν΄λ ꡬμ±μΌλ‘ μ§μ λ©λλ€. λ―Όκ°ν λ°μ΄ν°κ° μ°μ°ν λ
ΈμΆλμ§ μλλ‘ λλ ν 리λ₯Ό 곡μ ν λ μ£Όμν΄μΌ ν©λλ€.
FileProviderμ λν μμ λ§€λνμ€νΈ μ μΈ:
<provider android:name="androidx.core.content.FileProvider"
android:authorities="com.example.myapp.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths" />
</provider>
filepaths.xmlμμ 곡μ ν΄λλ₯Ό μ§μ νλ μ:
<paths>
<files-path path="images/" name="myimages" />
</paths>
λ λ§μ μ 보λ λ€μμ νμΈνμΈμ:
WebViews
WebViewsλ Android μ± λ΄μ λ―Έλ μΉ λΈλΌμ°μ μ κ°μΌλ©°, μΉ λλ λ‘컬 νμΌμμ μ½ν μΈ λ₯Ό κ°μ Έμ΅λλ€. μ΄λ€μ μΌλ° λΈλΌμ°μ μ μ μ¬ν μνμ μ§λ©΄νμ§λ§, νΉμ μ€μ μ ν΅ν΄ μ΄λ¬ν μνμ μ€μΌ μ μλ λ°©λ²μ΄ μμ΅λλ€.
Androidλ λ κ°μ§ μ£Όμ WebView μ νμ μ 곡ν©λλ€:
- WebViewClientλ κΈ°λ³Έ HTMLμ μ ν©νμ§λ§ JavaScript μλ¦Ό κΈ°λ₯μ μ§μνμ§ μμ XSS 곡격 ν μ€νΈ λ°©μμ μν₯μ λ―ΈμΉ©λλ€.
- WebChromeClientλ μ 체 Chrome λΈλΌμ°μ κ²½νκ³Ό λ μ μ¬νκ² μλν©λλ€.
μ€μν μ μ WebView λΈλΌμ°μ κ° μ₯μΉμ μ£Όμ λΈλΌμ°μ μ μΏ ν€λ₯Ό 곡μ νμ§ μλλ€λ κ²μ λλ€.
μ½ν
μΈ λ₯Ό λ‘λνκΈ° μν΄ loadUrl, loadData, loadDataWithBaseURLμ κ°μ λ°©λ²μ΄ μ 곡λ©λλ€. μ΄λ¬ν URL λλ νμΌμ΄ μμ νκ² μ¬μ©λ μ μλμ§ νμΈνλ κ²μ΄ μ€μν©λλ€. 보μ μ€μ μ WebSettings ν΄λμ€λ₯Ό ν΅ν΄ κ΄λ¦¬ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, setJavaScriptEnabled(false)λ‘ JavaScriptλ₯Ό λΉνμ±ννλ©΄ XSS 곡격μ λ°©μ§ν μ μμ΅λλ€.
JavaScript βBridgeβλ Java κ°μ²΄κ° JavaScriptμ μνΈμμ©ν μ μκ² νλ©°, Android 4.2 μ΄μλΆν° 보μμ μν΄ λ©μλμ @JavascriptInterfaceλ‘ νμν΄μΌ ν©λλ€.
μ½ν
μΈ μ κ·Όμ νμ©νλ κ²(setAllowContentAccess(true))μ WebViewsκ° Content Providersμ μ κ·Όν μ μκ² νλ©°, μ½ν
μΈ URLμ΄ μμ νλ€κ³ νμΈλμ§ μμΌλ©΄ μνμ΄ λ μ μμ΅λλ€.
νμΌ μ κ·Όμ μ μ΄νκΈ° μν΄:
- νμΌ μ κ·Όμ λΉνμ±ννλ κ²(
setAllowFileAccess(false))μ νμΌ μμ€ν μ λν μ κ·Όμ μ ννλ©°, νΉμ μμ°μ λν μμΈλ₯Ό λμ΄ λΉλ―Όκ° μ½ν μΈ μλ§ μ¬μ©λλλ‘ λ³΄μ₯ν©λλ€.
κΈ°ν μ± κ΅¬μ± μμ λ° λͺ¨λ°μΌ μ₯μΉ κ΄λ¦¬
μμ© νλ‘κ·Έλ¨μ λμ§νΈ μλͺ
- λμ§νΈ μλͺ μ Android μ±μ νμμ μ΄λ©°, μ€μΉ μ μ μ ν μμ±λμμμ 보μ₯ν©λλ€. μ΄ κ³Όμ μ μ± μλ³μ μν μΈμ¦μλ₯Ό μ¬μ©νλ©°, μ€μΉ μ μ₯μΉμ ν¨ν€μ§ κ΄λ¦¬μκ° νμΈν΄μΌ ν©λλ€. μ±μ μ체 μλͺ λκ±°λ μΈλΆ CAμ μν΄ μΈμ¦λ μ μμΌλ©°, λ¬΄λ¨ μ κ·ΌμΌλ‘λΆν° 보νΈνκ³ μ₯μΉμ μ λ¬λλ λμ μ±μ΄ λ³μ‘°λμ§ μλλ‘ λ³΄μ₯ν©λλ€.
κ°νλ 보μμ μν μ± κ²μ¦
- Android 4.2λΆν° Verify AppsλΌλ κΈ°λ₯μ΄ λμ λμ΄ μ¬μ©μκ° μ€μΉ μ μ μ±μ μμ μ±μ νμΈν μ μμ΅λλ€. μ΄ κ²μ¦ κ³Όμ μ μ¬μ©μκ° μ μ¬μ μΌλ‘ ν΄λ‘μ΄ μ±μ λν΄ κ²½κ³ νκ±°λ νΉν μ μ±μΈ μ±μ μ€μΉλ₯Ό λ°©μ§νμ¬ μ¬μ©μ 보μμ κ°νν μ μμ΅λλ€.
λͺ¨λ°μΌ μ₯μΉ κ΄λ¦¬ (MDM)
- MDM μ루μ μ μ₯μΉ κ΄λ¦¬ APIλ₯Ό ν΅ν΄ λͺ¨λ°μΌ μ₯μΉμ λν κ°λ λ° λ³΄μμ μ 곡ν©λλ€. μ΄λ€μ λͺ¨λ°μΌ μ₯μΉλ₯Ό ν¨κ³Όμ μΌλ‘ κ΄λ¦¬νκ³ λ³΄νΈνκΈ° μν΄ Android μ±μ μ€μΉλ₯Ό νμλ‘ ν©λλ€. μ£Όμ κΈ°λ₯μλ λΉλ°λ²νΈ μ μ± μν, μ μ₯μ μνΈν μ무ν, μ격 λ°μ΄ν° μμ νμ©μ΄ ν¬ν¨λμ΄ μμ΄ λͺ¨λ°μΌ μ₯μΉμ λν ν¬κ΄μ μΈ μ μ΄ λ° λ³΄μμ 보μ₯ν©λλ€.
// Example of enforcing a password policy with MDM
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName adminComponent = new ComponentName(context, AdminReceiver.class);
if (dpm.isAdminActive(adminComponent)) {
// Set minimum password length
dpm.setPasswordMinimumLength(adminComponent, 8);
}
AIDL / Binder μλΉμ€ μ΄κ±° λ° μ μ©
Android Binder IPCλ λ§μ μμ€ν λ° κ³΅κΈμ 체 μ 곡 μλΉμ€λ₯Ό λ ΈμΆν©λλ€. μ΄λ¬ν μλΉμ€λ μ μ ν κΆν κ²μ¬κ° μμ΄ λ΄λ³΄λ΄μ§ λ 곡격 νλ©΄μ΄ λ©λλ€ (AIDL λ μ΄μ΄ μ체λ μ κ·Ό μ μ΄λ₯Ό μννμ§ μμ΅λλ€).
1. μ€ν μ€μΈ μλΉμ€ λ°κ²¬
# from an adb shell (USB or wireless)
service list # simple one-liner
am list services # identical output, ActivityManager wrapper
- Android μ ν리μΌμ΄μ μ κΈ°λ³Έ μ¬ν
- Android μ ν리μΌμ΄μ ꡬ쑰
- Android μ ν리μΌμ΄μ μ κ΅¬μ± μμ
- AndroidManifest.xml νμΌ
- 리μμ€ νμΌ
- μ½λ νμΌ
- Android μ ν리μΌμ΄μ μ 보μ
- μ·¨μ½μ λΆμ
- 리λ²μ€ μμ§λμ΄λ§
- 보μ ν μ€νΈ λꡬ
145 mtkconnmetrics: [com.mediatek.net.connectivity.IMtkIpConnectivityMetrics]
146 wifi : [android.net.wifi.IWifiManager]
- μΈλ±μ€ (첫 λ²μ§Έ μ΄)μ λ°νμμ ν λΉλ©λλ€ β μ¬λΆν κ°μ μ΄λ₯Ό μ λ’°νμ§ λ§μμμ€.
- λ°μΈλ μ΄λ¦ (μ:
mtkconnmetrics)μservice callμ μ λ¬λ κ²μ λλ€. - κ΄νΈ μμ κ°μ μ€ν μ΄ μμ±λ μμ ν AIDL μΈν°νμ΄μ€μ λλ€.
2. μΈν°νμ΄μ€ μ€λͺ μ μ»κΈ° (PING)
λͺ¨λ λ°μΈλ μ€ν
μ μλμΌλ‘ νΈλμμ
μ½λ 0x5f4e5446 (1598968902 μμ§μ, ASCII β_NTFβ)λ₯Ό ꡬνν©λλ€.
# "ping" the service
service call mtkconnmetrics 1 # 1 == decimal 1598968902 mod 2^32
μ ν¨ν μλ΅μ Parcel λ΄λΆμ UTF-16 λ¬Έμμ΄λ‘ μΈμ½λ©λ μΈν°νμ΄μ€ μ΄λ¦μ λ°νν©λλ€.
3. νΈλμμ νΈμΆ
ꡬ문: service call <name> <code> [type value ...]
μΌλ° μΈμ μ§μ μ:
i32 <int>β λΆνΈ μλ 32λΉνΈ κ°i64 <long>β λΆνΈ μλ 64λΉνΈ κ°s16 <string>β UTF-16 λ¬Έμμ΄ (Android 13+λutf16μ¬μ©)
μ β MediaTek νΈλμ μμ uid 1λ‘ λ€νΈμν¬ λͺ¨λν°λ§ μμ:
service call mtkconnmetrics 8 i32 1
4. μ μ μλ λ©μλ κ°μ 곡격
ν€λ νμΌμ΄ μμ λλ μ½λλ₯Ό λ°λ³΅ μ€ννμ¬ μ€λ₯κ° λ€μκ³Ό κ°μ΄ λ³κ²½λ λκΉμ§ μ§νν μ μμ΅λλ€:
Result: Parcel(00000000 00000000) # "Not a data message"
μ μ Parcel μλ΅ λλ SecurityException.
for i in $(seq 1 50); do
printf "[+] %2d -> " $i
service call mtkconnmetrics $i 2>/dev/null | head -1
done
μλΉμ€κ° proguardλ‘ μ»΄νμΌλ κ²½μ° λ§€νμ μΆμΈ‘ν΄μΌ ν©λλ€ β λ€μ λ¨κ³λ₯Ό μ°Έμ‘°νμΈμ.
5. Mapping codes β methods via onTransact()
μΈν°νμ΄μ€λ₯Ό ꡬννλ jar/odexλ₯Ό λμ»΄νμΌν©λλ€ (AOSP μ€ν
μ /system/frameworkλ₯Ό νμΈνμΈμ; OEMμ μ’
μ’
/system_ext λλ /vendorλ₯Ό μ¬μ©ν©λλ€).
Stub.onTransact()λ₯Ό κ²μνμΈμ β μ¬κΈ°μλ κ±°λν switch(transactionCode)κ° ν¬ν¨λμ΄ μμ΅λλ€:
case TRANSACTION_updateCtaAppStatus: // 5
data.enforceInterface(DESCRIPTOR);
int appId = data.readInt();
boolean ok = data.readInt() != 0;
updateCtaAppStatus(appId, ok);
reply.writeNoException();
return true;
μ΄μ νλ‘ν νμ κ³Ό λ§€κ°λ³μ μ νμ΄ λͺ νν©λλ€.
6. λλ½λ κΆν κ²μ¬ μ°ΎκΈ°
ꡬν(μ’
μ’
λ΄λΆ Impl ν΄λμ€)μ κΆν λΆμ¬λ₯Ό λ΄λΉν©λλ€:
private void updateCtaAppStatus(int uid, boolean status) {
if (!isPermissionAllowed()) {
throw new SecurityException("uid " + uid + " rejected");
}
/* privileged code */
}
μ΄λ¬ν λ
Όλ¦¬ λλ νΉκΆ UIDμ νμ΄νΈλ¦¬μ€νΈ(μ: uid == 1000 /*system*/ )μ λΆμ¬λ μ·¨μ½μ μ§νμ
λλ€.
μ¬λ‘ μ°κ΅¬ β MediaTek startMonitorProcessWithUid() (νΈλμμ
8)μ κΆν κ²μ΄νΈ μμ΄ Netlink λ©μμ§λ₯Ό μμ ν μ€ννμ¬ λΉνΉκΆ μ±μ΄ 컀λμ Netfilter λͺ¨λκ³Ό μνΈμμ©νκ³ μμ€ν
λ‘κ·Έλ₯Ό μ€νΈν μ μκ² ν©λλ€.
7. νκ° μλν
Binder μ μ°°μ κ°μννλ λꡬ / μ€ν¬λ¦½νΈ:
- binderfs β μλΉμ€λ³ λ
Έλκ° μλ
/dev/binderfsλ₯Ό λ ΈμΆ binder-scanner.pyβ λ°μΈλ ν μ΄λΈμ νμνκ³ ACLμ μΆλ ₯- Frida λ¨μΆν€:
Java.perform(()=>console.log(android.os.ServiceManager.listServices().toArray()))
References
- Android Services 101 β Pentest Partners
- Android Developer Docs β AIDL
- Android Developer Docs β IBinder
- Understanding Binder, Talk @ Google
Tip
AWS ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training AWS Red Team Expert (ARTE)
GCP ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:HackTricks Training GCP Red Team Expert (GRTE)
Azure ν΄νΉ λ°°μ°κΈ° λ° μ°μ΅νκΈ°:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks μ§μνκΈ°
- ꡬλ κ³ν νμΈνκΈ°!
- **π¬ λμ€μ½λ κ·Έλ£Ή λλ ν λ κ·Έλ¨ κ·Έλ£Ήμ μ°Έμ¬νκ±°λ νΈμν° π¦ @hacktricks_liveλ₯Ό νλ‘μ°νμΈμ.
- HackTricks λ° HackTricks Cloud κΉνλΈ λ¦¬ν¬μ§ν 리μ PRμ μ μΆνμ¬ ν΄νΉ νΈλ¦μ 곡μ νμΈμ.


