Fragment Injection에 노출시키는 PreferenceActivity 클래스의 안전하지 않은 구현을 사용하는 앱의 개발자를 위한 정보입니다. 이러한 구현은 악성 외부 앱이 비공개여야 하는 프래그먼트를 로드하도록 허용할 수 있습니다.
현재 상태
2017년 3월 1일부터 Google Play에서는 PreferenceActivity 클래스가 Fragment Injection에 취약할 수 있는 새로운 앱 또는 업데이트의 게시를 차단했습니다. Play Console의 공지를 참조하세요. Play Console에 표시된 기한이 지난 후에도 보안 취약점이 수정되지 않은 앱은 모두 Google Play에서 삭제될 수 있습니다.
필요한 조치
- Play Console에 로그인한 후 알림 섹션으로 이동하여 영향을 받는 앱과 문제 해결 기한을 확인합니다.
- 영향을 받는 앱을 업데이트하여 취약점을 수정합니다.
- 영향을 받는 앱의 업데이트된 버전을 제출합니다.
다시 제출하면 앱은 다시 검토 절차를 거치게 되며 이 절차는 몇 시간 정도 걸릴 수 있습니다. 앱이 검토 과정을 통과하고 게시가 완료되면 더 이상의 조치가 필요하지 않습니다. 앱이 검토 과정을 통과하지 못할 경우 새로운 앱 버전은 게시되지 않으며 이메일 알림을 받게 됩니다.
추가 세부정보
가능한 경우 Manifest에서 PreferenceActivity를 exported=false로 설정합니다. 이렇게 하면 외부 앱이 이 클래스로 인텐트를 전송할 수 없게 됩니다.
취약한 PreferenceActivity를 외부 앱으로 내보내야 하는 경우 클래스가 취약한 이유를 확인하고 적절한 조치를 취하세요. 이 경우 다음 두 가지 조치가 있습니다.
-
isValidFragment의 잘못된 구현:
취약한 클래스가 모든 코드 경로에서 true를 반환하는 isValidFragment 구현을 포함 또는 상속하는지 확인합니다. 이에 해당하는 경우 클래스를 업데이트하여 허용되는 프래그먼트 클래스의 목록을 확인합니다. 예: PreferenceActivity가 MyFragment 클래스만 허용하고 기타 모든 프래그먼트를 허용하지 않아야 하는 경우 다음과 같은 확인을 구현합니다.
public boolean isValidFragment(String fragmentName) {
return MyFragment.class.getName().equals(fragmentName);
}
-
targetSdkVersion이 19 미만이며 isValidFragment를 구현하지 않음:
앱이 현재 매니페스트의 targetSdkVersion에 19 미만인 값을 설정하고 취약한 클래스가 isValidFragment 구현을 포함하지 않는 경우 취약성이 PreferenceActivity에서 상속됩니다.
이를 해결하려면 개발자가 targetSdkVersion을 19 이상으로 업데이트해야 합니다. 또는 targetSdkVersion을 업데이트할 수 없는 경우 개발자가 1)에서 설명한 대로 isValidFragment를 구현하여 허용되는 프래그먼트 클래스를 확인해야 합니다.
또한 앱은 개발자 배포 계약 및 콘텐츠 정책을 준수해야 합니다.
도움이 필요하신가요?
취약점에 관한 기술적인 문의사항이 있다면 'android-security' 태그를 사용하여 Stack Overflow에 게시해 주시기 바랍니다. 문제 해결 단계에 관해 궁금하신 점이 있으면 Google 개발자 지원팀에 문의하세요.