[Android] コンポーネントのセキュリティアクティビティ

序文

前回の記事では、コンポーネントのセキュリティ問題を体系的にまとめましたが、本記事では、さまざまなコンポーネントから詳細に開始し、コンポーネントの実装方法を深く分析します。コンポーネントのセキュリティhttps://blog.csdn.net/xiru9972/article/details/123537641?ops_request_misc=&request_id=7a89a72fdd464cee90c20b2b88549c11&biz_id=&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~koosearch ~default- 1-123537641- null-null.268%5Ev1%5Econtrol&utm_term=%E7%BB%84%E4%BB%B6&spm=1018.2226.3001.4450

関連情報

1. ライフサイクル

「アクティビティ」とは、Android アプリケーション内で実行される単一のユーザー インターフェイス コンポーネントを指し、通常はユーザーが操作できる画面です。アクティビティにはライフサイクルがあり、これには複数の異なる状態とコールバック メソッドが含まれます。アクティビティのライフサイクルは次のとおりです。

  1. onCreate(): このメソッドは、アクティビティが最初に作成されるときに呼び出されます。このメソッドでは、レイアウト ファイルの設定、ビュー要素のバインドなどの初期化を実行できます。
  2. onStart(): このメソッドは、アクティビティがユーザーに表示されると呼び出されます。このメソッドでは、アニメーションやその他のユーザー エクスペリエンス効果の実行を開始できます。
  3. onResume(): このメソッドは、アクティビティがフォアグラウンドに来てユーザーとの対話を開始するときに呼び出されます。この方法では、サービスの開始やブロードキャスト受信機の登録など、いくつかのバックグラウンド タスクを開始できます。
  4. onPause(): このメソッドは、アクティビティが前景フォーカスを失ってもまだ表示されている場合に呼び出されます。この方法では、すべてのアニメーションやその他のユーザー エクスペリエンス効果を停止して、システム リソースを節約できます。
  5. onStop(): このメソッドは、アクティビティが完全に覆われているか、表示されなくなったときに呼び出されます。この方法では、サービスの停止やブロードキャスト受信機のログアウトなど、すべてのバックグラウンド タスクを停止できます。
  6. onRestart(): このメソッドは、ユーザーがアクティビティに戻ったときに呼び出されます。このメソッドでは、一部のデータを再初期化したり、一部のビュー要素を再バインドしたりできます。
  7. onDestroy(): このメソッドは、アクティビティが破棄されるときに呼び出されます。この方法では、ブロードキャスト受信機の登録解除やバインドされたサービスの解放など、すべてのリソースを解放できます。

2. 起動方法

明示的起動暗黙的起動に分かれる

  • 明示的起動: 明示的起動とは、起動するアクティビティのクラス名を指定してアクティビティを起動する方法です。例えば:
Intent intent = new Intent(this, MyActivity.class);
startActivity(intent);

この場合、起動するアクティビティを明示的に指定するため、明示的起動と呼ばれます。

  • 暗黙的スタートアップ: 暗黙的スタートアップは、一連のインテント フィルターを指定してアクティビティを開始する方法です。インテント フィルターはアクティビティ マニフェスト ファイルで定義され、アクティビティがどのインテントに応答できるかを記述するために使用されます。暗黙的起動では、インテントは起動するアクティビティのクラス名を指定しませんが、インテントの一部の属性 (アクション、カテゴリ、データなど) を指定すると、システムはこれらに一致するアクティビティを見つけます。開始する属性。例えば:
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.example.com"));
startActivity(intent);

この場合、インテントはアクションを ACTION_VIEW 、データを「http://www.example.com」として指定しており、システムはこのタイプのインテントに応答するアクティビティを探して開始します。

3. インテントフィルター

インテント フィルター (インテント フィルター) は、コンポーネント (アクティビティ、サービス、ブロードキャスト レシーバーなど) がどのインテントに応答できるかを記述するために使用されます。インテント フィルターには、アクション、カテゴリ、データなどのインテント プロパティのセットが含まれており、コンポーネントが処理できるインテント タイプを記述するために使用されます。

コンポーネントのマニフェスト ファイルでは、<intent-filter>要素を使用してインテント フィルターを定義できます。たとえば、次のマニフェスト ファイルの例は、ACTION_VIEW アクションと http および https データ型に応答するインテント フィルターを定義するアクティビティです。

<activity android:name=".MyActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="http" />
        <data android:scheme="https" />
    </intent-filter>
</activity>

この例では、MyActivity は http および https データ型の ACTION_VIEW アクションとインテントに応答できます。ユーザーが http または https リンクをクリックすると、システムはこのタイプのインテントを処理できるアクティビティを探し、MyActivity を開始します。

4. ローディングモード - 起動モード

