Перейти к содержанию

Потенциальное выполнение произвольного кода в контексте приложения

Критичность: КРИТИЧНЫЙ
Способ обнаружения: DAST, IAST

Описание

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

Для реализации данной уязвимости и выполнению произвольного кода в контексте приложения необходимо наличие нескольких условий:

  • Приложение использует нативный код (загружает бинарные библиотеки с расширением .so во время запуска приложения/работы с ним).
  • Приложение взаимодействует с архивом (zip, 7zip и т. д.), который располагается в публичных директориях (то есть может быть заменен злоумышленником).
  • При работе с архивом нет проверок на наличие специальных символов в имени файла (например, zipFile.getName().contains("../")). Если таких проверок нет, это означает, что возможно перезаписать произвольные файлы в процессе разархивации файла.

Реализация уязвимости происходит следующим образом:

  • Злоумышленник определяет, какие нативные библиотеки загружаются в приложение и с каким архивом взаимодействует приложение.
  • Злоумышленник подготавливает нативную библиотеку, содержащую код, который выполняет определенные действия в момент загрузки JNI_OnLoad (например, меняет права на директорию на 777, что делает директорию доступной всем). Название файла должно совпадать с одной из библиотек, которые загружаются приложением.

Пример кода:

#include <jni.h>
#include <string.h>
#include <stdlib.h>
JNIEXPORT jint **JNI_OnLoad**(JavaVM* vm, void* reserved) {
system("chmod -R 777 /data/user/0/com.example.app/");
JNIEnv* env;
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
return JNI_ERR;
}
return JNI_VERSION_1_6;
}
  • Используя специальные средства (например, вот такой скрипт) подготавливает архив, который содержит внутри написанную библиотеку.
  • При работе с приложением (или при вызове методов, которые работают с архивами, например, Content Provider), вызывают функцию по распаковке созданного ранее архива.
  • Приложение распаковывает архив, содержащий символы перехода на директорию выше (../../) и путь директории внутри песочницы приложения, куда необходимо поместить файл.
  • В результате распаковки такого архива приложение заменяет библиотеку внутри своей директории на библиотеку из архива.
  • При следующем запуске приложения/загрузки библиотеки будет выполнен код из библиотеки злоумышленника.

Рекомендации

При использовании механизма работы с любыми файлами, которые потенциально могут быть подконтрольны злоумышленнику или при реализации механизмов межпроцессного взаимодействия с использованием файлов (Content Providers, etc) необходимо валидировать имена файлов на наличие специальных символов, которые могут быть использованы для обхода каталога (Path Traversal).

Простым примером такой проверки может служить участок кода по распаковке архива или анализ имени/пути файла, который передается в механизмы IPC:

zipFile.getName().contains("../")

Ссылки

  1. https://blog.oversecured.com/Oversecured-detects-dangerous-vulnerabilities-in-the-TikTok-Android-app/

  2. https://github.com/ptoomey3/evilarc

  3. https://twitter.com/_bagipro/status/1319365830728208386https://developer.android.com/reference/javax/crypto/KeyGenerator.html

К началу