인텐트 리디렉션 취약성 문제 해결

이 정보는 인텐트 리디렉션 취약성이 있는 앱의 개발자를 대상으로 합니다.

현재 상태

하나 이상의 앱에 악성 앱이 비공개 앱 구성요소나 파일에 액세스하도록 허용할 수 있는 인텐트 리디렉션 문제가 있습니다. 앱 문제를 해결하려면 아래에 안내된 자세한 단계를 확인하세요. Play Console에 표시된 기한이 지난 후에도 보안 취약성 문제가 해결되지 않은 앱은 모두 Google Play에서 삭제됩니다.

필요한 조치​

  1. Play Console에 로그인한 후 알림 섹션으로 이동하여 영향을 받는 앱과 문제 해결 기한을 확인합니다.
  2. 아래에 설명된 단계를 참고하여 영향을 받는 앱을 업데이트합니다.
  3. 영향을 받는 앱의 업데이트된 버전을 제출합니다.

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

추가 세부정보

신뢰할 수 없는 인텐트의 Extras 필드에서 인텐트를 추출하고 추출된 인텐트의 startActivity(또는 유사한 startService)를 호출함으로써 구성요소를 실행하는 앱의 경우 의도하지 않은 비공개 구성요소를 잘못 실행할 수 있습니다. 이로 인해 (1) 감염된 인수로 인해 민감한 작업이 실행되거나 (2) 승인된 URI 권한을 통해 민감한 파일이 도난당할 수 있습니다.

다음 중 한 가지 방법을 통해 이러한 취약점을 방지하는 것이 좋습니다.

옵션 1: 추출된 인텐트를 리디렉션하도록 영향을 받은 앱 구성요소를 비공개로 설정합니다.

영향을 받은 앱 구성요소가 다른 앱으로부터 인텐트를 수신하지 않아도 되는 경우 매니페스트에서 android:exported=”false”로 설정하여 앱 구성요소를 비공개로 설정할 수 있습니다. 

옵션 2: 추출된 인텐트의 출처가 신뢰할 수 있는 곳인지 확인합니다.

getCallingActivity와 같은 메소드를 사용하여 인텐트가 시작된 작업을 신뢰할 수 있는지 확인할 수 있습니다. 예를 들면 다음과 같습니다. 

 // check if the originating Activity is from trusted package
 if (getCallingActivity().getPackageName().equals(“known”)) {
   Intent intent = getIntent();
   // extract the nested Intent
   Intent forward = (Intent) intent.getParcelableExtra(“key”);
   // redirect the nested Intent
   startActivity(forward);
 }

옵션 3: 리디렉션될 인텐트가 유해하지 않은지 확인합니다.

리디렉션될 인텐트의 다음 사항을 확인해야 합니다.

  1. 앱의 비공개 구성요소로 전송되지 않음
  2. 앱의 비공개 콘텐츠 제공업체URI 권한을 부여하지 않음

앱에서 resolveActivity와 같은 메소드를 사용하여 인텐트가 리디렉션되기 전에 처리될 때 어떤 구성요소가 사용되는지 확인할 수 있습니다. 예를 들면 다음과 같습니다.

 Intent intent = getIntent();
 // extract the nested Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // get the component name
 ComponentName name = forward.resolveActivity(getPackageManager());
 // check that the package name and class name are as intended
 if (name.getPackageName().equals(“safe_package”) &&
     name.getClassName().equals(“safe_class”)) {
   // redirect the nested Intent
   startActivity(forward);
 }

앱에서 getFlags와 같은 메소드를 사용하여 인텐트가 URI 권한을 부여하는지 확인할 수 있습니다. 예를 들면 다음과 같습니다.

 // extract the nested Intent
 Intent forward = (Intent) intent.getParcelableExtra(“key”);
 // get the flags
 int flags = forward.getFlags();
 // check that the nested intent does not grant URI permissions
 if ((flags & Intent.FLAG_GRANT_READ_URI_PERMISSION > 0) ||
     (flags & Intent.FLAG_GRANT_WRITE_URI_PERMISSION > 0) {
   // redirect the nested Intent
   startActivity(forward);
 }

문의사항이 있는 경우

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

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