アクティビティには 4 つの読み込みモードがあります。

  1. 標準: デフォルトの読み込みモード。アクティビティを開始するたびに、アクティビティがすでに存在するかどうかに関係なく、新しいインスタンスが作成されます。アクティビティがすでに存在する場合、そのアクティビティはタスク スタックの最上位に配置されます。
  2. SingleTop (シングルトップ モード): 開始するアクティビティがすでにタスク スタックの先頭にある場合、新しいインスタンスは作成されず、既存のアクティビティが直接使用されます。アクティビティがスタックの最上位にない場合は、新しいインスタンスが作成され、スタックの最上位に配置されます。
  3. SingleTask (シングル タスク モード): アクティビティを開始するときに、システムはアクティビティのインスタンスがタスク スタックにすでに存在するかどうかを確認します。すでに存在する場合、アクティビティとその上のすべてのアクティビティがスタックからポップされ、アクティビティはスタックの一番上に移動されます。存在しない場合は、新しいインスタンスが作成され、スタックの最上位に配置されます。
  4. SingleInstance (シングル インスタンス モード): このモードでは、システムはアクティビティの新しいタスク スタックを作成し、タスク スタックにはアクティビティのインスタンスのみが含まれます。アクティビティを開始する場合は、タスク スタックがフォアグラウンドに移動し、アクティビティがスタックの一番上に配置されます。

AndroidManifest.xmlの設定方法

activity android:name=".MainActivity" android:launchMode="singleTop"/>

5. タスクスタック

Android システムでは、タスク スタックはアプリケーションにアクティビティを保存するために使用されるスタック構造です。タスク スタックを使用すると、起動シーケンス、シーケンス調整、回復状態など、アプリケーション内のアクティビティを管理できます。各アプリケーションには独自のタスク スタックがあり、アプリケーションによって開始されたすべてのアクティビティが含まれます。

アクティビティが開始されると、タスク スタックの最上位に配置されます。ユーザーがリターン キーを押すと、アクティビティがスタックからポップされ、前のアクティビティが復元されてタスク スタックの一番上に表示されます。ユーザーがホーム ボタンを押すか、別のアプリケーションに切り替えると、アプリケーションのタスク スタックはバックグラウンドに残り、ユーザーが再びアプリケーションに戻るまで待機します。

タスク スタックの実装方法は先入れ先出し (FIFO) です。つまり、最初にタスク スタックに入るアクティビティはスタックの一番下に配置され、最後に入るアクティビティはスタックの最後に配置されます。スタックの一番上。アクティビティの起動モードが SingleTask または SingleInstance の場合、アクティビティはタスク スタックの先頭に配置され、新しいタスク スタックを形成します。

タスク スタックに関する一部の構成は、AndroidManifest.xmlで構成することもできます。

  1. android:launchMode: アクティビティの起動モードを指定するために使用されます。これには、Standard、SingleTop、SingleTask、SingleInstance の 4 つのモードが含まれます。これらの起動モードは、タスク スタック内のアクティビティの位置と動作に影響を与える可能性があります。
  2. android: taskAffinity : アクティビティが属するタスク スタックの名前を指定するために使用されます。デフォルトでは、すべてのアクティビティはアプリケーションのデフォルトのタスク スタックに属します。アクティビティの taskAffinity プロパティがデフォルト値と異なる場合、アクティビティは指定されたタスク スタックに配置されます。
  3. android:allowTaskReparenting: 再起動時にアクティビティがあるタスク スタックから別のタスク スタックに移動できるようにするかどうかを指定するために使用されます。このプロパティが true に設定されている場合、システムは、より良いユーザー エクスペリエンスを実現するために、必要に応じてアクティビティをあるタスク スタックから別のタスク スタックに移動できます。
  4. android:clearTaskOnLaunch: アクティビティの開始時にタスク スタック内のすべてのアクティビティをクリアするかどうかを指定するために使用されます。このプロパティが true に設定されている場合、アクティビティの開始時にタスク スタック内のすべてのアクティビティがクリアされ、アクティビティはスタックの一番下に配置されます。
  5. android:finishOnTaskLaunch: このアクティビティを開始するときにタスク スタック内のすべてのアクティビティを閉じるかどうかを指定するために使用されます。このプロパティが true に設定されている場合、アクティビティの開始時にタスク スタック内のすべてのアクティビティが閉じられ、アクティビティはスタックの一番上に配置されます。

6. エクスポート可能 

これは、前述したコンポーネントのセキュリティでも重要な点ですが、コンポーネントのプロパティがエクスポート可能である場合、リスクは比較的高くなります。

