경로 순회 취약성

이 정보는 경로 순회 취약성이 있는 앱의 개발자를 대상으로 합니다.

현재 상태

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

필요한 조치​

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

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

추가 세부정보

내보낸 ContentProviders에 있는 openFile 구현이 수신되는 URI 매개변수를 제대로 검증하지 못하면 openFile 구현이 취약해질 가능성이 있습니다. 악성 앱은 의도적으로 만들어진 URI(예: '/../' 포함)를 제공하여 앱이 의도된 디렉토리 외부에 있는 파일의 ParcelFileDescriptor를 반환하게 함으로써 앱이 가능한 모든 파일에 액세스하도록 만들 수도 있습니다.

ContentProvider에서 경로 순회 취약성을 제거할 때 유용한 방법은 다음의 2가지입니다.

1. ContentProvider를 다른 앱에 노출하지 않아도 되는 경우

2. ContentProvider를 다른 앱에 노출해야 하는 경우

경로 순회 문자가 포함된 openFile 입력으로 인해 앱이 예기치 않은 파일을 반환하지 않는지 제대로 확인해야 합니다. 이렇게 하려면 파일의 표준 경로를 확인하면 됩니다. 예를 들면 다음과 같습니다.

public ParcelFileDescriptor openFile (Uri uri, String mode)
   throws FileNotFoundException {
 File f = new File(DIR, uri.getLastPathSegment());
 if (!f.getCanonicalPath().startsWith(DIR)) {
   throw new IllegalArgumentException();
 }
 return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
 

주의 사항: URI 매개변수에서 getLastPathSegment를 호출하는 것은 안전하지 않습니다. 악성 앱이 %2F%2F..path%2Fto%2Fsecret.txt 등의 인코딩된 URI 경로를 제공하면 getLastPathSegment가 /../../path/to/secret.txt가 될 수도 있습니다. 예를 들어, 다음 구현은 공격에 취약합니다.

public ParcelFileDescriptor openFile(Uri uri, String mode){
 File f = new File(DIR, uri.getLastPathSegment());
 return ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY);
}
 

문의사항이 있는 경우

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

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