Tapjacking Vulnerability
タップジャッキングの脆弱性
説明
タップジャッキング(Tapjacking)の脆弱性とは、攻撃者が悪意のあるコンテンツやインターフェースを正規のアプリケーションの上に重ねて表示させ、ユーザーをだまして攻撃者のコンテンツとやり取りさせることを可能にするセキュリティ上の欠陥です。これにより、機密情報の盗難、ログイン資格情報のキャプチャ、またはユーザーに代わっての不正な操作の実行など、さまざまな悪意のある活動につながる可能性があります。
オーバーレイの不適切な処理の例を以下に示します。
<Button
android:id="@+id/buttonLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="LOGIN"
app:layout_constraintBottom_toTopOf="@id/textViewRegister"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/textInputPasswordL"
android:filterTouchesWhenObscured="false"/> // vulnerable
public class YourActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_your_layout);
Button yourButton = findViewById(R.id.yourButtonId);
yourButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Handle button click
}
});
}
}
class YourActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_your_layout)
val yourButton: Button = findViewById(R.id.yourButtonId)
yourButton.setOnClickListener {
// Handle button click
}
}
}
推奨事項
モバイルアプリケーションにおけるタップジャッキングの脆弱性を軽減するには、以下の推奨事項をご検討ください。
- タッチフィルタリングの有効化: 認証プロセスに関与するボタンなどのUI要素について、
android:filterTouchesWhenObscured属性をtrueに設定します。これにより、背後に隠れたビューにタッチイベントがディスパッチされるのを防ぎ、タップジャッキング攻撃のリスクを軽減します。
注意: Android S(12、SDK 31)以降では、別のUIDからの信頼されていないオーバーレイからのタッチイベントをブロックすることで、デフォルトでタップジャッキング攻撃を防ぎます。
オーバーレイの安全な処理の例を以下に示します。
<Button
android:id="@+id/buttonLogin"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="LOGIN"
app:layout_constraintBottom_toTopOf="@id/textViewRegister"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/textInputPasswordL"
android:filterTouchesWhenObscured="true"/>
public class YourActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_your_layout);
Button yourButton = findViewById(R.id.yourButtonId);
yourButton.filterTouchesWhenObscured = true
yourButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Handle button click
}
});
}
}
class YourActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_your_layout)
val yourButton: Button = findViewById(R.id.yourButtonId)
yourButton.isFilterTouchesWhenObscured = true
yourButton.setOnClickListener {
// Handle button click
}
}
}
リンク
標準
- OWASP_MASVS_L1:
- MSTG_PLATFORM_2
- OWASP_MASVS_L2:
- MSTG_PLATFORM_2
- PCI_STANDARDS:
- REQ_2_2
- REQ_6_2
- REQ_6_3
- OWASP_MASVS_v2_1:
- MASVS_CODE_4
- SOC2_CONTROLS:
- CC_2_1
- CC_4_1
- CC_7_1
- CC_7_2
- CC_7_4
- CC_7_5
- HIPAA_CONTROLS:
- SECURITY212
- SECURITY213