具体的には、アクティビティのエクスポート可能性は次の 2 つの要素に依存します。

  1. AndroidManifest.xml ファイルの android:exported 属性。このプロパティは、アクティビティを他のアプリケーションで開始できるかどうかを決定します。このプロパティが true に設定されている場合、アクティビティは他のアプリケーションによって開始できることを意味し、このプロパティが false に設定されている場合は、アクティビティは同じアプリケーション内の他のコンポーネントによってのみ開始できることを意味します。デフォルトでは、android:exported 属性の値は true です。
  2. インテントフィルターの設定。IntentFilter は、アクティビティが応答できるインテントを指定できます。IntentFilter で Intent が指定されていない場合、他のアプリケーションからアクティビティを開始することはできません。IntentFilter で特定のインテントが指定されている場合、一致するインテントのみがアクティビティを開始できます。同時に、IntentFilter は、インテントの URI のスキーム、権限、パス、およびその他の情報を指定して、アクティビティの起動をさらに制限することもできます。

7. 一般的な方法 

アクティビティでは、一般的なメソッドには次のものがあります。

  1. onCreate(): アクティビティが初めて作成されるときに呼び出され、レイアウトの設定、インターフェイス コントロールの初期化など、いくつかの初期化操作を実行するために使用されます。
  2. onStart(): アクティビティが非表示から表示に変わるときに呼び出され、インターフェイス データを準備するために使用されます。
  3. onResume(): アクティビティがフォアグラウンドに入ったときに呼び出され、アニメーション効果の開始、ブロードキャスト レシーバーの登録、その他の操作に使用されます。
  4. onPause(): アクティビティがフォーカスを失ったときに呼び出され、アニメーション効果やブロードキャスト レシーバーの登録など、いくつかの不要な操作を一時停止するために使用されます。
  5. onStop(): アクティビティが完全に非表示になったときに呼び出され、一部のリソースの解放、一部のサービスの停止などに使用されます。
  6. onRestart(): アクティビティが停止状態から再開するときに呼び出され、インターフェイスのデータとステータスを復元するために使用されます。
  7. onDestroy(): アクティビティが破棄されたときに呼び出され、一部のリソースの解放、ブロードキャスト レシーバーの登録解除、およびその他の操作に使用されます。
  8. startActivityForResult(): 別のアクティビティを開始し、結果が返されるのを待ちます。
  9. setResult(): Activity の戻り結果を設定します。
  10. finish(): 現在のアクティビティを終了します。
  11. getIntent(): 現在のアクティビティを開始するインテントを取得します。
  12. getWindow(): 現在のアクティビティのウィンドウ オブジェクトを取得します。
  13. setContentView(): アクティビティのレイアウトを設定します。
  14. onCreateOptionsMenu() および onOptionsItemSelected(): メニュー項目を作成して応答します。
  15. setTitle() および getSupportActionBar().setTitle(): アクティビティのタイトルを設定します。

アクティビティ関連のセキュリティ問題

Android アプリケーションではアクティビティは重要な役割を果たしますが、誤って使用すると、セキュリティ上の問題が発生する可能性があります。以下は、アクティビティのセキュリティに関する一般的な問題と例です。

  • サービス拒否攻撃: 攻撃者は、アクティビティの launchMode 属性を使用して、タスク スタック内にアクティビティを繰り返し作成し、システム リソースを占有して、システムをクラッシュさせたり、正常に動作させなかったりする可能性があります。
  • ロジック バイパス攻撃: 攻撃者は、インテントを介して特定のパラメーターを渡し、アクティビティをだまして予期しない操作を実行させることで、アプリケーションのロジック チェックをバイパスし、セキュリティ ホールを引き起こすことができます。
    • たとえば、アクセスするためにログインが必要なアクティビティがログイン ステータスを適切にチェックしない場合、攻撃者はログイン検証をバイパスし、機密データや操作に直接アクセスする可能性があります。
    • 別の例としては、エクスポート可能なコンポーネントを直接開くことで、特定の 2 番目のパスワード検証をバイパスできる場合があります。
  • 任意のコンポーネント実行攻撃: 攻撃者はインテントを介して特定のパラメータを渡すことができ、アクティビティが他のアプリケーションの起動やシステム サービスの呼び出しなどの予期しない操作を実行できるようになり、セキュリティ上の脆弱性が引き起こされます。たとえば、ユーザーの承認が必要な操作が適切にチェックされていない場合、インテントのソースとパラメーターが攻撃者によって偽装され、不正な操作が実行される可能性があります。
    • たとえば、LaunchAnywhere
  • 意図的なハイジャック攻撃: 攻撃者は、マルウェアまたはソーシャル エンジニアリング手法を使用して、ユーザーにリンクをクリックさせたり、アプリケーションをダウンロードさせたりすることで、ユーザーをだまして悪意のある活動を開始させ、ユーザー情報の窃取やテキスト メッセージの送信などの違法な操作を実行させることができます。
    • 通常、インテントを受け入れた後にアクティビティが何をしたかを読み取り、攻撃する特定の POC を構築する必要があります。

あとがき 

 この記事では、アクティビティ関連の知識と考えられるセキュリティ問題について詳しく紹介します。アクティビティによって引き起こされる特定の問題については、特定のシナリオに基づいてさらに分析する必要がある場合があります。

おすすめ

転載: blog.csdn.net/xiru9972/article/details/131430016