Android Intent 리다이렉션

사용자 제공 Intent 리다이렉션

설명

외부 Intent에서 전달된 Intent 객체나 component 정보를 검증하지 않고 startActivity, startService, sendBroadcast 등에 전달하면 공격자가 앱의 권한과 신뢰 경계를 이용해 의도하지 않은 컴포넌트를 실행할 수 있습니다.

잠재적 영향

  • 내부 컴포넌트 호출 또는 권한 우회
  • 민감한 extra 값 전달
  • 피싱 화면 또는 악성 컴포넌트 실행

해결 방법

  1. 외부에서 받은 Intent를 그대로 전달하지 않습니다.
  2. 대상 패키지, 클래스, action을 allowlist로 검증합니다.
  3. setPackage, setClassName, setComponent로 명시적이고 신뢰할 수 있는 대상만 지정합니다.

예시

변경 전

java
Intent next = getIntent().getParcelableExtra("next");
startActivity(next);

변경 후

java
String target = getIntent().getStringExtra("target");
if ("safe".equals(target)) {
    Intent next = new Intent(this, SafeActivity.class);
    startActivity(next);
}

설명:

  • 변경 전: 외부에서 받은 Intent를 검증 없이 startActivity, startService, sendBroadcast 등에 전달하면 공격자가 앱 권한으로 내부 컴포넌트나 다른 앱 컴포넌트를 실행하게 만들 수 있습니다.
  • 변경 후: 외부 Intent를 그대로 전달하지 말고 새 Intent를 생성해 허용된 대상만 설정합니다.

참조