Fragment Injection 취약성 해결 방법

Fragment Injection에 노출시키는 PreferenceActivity 클래스의 안전하지 않은 구현을 사용하는 앱의 개발자를 위한 정보입니다. 이러한 구현은 악성 외부 앱이 비공개여야 하는 프래그먼트를 로드하도록 허용할 수 있습니다.

현재 상태

2017년 3월 1일부터 Google Play에서는 PreferenceActivity 클래스가 Fragment Injection에 취약할 수 있는 새로운 앱 또는 업데이트의 게시를 차단했습니다. Play Console의 공지를 참조하세요. Play Console에 표시된 기한이 지난 후에도 보안 취약점이 수정되지 않은 앱은 모두 Google Play에서 삭제될 수 있습니다.

필요한 조치​

  1. Play Console에 로그인한 후 알림 섹션으로 이동하여 영향을 받는 앱과 문제 해결 기한을 확인합니다.
  2. 영향을 받는 앱을 업데이트하여 취약점을 수정합니다.
  3. 영향을 받는 앱의 업데이트된 버전을 제출합니다.

다시 제출하면 앱은 다시 검토 절차를 거치게 되며 이 절차는 몇 시간 정도 걸릴 수 있습니다. 앱이 검토 과정을 통과하고 게시가 완료되면 더 이상의 조치가 필요하지 않습니다. 앱이 검토 과정을 통과하지 못할 경우 새로운 앱 버전은 게시되지 않으며 이메일 알림을 받게 됩니다.

추가 세부정보

가능한 경우 Manifest에서 PreferenceActivity를 exported=false로 설정합니다. 이렇게 하면 외부 앱이 이 클래스로 인텐트를 전송할 수 없게 됩니다.

취약한 PreferenceActivity를 외부 앱으로 내보내야 하는 경우 클래스가 취약한 이유를 확인하고 적절한 조치를 취하세요. 이 경우 다음 두 가지 조치가 있습니다.

  1. isValidFragment의 잘못된 구현:

취약한 클래스가 모든 코드 경로에서 true를 반환하는 isValidFragment 구현을 포함 또는 상속하는지 확인합니다. 이에 해당하는 경우 클래스를 업데이트하여 허용되는 프래그먼트 클래스의 목록을 확인합니다. 예: PreferenceActivity가 MyFragment 클래스만 허용하고 기타 모든 프래그먼트를 허용하지 않아야 하는 경우 다음과 같은 확인을 구현합니다.

         public boolean isValidFragment(String fragmentName) {
            return MyFragment.class.getName().equals(fragmentName);

         }

  1. targetSdkVersion이 19 미만이며 isValidFragment를 구현하지 않음:

앱이 현재 매니페스트의 targetSdkVersion에 19 미만인 값을 설정하고 취약한 클래스가 isValidFragment 구현을 포함하지 않는 경우 취약성이 PreferenceActivity에서 상속됩니다.

이를 해결하려면 개발자가 targetSdkVersion을 19 이상으로 업데이트해야 합니다. 또는 targetSdkVersion을 업데이트할 수 없는 경우 개발자가 1)에서 설명한 대로 isValidFragment를 구현하여 허용되는 프래그먼트 클래스를 확인해야 합니다.

또한 앱은 개발자 배포 계약콘텐츠 정책을 준수해야 합니다. 

도움이 필요하신가요?

취약점에 관한 기술적인 문의사항이 있다면 'android-security' 태그를 사용하여 Stack Overflow에 게시해 주시기 바랍니다. 문제 해결 단계에 관해 궁금하신 점이 있으면 Google 개발자 지원팀에 문의하세요.

도움이 되었나요?
어떻게 하면 개선할 수 있을까요?