Уязвимость Path Traversal

Эта информация предназначена для разработчиков, чьи приложения содержат уязвимость Path Traversal.

Что происходит

С 16 января 2018 года в Google Play нельзя публиковать приложения и обновления, содержащие уязвимость Path Traversal. Вам необходимо принять меры до даты, указанной в Play Console. После нее приложения, содержащие уязвимость, могут быть удалены из Google Play.

Что нужно сделать

  1. Чтобы узнать, какие приложения уязвимы и в какой срок нужно решить проблему, войдите в Play Console и откройте раздел "Оповещения".
  2. Внесите изменения в приложения, затронутые уязвимостью, чтобы устранить ее.
  3. Опубликуйте обновленные версии приложений.

После этого мы проведем повторную проверку, которая может занять несколько часов. Если мы убедимся, что уязвимость устранена, то опубликуем приложение и дополнительных действий с вашей стороны не потребуется. В противном случае новая версия не будет опубликована, а вы получите уведомление по электронной почте.

Сведения об уязвимости

Реализации функции openFile в экспортированных классах ContentProviders могут быть уязвимыми, если отсутствует корректная проверка входящих параметров Uri. Вредоносное ПО может предоставить специальный Uri (например, содержащий "/../"), чтобы обмануть ваше приложение и получить ParcelFileDescriptor файла вне предполагаемого каталога. Так вредоносное ПО может получить доступ к любому файлу, доступному вашему приложению.

Ниже описаны два рекомендуемых способа устранения уязвимости Path Traversal в ContentProvider.

1. ContentProvider не нужен другим приложениям.

  • Измените тег <provider> затронутого класса ContentProvider в манифесте, установив значение android:exported=”false”. После этого другие приложения не смогут отправлять намерения этому классу.
  • Также можно задать атрибут android:permission тегом permission со значением android:protectionLevel="signature", чтобы приложения других разработчиков не могли отправлять намерения затронутому классу 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);
}
 

Внимание! Вызов метода getLastPathSegment параметра Uri не защищает от уязвимости. Вредоносное ПО может предоставить кодированное значение пути URI, например "%2F..%2F..путь%2Fк%2Fпаролям.txt", и метод getLastPathSegment вернет "/../../путь/к/паролям.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. Чтобы получить более подробные разъяснения, свяжитесь с командой поддержки для разработчиков.

Эта информация оказалась полезной?
Как можно улучшить эту статью?