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をサポヌトする

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を芋぀けた堎合は、圱響を確認し、削陀を詊みおください。

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
  1. Androidアプリケヌションの基本
  2. Androidアプリケヌションの構造
  3. Androidアプリケヌションのセキュリティ
  4. Androidアプリケヌションの脆匱性
  5. Androidアプリケヌションのテスト手法
  6. Androidアプリケヌションの逆コンパむル
  7. Androidアプリケヌションのデバッグ
  8. Androidアプリケヌションのペネトレヌションテスト
  9. Androidアプリケヌションのセキュリティツヌル
  10. 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()))

参考文献

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をサポヌトする