설명
외부 입력에서 받은 클래스 이름을 Fragment.instantiate 또는 유사한 동적 Fragment 생성 API에 전달하면 공격자가 의도하지 않은 Fragment를 로드하게 만들 수 있습니다. 특히 exported Activity에서 이 패턴이 사용되면 권한이 낮은 앱이 내부 화면이나 민감한 동작에 접근할 수 있습니다.
잠재적 영향
- 내부 Fragment 또는 설정 화면 노출
- 권한 검증을 우회한 기능 접근
- 민감한 데이터 표시 또는 상태 변경
해결 방법
- 외부 입력을 Fragment 클래스 이름으로 직접 사용하지 않습니다.
- 허용된 Fragment 이름만 매핑하는 allowlist를 사용합니다.
PreferenceActivity를 사용하는 경우isValidFragment는 명시적으로 허용된 Fragment 이름에만true를 반환하게 하세요. 허용된 화면에서도 사용자 권한을 확인하고 불필요한 Activity 외부 노출을 제한하세요.
예시
기존 Activity 내부의 일부입니다. SettingsFragment는 애플리케이션에서 정의한 허용 대상이며, 화면 접근 권한 검사는 별도로 필요합니다.
변경 전
java
String fragment = getIntent().getStringExtra("fragment");
Fragment.instantiate(this, fragment);
변경 후
java
Map<String, String> allowed = Map.of("settings", SettingsFragment.class.getName());
String fragment = allowed.get(getIntent().getStringExtra("fragment"));
if (fragment != null) {
Fragment.instantiate(this, fragment);
}
설명:
- 변경 전: 외부 입력으로 Fragment 클래스 이름을 받아 Fragment.instantiate에 전달하면 공격자가 의도하지 않은 Fragment를 exported Activity 안에 주입할 수 있습니다.
- 변경 후: Fragment 이름은 allowlist로 검증하거나 정적 Fragment 인스턴스를 사용합니다.