화면 오버레이 공격은 사용자가 클릭하거나 상호 작용하도록 속이는 가짜(악성) 화면으로 애플리케이션 화면의 일부를 덮는 공격 방법을 말합니다.
오버레이 공격의 목표는 일반적으로 세가지 범주 안에 들어갑니다.
1.데이터 수집 데이터 도난 : 사용자가 입력하는 모든 정보를 공격자에게 전송합니다.
백도어 설치 : 보안조치를 우회하고 침입 및 악성 코드를 전달합니다.
권한 상승 : 악성코드에 대한 권한 부여 및 공격자 권한 상승
악성 앱을 포어그라운드로 밀어넣어 실제 권한을 요청하게끔 만들 수 있습니다.
공격자는 터치 이벤트를 가로채기 위해 터치 영역을 오버레이 하게 됩니다.
기존의 View는 오버레이에 전부 감싸여져 있습니다.
해당 대안은 View.setFilterTouchesWhenObscured(true)
이나
layout의 android:filterTouchesWhenObscured="true"
을 통해 대응이 가능합니다.
부분 가림공격은 오버레이가 부분적으로 View를 가려서 공격하는 기법입니다.
해당 공격은 FLAG_WINDOW_IS_PARTIALLY_OBSCURED
를 통해 수동으로 무시가 가능합니다.
주의해야 할 것은 APP이 Toast 또한 Overlay로 판단 한다는 것입니다.
즉,FLAG_WINDOW_IS_PARTIALLY_OBSCURED
를 적용하여 오버레이 발생시 Touch를 막았다면
Toast 팝업 시에도 적용됩니다.
View가 있는 Custom Toast를 만들고, Message Queue에 수많은 토스트 메세지를 추가하여 공격하는 방법입니다.
API 30부터 커스텀 토스트를 차단하였으며, 31부터 완전히 해제 되었습니다.
LayoutInflater layoutInflater = getLayoutInflater();
View mLayout = layoutInflater.inflate(R.layout.tapjacking_dialog,null);
WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(1200,1200,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE|
WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH,
PixelFormat.TRANSPARENT);
params.x = 0;
params.y = 0;
windowManager.addView(mLayout,params);
위의 코드를 통해 Overlay View를 만들수 있으니 한번 테스트 해보시기 바랍니다.
FLAG_WINDOW_IS_OBSCURED
가 추가 되었습니다.
터치한 영역에 오버레이가 있을경우, 감지가 가능합니다.
추가로 아래의 코드를 통해 오버레이가 올라갔을 경우, 이벤트를 막을수도 있습니다.
secureFilterButton.setFilterTouchesWhenObscured(true)
해당 코드는 API 31 이후로
setHideOverlayWindows
로 대체되었습니다.
API 23(Android 6)에서부터 모든 앱에서 오버레이를 그리는 데 필요한ACTION_MANAGE_OVERLAY_PERMISSION
이라는 새로운 권한 플래그가 도입되었습니다.
오버레이 기능을 탑재하려면 해당 권한을 반드시 받아야 하며, Google에서 배포되는 모든 앱들은 해당 플래그가 알아서 적용됩니다.
API29부터 FLAG_WINDOW_IS_PARTIALLY_OBSCURED
이 추가 되었습니다.
기존과 다른점은 터치 이외의 영역에 창이 있을때도 감지를 하게 되었습니다.
partialObscureButton.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
int flags = event.getFlags();
Boolean theBadTouch = ((flags & FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0);
if (theBadTouch)
{
statusText.setText("PartialObscureButton: Tapjack detected! (flags: " + flags + ")");
// do not consume
return true;
}
return false;
}
});
API 31(Android 12)부터 Android는 악성 오버레이로부터 보호하는 확실한 기능을 도입했습니다.
이 기능을 사용하려면 setHideOverlayWindows(true)
메소드를 호출합니다.
해당 기능을 사용하면 오버레이가 해당 Activity에서 표시되지 않습니다.
개발자는 핀 코드, 비밀번호, 신용 카드 정보 등과 같이 사용자에게 민감한 정보를 요청하는 모든 활동 보기에 이 기능을 적용하면 오버레이가 이를 가리는것을 방지 할수 있습니다.
Button detectOverlayButton = (Button)findViewById(R.id.btnDetect);
detectOverlayButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v)
{
MainActivity.this.getWindow().setHideOverlayWindows(true);
}
});
Protecting Against Android Overlay Attacks | Guardsquare
GitHub - Ch0pin/TapJacking-Attacks: TapJacking Attacks Demo
FLAG_WINDOW_IS_OBSCURED not working on newer android
Android – How to consume child view’s touch event in parent view’s touchlistener