
PoC для уязвимости в ZTE File Manager (zte.com.cn.filer), который позволяет читать произвольные файлы других приложений с правами этого файлового менеджера.
PoC для CVE-2026-40000 — уязвимости в ZTE File Manager (zte.com.cn.filer), которая позволяет читать произвольные файлы других приложений с привилегиями этого файлового менеджера.
Как использовать: соберите проект (или скачайте приложение из releases), установите и откройте PoC, затем укажите файл для открытия и нажмите кнопку Open as zte.com.cn.filer, чтобы попытаться открыть его. В ZTE File Manager выберите extract all, затем подтвердите распаковку — она завершится ошибкой и предложит выбрать внешнее приложение для открытия (выбор будет доступен через системный выбор приложений Android). ZTE File Manager скопирует файл в /sdcard/Android/data/zte.com.cn.filer/cache и распакует его во временный подкаталог. Когда вы попытаетесь открыть файл с именем, совпадающим с файлом в системном PATH (или непосредственно файл из системного PATH), он будет скопирован напрямую в /sdcard/Android/data/zte.com.cn.filer/cache, и приложение спросит, хотите ли вы его перезаписать. Также есть способ сразу определить, может ли открываемый файл быть доступен ZTE File Manager (при условии, что у приложения нет прав на его чтение): в FilePreViewActivity в левом верхнем углу, а также вверху рядом со стрелкой «назад», когда файл можно открыть, отображается имя файла; если же открытие не удаётся, имя не показывается.
Как работает PoC: он делает примерно следующее: adb shell am start -d content://zte.com.cn.filer.fileprovider/root_path/filetoopen zte.com.cn.filer/zte.com.cn.filer.FilePreViewActivity
В приложении есть такой провайдер:
<provider
android:name="androidx.core.content.FileProvider"
android:exported="false"
android:authorities="zte.com.cn.filer.fileprovider"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
Даже если он не экспортирован, его можно вызвать через эту activity:
android:name="zte.com.cn.filer.FilePreViewActivity"
android:exported="true"
Поскольку мы вызываем провайдер из одной из activity самого приложения, флаг exported теряет значение. Activity экспортирована (exported="true"), поэтому её можно вызывать из других компонентов.
Очевидно, этого недостаточно — приложение должно разрешать доступ к / или хотя бы к чувствительным путям. Как выяснилось, оно это делает (из android:resource="@xml/provider_paths): хотя используется ., он указывает на /, что позволяет открывать файлы откуда угодно, куда имеет доступ файловое приложение.
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path
name="files-path"
path="."/>
<external-path
name="external_files"
path="."/>
<root-path
name="root_path"
path="."/>
<external-cache-path
name="external_cache_path"
path="."/>
</paths>
Затронутые устройства: ZTE Blade A75 5G и, вероятно, новые модели, если они не обновлены (у меня их нет, так что это предположение). На Android с 9 по 12 (вероятно, на более ранних версиях Android ситуация та же) в приложении отсутствует zte.com.cn.filer.FilePreViewActivity, поэтому оно, похоже, не уязвимо; также возможно, что приложение полностью отсутствует (по крайней мере там, где я пробовал, используется стандартный файловый менеджер Google).
Я не несу ответственности за неправомерное использование этого материала; уязвимость локальная, получила CVE и, следовательно, исправлена. Устанавливайте системные обновления или перейдите на более новое устройство, если беспокоитесь.