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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«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屿§ããããæå®ãããããŒãžã§ã³ãããé«ãããŒãžã§ã³ã§ã¯æš©éã®èŠæ±ã忢ããŸãã
Androidã¢ããªã±ãŒã·ã§ã³ã¯æåã«ãã¹ãŠã®æš©éãèŠæ±ããå¿
èŠã¯ãªããåçã«æš©éãèŠæ±ããããšãã§ããŸããããã¹ãŠã®æš©éã¯ãããã§ã¹ãã«å®£èšãããŠããå¿
èŠããããŸã**ã
ã¢ããªãæ©èœãå
¬éããéã«ã¯ãç¹å®ã®æš©éãæã€ã¢ããªã®ã¿ãã¢ã¯ã»ã¹ã§ããããã«å¶éããããšãã§ããŸãã
æš©éèŠçŽ ã«ã¯äžã€ã®å±æ§ããããŸãïŒ
- æš©éã®name
- é¢é£ããæš©éãã°ã«ãŒãåããããã®permission-group屿§
- æš©éãã©ã®ããã«ä»äžããããã瀺ãprotection-levelãåã€ã®ã¿ã€ãããããŸãïŒ
- NormalïŒã¢ããªã«æ¢ç¥ã®è åšããªãå Žåã«äœ¿çšãããŸãããŠãŒã¶ãŒã¯æ¿èªããå¿ èŠã¯ãããŸããã
- DangerousïŒèŠæ±ãããã¢ããªã±ãŒã·ã§ã³ã«ææ Œããã¢ã¯ã»ã¹ãä»äžããããšã瀺ããŸãããŠãŒã¶ãŒã«æ¿èªãæ±ããããŸãã
- SignatureïŒã³ã³ããŒãã³ãããšã¯ã¹ããŒãããã®ãšåãèšŒææžã§çœ²åãããã¢ããªã®ã¿ãæš©éãä»äžãããŸããããã¯æã匷åãªä¿è·ã¿ã€ãã§ãã
- SignatureOrSystemïŒã³ã³ããŒãã³ãããšã¯ã¹ããŒãããã®ãšåãèšŒææžã§çœ²åãããã¢ããªãŸãã¯ã·ã¹ãã ã¬ãã«ã®ã¢ã¯ã»ã¹ã§å®è¡ãããŠããã¢ããªã®ã¿ãæš©éãä»äžãããŸãã
Pre-Installed Applications
ãããã®ã¢ããªã¯äžè¬çã«**/system/appãŸãã¯/system/priv-appãã£ã¬ã¯ããªã«ããããã®äžã«ã¯æé©åããããã®ããããŸãïŒclasses.dexãã¡ã€ã«ãèŠã€ãããªãããšããããŸãïŒããããã®ã¢ããªã±ãŒã·ã§ã³ã¯ãæã«ã¯éå°ãªæš©éã§å®è¡ãããŠãã**ããã確èªãã䟡å€ããããŸãïŒã«ãŒããšããŠïŒã
- AOSPïŒAndroid OpenSource ProjectïŒROMã«ä»å±ããŠãããã®
- ããã€ã¹ã®è£œé å ã«ãã£ãŠè¿œå ããããã®
- æºåž¯é»è©±ã®ãããã€ããŒã«ãã£ãŠè¿œå ããããã®ïŒåœŒãããè³Œå ¥ããå ŽåïŒ
Rooting
ç©ççãªAndroidããã€ã¹ã«ã«ãŒãã¢ã¯ã»ã¹ãååŸããã«ã¯ãäžè¬çã«1ã€ãŸãã¯2ã€ã®è匱æ§ãæªçšããå¿
èŠããããŸãããããã¯éåžžãããã€ã¹ããã³ããŒãžã§ã³ã«ç¹æã§ãã
ãšã¯ã¹ããã€ããæåãããšãéåžžãLinuxã®suãã€ããªããŠãŒã¶ãŒã®PATHç°å¢å€æ°ã§æå®ãããå ŽæïŒäŸïŒ/system/xbinïŒã«ã³ããŒãããŸãã
suãã€ããªãèšå®ããããšãå¥ã®Androidã¢ããªãsuãã€ããªãšã€ã³ã¿ãŒãã§ãŒã¹ããã«ãŒãã¢ã¯ã»ã¹ã®ãªã¯ãšã¹ããåŠçããŸããããã«ã¯SuperuserãSuperSUïŒGoogle Playã¹ãã¢ã§å
¥æå¯èœïŒãå«ãŸããŸãã
Caution
ã«ãŒãåããã»ã¹ã¯éåžžã«å±éºã§ãããããã€ã¹ã«æ·±å»ãªæå·ãäžããå¯èœæ§ãããããšã«æ³šæããŠãã ããã
ROMs
ã«ã¹ã¿ã ãã¡ãŒã ãŠã§ã¢ãã€ã³ã¹ããŒã«ããŠOSã眮ãæããããšãå¯èœã§ããããã«ãããå€ãããã€ã¹ã®æçšæ§ãæ¡åŒµãããããœãããŠã§ã¢å¶éãåé¿ããããææ°ã®Androidã³ãŒãã«ã¢ã¯ã»ã¹ãããã§ããŸãã
OmniROMãLineageOSã¯äœ¿çšããã®ã«äººæ°ã®ãããã¡ãŒã ãŠã§ã¢ã®äºã€ã§ãã
ã«ã¹ã¿ã ãã¡ãŒã ãŠã§ã¢ãã€ã³ã¹ããŒã«ããããã«ããã€ã¹ãã«ãŒãåããå¿ èŠã¯ãªãããšããããŸããäžéšã®è£œé å ã¯ãææžåãããå®å šãªæ¹æ³ã§ããŒãããŒããŒã®ããã¯è§£é€ãèš±å¯ããŠããŸãã
Implications
ããã€ã¹ãã«ãŒãåããããšãä»»æã®ã¢ããªãã«ãŒããšããŠã¢ã¯ã»ã¹ãèŠæ±ã§ããããã«ãªããŸããæªæã®ããã¢ããªã±ãŒã·ã§ã³ããããååŸãããšãã»ãŒãã¹ãŠã«ã¢ã¯ã»ã¹ã§ããé»è©±ãæå·ãããããšãã§ããŸãã
Android Application Fundamentals
- Androidã¢ããªã±ãŒã·ã§ã³ã®åœ¢åŒã¯_ 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
Androidéçºã§ã¯ãJavaãŸãã¯Kotlinãã¢ããªäœæã«äœ¿çšãããŸãããã¹ã¯ãããã¢ããªã®ããã«JVMã䜿çšãã代ããã«ãAndroidã¯ãã®ã³ãŒããDalvik Executable (DEX)ãã€ãã³ãŒãã«ã³ã³ãã€ã«ããŸãã以åã¯ãDalvikä»®æ³ãã·ã³ããã®ãã€ãã³ãŒããåŠçããŠããŸããããçŸåšã§ã¯æ°ããAndroidããŒãžã§ã³ã§ã¯Android Runtime (ART)ãåŒãç¶ãã§ããŸãã
ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ã§ã¯ãSmaliãéèŠã«ãªããŸããããã¯DEXãã€ãã³ãŒãã®äººéãèªããããŒãžã§ã³ã§ããœãŒã¹ã³ãŒãããã€ãã³ãŒãåœä»€ã«å€æããã¢ã»ã³ããªèšèªã®ããã«æ©èœããŸããSmaliãšbaksmaliã¯ããã®æèã§ã®ã¢ã»ã³ããªããã³éã¢ã»ã³ããªããŒã«ãæããŸãã
Intents
ã€ã³ãã³ãã¯ãAndroidã¢ããªããã®ã³ã³ããŒãã³ãéãŸãã¯ä»ã®ã¢ããªãšéä¿¡ããããã®äž»èŠãªææ®µã§ãããããã®ã¡ãã»ãŒãžãªããžã§ã¯ãã¯ãã¢ããªéãŸãã¯ã³ã³ããŒãã³ãéã§ããŒã¿ãéã¶ããšãã§ããHTTPéä¿¡ã§ã®GET/POSTãªã¯ãšã¹ãã®ããã«æ©èœããŸãã
ãããã£ãŠãã€ã³ãã³ãã¯åºæ¬çã«ã³ã³ããŒãã³ãéã§æž¡ãããã¡ãã»ãŒãžã§ããã€ã³ãã³ãã¯ç¹å®ã®ã³ã³ããŒãã³ããã¢ããªã«åããããããšããç¹å®ã®åå人ãªãã§éä¿¡ãããããšãã§ããŸãã
ç°¡åã«èšãã°ãã€ã³ãã³ãã¯æ¬¡ã®ããã«äœ¿çšã§ããŸãïŒ
- ã¢ã¯ãã£ããã£ãéå§ãããããéåžžã¯ã¢ããªã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãéã
- ã·ã¹ãã ãã¢ããªã«å€æŽãéç¥ããããã®ãããŒããã£ã¹ããšããŠ
- ããã¯ã°ã©ãŠã³ããµãŒãã¹ãéå§ã忢ãéä¿¡ãããã
- ContentProvidersãä»ããŠããŒã¿ã«ã¢ã¯ã»ã¹ãããã
- ã€ãã³ããåŠçããããã®ã³ãŒã«ããã¯ãšããŠ
è匱ãªå Žåãã€ã³ãã³ãã¯ããŸããŸãªæ»æãå®è¡ããããã«äœ¿çšãããå¯èœæ§ããããŸãã
Intent-Filter
ã€ã³ãã³ããã£ã«ã¿ãŒã¯ãã¢ã¯ãã£ããã£ããµãŒãã¹ããŸãã¯ãããŒããã£ã¹ãã¬ã·ãŒããŒãç°ãªãã¿ã€ãã®ã€ã³ãã³ããšã©ã®ããã«çžäºäœçšã§ããããå®çŸ©ããŸããåºæ¬çã«ããããã®ã³ã³ããŒãã³ãã®èœåã説æããã©ã®ãããªã¢ã¯ã·ã§ã³ãå®è¡ã§ãããããŸãã¯ã©ã®ãããªãããŒããã£ã¹ããåŠçã§ãããã瀺ããŸãããããã®ãã£ã«ã¿ãŒã宣èšããäž»ãªå Žæã¯AndroidManifest.xmlãã¡ã€ã«å ã§ããããããŒããã£ã¹ãã¬ã·ãŒããŒã®å Žåã¯ã³ãŒãã£ã³ã°ããããšãéžæè¢ã§ãã
ã€ã³ãã³ããã£ã«ã¿ãŒã¯ãã«ããŽãªãã¢ã¯ã·ã§ã³ãããã³ããŒã¿ãã£ã«ã¿ãŒã§æ§æããã远å ã®ã¡ã¿ããŒã¿ãå«ããããšãã§ããŸãããã®èšå®ã«ãããã³ã³ããŒãã³ãã¯å®£èšãããåºæºã«äžèŽããç¹å®ã®ã€ã³ãã³ããåŠçã§ããŸãã
Androidã³ã³ããŒãã³ãïŒã¢ã¯ãã£ããã£/ãµãŒãã¹/ã³ã³ãã³ããããã€ããŒ/ãããŒããã£ã¹ãã¬ã·ãŒããŒïŒã®éèŠãªåŽé¢ã¯ããã®å¯èŠæ§ãŸãã¯å
¬éç¶æ
ã§ããã³ã³ããŒãã³ãã¯ã**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ã¯ã以åã«å®£èšãããã€ã³ãã³ãã®ACTION_SENDã§ãããExtraã¯mailto Uriã§ãïŒExtraã¯ã€ã³ãã³ããæåŸ ããŠããè¿œå æ å ±ã§ãïŒã
ãã®ã€ã³ãã³ãã¯ã以äžã®äŸã®ããã«ãããã§ã¹ãå ã§å®£èšããå¿ èŠããããŸãïŒ
<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
ã€ã³ãã³ããã£ã«ã¿ãŒã¯ãã¡ãã»ãŒãžãåä¿¡ããããã«ã¢ã¯ã·ã§ã³ãããŒã¿ãããã³ã«ããŽãªãäžèŽããå¿ èŠããããŸãã
âã€ã³ãã³ã解決âããã»ã¹ã¯ãã©ã®ã¢ããªãåã¡ãã»ãŒãžãåä¿¡ãã¹ãããæ±ºå®ããŸãããã®ããã»ã¹ã¯ãåªå
åºŠå±æ§ãèæ
®ããããã¯ã€ã³ãã³ããã£ã«ã¿ãŒå®£èšã§èšå®ã§ããŸããåªå
床ãé«ãæ¹ãéžæãããŸãããã®åªå
床ã¯-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
åã®ã€ã³ãã³ããšã¯ç°ãªãã1ã€ã®ã¢ããªã ãã§ãªãããããŒããã£ã¹ãã€ã³ãã³ãã¯è€æ°ã®ã¢ããªã§åä¿¡ãããããšãã§ããŸãããã ããAPIããŒãžã§ã³14以éã¯ãIntent.setPackageã䜿çšããŠã¡ãã»ãŒãžãåä¿¡ããã¢ããªãæå®ããããšãå¯èœã§ãã
ãŸãããããŒããã£ã¹ããéä¿¡ããéã«æš©éãæå®ããããšãå¯èœã§ããåä¿¡ã¢ããªã¯ãã®æš©éãæã£ãŠããå¿ èŠããããŸãã
ãããŒããã£ã¹ãã«ã¯2çš®é¡ããããŸãïŒéåžžïŒéåæïŒãšé åºä»ãïŒåæïŒãé åºã¯åä¿¡è èŠçŽ å ã®èšå®ãããåªå 床ã«åºã¥ããŠããŸããåã¢ããªã¯ãããŒããã£ã¹ããåŠçã転éããŸãã¯ç Žæ£ããããšãã§ããŸãã
Contextã¯ã©ã¹ã®é¢æ°sendBroadcast(intent, receiverPermission)ã䜿çšããŠãããŒããã£ã¹ããéä¿¡ããããšãå¯èœã§ãã
ãŸãã**LocalBroadCastManagerã®sendBroadcast**颿°ã䜿çšãããšãã¡ãã»ãŒãžãã¢ããªãåºãããšã¯ãããŸãããããã䜿çšãããšãåä¿¡è
ã³ã³ããŒãã³ãããšã¯ã¹ããŒãããå¿
èŠãããããŸããã
Sticky Broadcasts
ãã®çš®ã®ãããŒããã£ã¹ãã¯éä¿¡ãããåŸãé·æéã¢ã¯ã»ã¹å¯èœã§ãã
ãããã¯APIã¬ãã«21ã§éæšå¥šãšãªãã䜿çšããªãããšãæšå¥šãããŠããŸãã
ããã«ãããä»»æã®ã¢ããªã±ãŒã·ã§ã³ãããŒã¿ãçèŽããããšãã§ããã ãã§ãªããããŒã¿ã倿Žããããšãå¯èœã§ãã
ãstickyããšããåèªãå«ã颿°ïŒäŸïŒsendStickyBroadcastãsendStickyBroadcastAsUserïŒãèŠã€ããå Žåã¯ã圱é¿ã確èªããåé€ã詊ã¿ãŠãã ããã
Deep links / URL schemes
Androidã¢ããªã±ãŒã·ã§ã³ã§ã¯ããã£ãŒããªã³ã¯ã䜿çšããŠURLãä»ããŠçŽæ¥ã¢ã¯ã·ã§ã³ïŒã€ã³ãã³ãïŒãéå§ããŸããããã¯ãã¢ã¯ãã£ããã£å ã§ç¹å®ã®URLã¹ããŒã ã宣èšããããšã«ãã£ãŠè¡ãããŸããAndroidããã€ã¹ããã®ã¹ããŒã ãæã€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ãèšå®ãããŠãŒã¶ãŒãšã®ã€ã³ã¿ã©ã¯ã·ã§ã³ã®ããã«ã¢ã¯ãã£ããã£ãæºåããŸãã
ã¢ããªã±ãŒã·ã§ã³ã¯ã©ã¹
Androidéçºã§ã¯ãã¢ããªã¯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 ã¯ãããã¯ã°ã©ãŠã³ããªãã¬ãŒã·ã§ã³ãå®è¡ã§ããèœåãæã€ãã®ã§ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãªãã§ã¿ã¹ã¯ãå®è¡ããŸãããããã®ã¿ã¹ã¯ã¯ããŠãŒã¶ãŒãç°ãªãã¢ããªã±ãŒã·ã§ã³ã«åãæ¿ããŠãå®è¡ãç¶ããããšãã§ããããããµãŒãã¹ã¯é·æéå®è¡ãããæäœã«ãšã£ãŠéèŠã§ãã
ãµãŒãã¹ã¯å€çšéã§ãããããŸããŸãªæ¹æ³ã§éå§ã§ããŸããã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 ãæäœã§ããç¹ã« Ordered Broadcasts ã§ã¯ãIntent ã倿ŽãŸãã¯åé€ããå¿
èŠããããããã¬ã·ãŒããŒã«ããããŒã¿æ€èšŒã®éèŠæ§ã匷調ãããŸãã
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ã¯äž»ã«2çš®é¡ã®WebViewãæäŸããŠããŸãïŒ
- WebViewClientã¯åºæ¬çãªHTMLã«ã¯é©ããŠããŸãããJavaScriptã®ã¢ã©ãŒãæ©èœããµããŒãããŠããªããããXSSæ»æã®ãã¹ãã«åœ±é¿ãäžããŸãã
- WebChromeClientã¯ãã«Chromeãã©ãŠã¶ã®äœéšã«è¿ãåäœãããŸãã
éèŠãªç¹ã¯ãWebViewãã©ãŠã¶ã¯ããã€ã¹ã®ã¡ã€ã³ãã©ãŠã¶ãšã¯ãããŒãå ±æããªãããšã§ãã
ã³ã³ãã³ããèªã¿èŸŒãããã«ãloadUrlãloadDataãloadDataWithBaseURLãªã©ã®ã¡ãœãããå©çšå¯èœã§ãããããã®URLããã¡ã€ã«ãå®å
šã«äœ¿çšã§ããããšã確èªããããšãéèŠã§ããã»ãã¥ãªãã£èšå®ã¯WebSettingsã¯ã©ã¹ãéããŠç®¡çã§ããŸããäŸãã°ãsetJavaScriptEnabled(false)ã§JavaScriptãç¡å¹ã«ããããšã§ãXSSæ»æãé²ãããšãã§ããŸãã
JavaScriptã®ãããªããžãã¯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ã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªãã£
- Androidã¢ããªã±ãŒã·ã§ã³ã®è匱æ§
- Androidã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãææ³
- Androidã¢ããªã±ãŒã·ã§ã³ã®éã³ã³ãã€ã«
- Androidã¢ããªã±ãŒã·ã§ã³ã®ãããã°
- Androidã¢ããªã±ãŒã·ã§ã³ã®ãããã¬ãŒã·ã§ã³ãã¹ã
- Androidã¢ããªã±ãŒã·ã§ã³ã®ã»ãã¥ãªãã£ããŒã«
- 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. 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()))
åèæç®
- 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ããµããŒããã
- ãµãã¹ã¯ãªãã·ã§ã³ãã©ã³ã確èªããŠãã ããïŒ
- **ð¬ Discordã°ã«ãŒããŸãã¯ãã¬ã°ã©ã ã°ã«ãŒãã«åå ããããTwitter ðŠ @hacktricks_liveããã©ããŒããŠãã ããã
- HackTricksããã³HackTricks Cloudã®GitHubãªããžããªã«PRãæåºããŠãããã³ã°ããªãã¯ãå ±æããŠãã ããã


