ANDROID.LIFECYCLE.SV.FRAGMENTINJ

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

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

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

脆弱性とリスク

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

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

軽減と防止

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

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

例 1

コピー
  public class MyActivity extends PreferenceActivity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final String initialFragment = getIntent().getStringExtra("EXTRA_SHOW_FRAGMENT");
        final Fragment f = Fragment.instantiate(this, initialFragment, null);
        final FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        transaction.replace(11, f);
        transaction.commitAllowingStateLoss();
 }

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

例 2

コピー
  public class MyActivity extends PreferenceActivity {
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          final String initialFragment = getIntent().getStringExtra("EXTRA_SHOW_FRAGMENT");
          if (!isValidFragment(initialFragment)) {
              throw new IllegalArgumentException("Invalid fragment for this activity");
          }
          final Fragment f = Fragment.instantiate(this, initialFragment, null);
          final FragmentTransaction transaction = getFragmentManager().beginTransaction();
          transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
          transaction.replace(11, f);
          transaction.commitAllowingStateLoss();
      }
  
      public boolean isValidFragment(final String name) {
          //validate here …
      }

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