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 で検証が行われるため、フィールドは欠陥は報告されません。