EN JP CN

ANDROID.LIFECYCLE.SV.FRAGMENTINJ

ANDROID.LIFECYCLE.SV.FRAGMENTINJ

未検証のフラグメント クラス名

セキュリティのため、アプリケーションは通、他のアプリケーションの機密データにアクセスできません。場合によっては、機能の再利用を容易にするために、アプリケーションが他のアプリケーションのコンポーネント (アクティビティなど) を呼び出すことができます。アクティビティは入力の意図データにアクセスするため、不良アプリケーションはエクスポートされたアクティビティを呼び出し、悪意のあるデータを提供することができます。ターゲットアプリケーションにおいて、データが適切に無害化または検証されていない場合は、脆弱性がトリガーされる場合があります。

この脆弱性は、Android 4.3 Jelly Bean 以前に発見されました。

脆弱性とリスク

エクスポートされたアクティビティを使用して、PreferenceActivity クラスを拡張した任意のアプリケーションは、自動的に脆弱になります。悪意のあるアプリケーションは、PreferenceActivity に任意のフラグメントを ロードさせることができます。これは通常ユーザーアクティビティ内にロードされます。悪意のあるアプリケーションは制御できるようになります。

PreferenceActivity を使用するすべてのアプリケーションは脆弱です。

軽減と防止

Google は新しく保護された API である PreferenceActivity.isValidFragment を追加して、Android 4.4 KitKat をパッチしました。これはフラグメントが動的に開始される前に呼ばれます。 isValidFragment メソッドはオーバーライドする必要があります。

Klocwork メソッド isValidFragment が検証のため呼び出されないとエラーを報告します。

例 1

11  public class MyActivity extends PreferenceActivity {
12    protected void onCreate(Bundle savedInstanceState) {
13        super.onCreate(savedInstanceState);
14        final String initialFragment = getIntent().getStringExtra("EXTRA_SHOW_FRAGMENT");
15        final Fragment f = Fragment.instantiate(this, initialFragment, null);
16        final FragmentTransaction transaction = getFragmentManager().beginTransaction();
17        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
18        transaction.replace(11, f);
19        transaction.commitAllowingStateLoss();
20 }

ANDROID.LIFECYCLE.SV.FRAGMENTINJ はライン 19 で報告されます。意図はアプリケーションの外部から来ます。追加情報を使用して、フラグメントが開始されます。間に情報の確認は行われません。

例 2

11  public class MyActivity extends PreferenceActivity {
12      protected void onCreate(Bundle savedInstanceState) {
13          super.onCreate(savedInstanceState);
14          final String initialFragment = getIntent().getStringExtra("EXTRA_SHOW_FRAGMENT");
15          if (!isValidFragment(initialFragment)) {
16              throw new IllegalArgumentException("Invalid fragment for this activity");
17          }
18          final Fragment f = Fragment.instantiate(this, initialFragment, null);
19          final FragmentTransaction transaction = getFragmentManager().beginTransaction();
20          transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
21          transaction.replace(11, f);
22          transaction.commitAllowingStateLoss();
23      }
24  
25      public boolean isValidFragment(final String name) {
26          //validate here …
27      }

ライン 15 で検証が行われるため、フィールドは欠陥は報告されません。