Try   HackMD

Отчет по анализу защищенности Android приложения com.android.InsecureBankv2

Введение

В рамках проводимых работ производился анализ защищенности приложения com.android.InsecureBankv2 (далее - Приложение) и его компонентов.

Цель и Задачи

Целью данных работ являлось поиск уязвимостей Приложения.
Задачи:

  • сбор информации о системе
  • анализ защищенности
  • построение векторов атак
  • предоставление рекомендаций по увеличению защищенности Системы
  • формирование отчетной документации

Состав работ

в рамках проводимых работ предополагалось проведение следующих этапов:

  • статический анализ защищенности
  • динамический анализ защищенности
  • составление отчета

Методика проведения работ

  1. Сбор информации о Приложении
  2. Анализ ошибок приложения
  3. Тестирование механизма аутентификации
  4. Тестирование механизма управления сессиями
  5. Анализ защищенности среды передачи данных
  6. Тестирование защищенности клиентской части приложения от возможных утечек данных
  7. Тестирование серверной части Приложения на чувствительность к иньекциям

Условия проведения работ

Серверная часть приложения была развернута на локальном компьютере также как и виртуальных эмулятор (далее - Устройство), на котором было установлено Приложение из apk файла. Каких либо дополнительных методов защиты включено не было.

Исходные данные

В качестве исходных данных для проводимых работ использовалась база данных SQLLite, в которой присутствовали 2 тестовые записи пользователей: jack, dinesh.

Краткое содержание результатов работ

В результате выполнения работ были обнаружены следующие уязвимости:

  1. Insecure Logging mechanism
  2. Insecure HTTP connections
  3. Username Enumeration issue
  4. Insecure SDCard storage
  5. Developer Backdoors
  6. Android Backup vulnerability
  7. Application Debuggable
  8. Hardcoded secrets
  9. Sensitive Information in Memory
  10. Insecure Content Provider access
  11. Vulnerable Activity Components
  12. Intent Sniffing and Injection
  13. Root Detection and Bypass
  14. Android keyboard cache issues
  15. Insecure Webview implementation
  16. Weak change password implementation
    Выработаны рекомендации по их устранению.

подробное описание результатов работ

1. Insecure Logging mechanism

CWE-532: Inclusion of Sensitive Information in Log Files

Уровень опасности по CVSS 3.0: Средний (4.6)

Описание:

Данная уязвимость является следствием ведения лога действий пользователя при вводе конфиденциальных данных. В результате чего указанные данные сохраняются в лог-файлах устройства.

Демонстрация наличия уязвимости:

Было установлено, что Приложение пишет в лог устройства конфиденциальные данные.
Так в коде Приложения прописано отправлять данные в журнал событий:

  • о смене пароля:

    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

  • об авторизации с указанием имени пользователя и пароля:

    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

    Указанные данные были обнаружены в лог файлах Logcat:

  • о переводе средств:

    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

  • об авторизации с указаниме логина и пароля:

    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

Рекомендации по повышению уровня защищенности:
удалить в коде программы логирование конфиденциальных данных.

2. Insecure HTTP connections

CWE-319: Cleartext Transmission of Sensitive Information

Уровень опасности по CVSS 3.0:средний 5.7
Описание:
Данная уязвимость является следствием использования разработчиками приложений небезопасного протокола http, при использовании которого данные передаются в открытом, незащищенном виде. В рузультате чего все данные, которыми обменивается Приложение и сервер могут быть перехвачены злоумышленником.
Демонстрация наличия уязвимости:
В коде Приложения прописана отправка конфиденциальных данных через небезопасный протокол http:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

В связи с этим у злоумышленника существует возможность перехватить данные пользователя при:

  • авторизации:

    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

  • смене пароля:

    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

  • переводе денежных средств:

    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →

Рекомендации по повышению уровня защищенности:
в коде программы использовать только безопасный протокол https. В логике сервера запретить использование протокола http.

3. Username Enumeration issue

CWE CATEGORY: SFP Secondary Cluster: Insecure Authentication Policy
Уровень опасности по CVSS 3.0:средний 5.3
Описание:
Данная уязвимость прослеживается в случае если сервер приложения ни как не отслеживает количество запросов с одного ip адреса, а так же дает ответ о неправильном имени пользователя без получения пароля. В результате чего сильно упрощается механизм перебора имени пользователя.
Демонстрация наличия уязвимости:
В Приложении возможно перебрать имена пользователей, таким образом установить все логины учетных записей зарегестрированные на сервере:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Рекомендации по повышению уровня защищенности:
настроить логику сервера таким образом, чтобы он отвечал только на валидные запросы, содержащие как имя пользователя так и пароль.

4. Insecure SDCard storage

CWE CATEGORY: OWASP Top Ten 2004 Category A8 - Insecure Storage
Уровень опасности по CVSS 3.0:низкий 2.4
Описание:
Небезопасное хранение конфиденциальных данных на SDCard в открытом виде.
Демонстрация наличия уязвимости:
В коде Приложения прописано отправлять лог переводов по счетам на sdcard:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Где они хранятся в незашифрованном виде:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Рекомендации по повышению уровня защищенности:
отключить логирование конфиденциальных данных для предотвращения их утечек.

5.Developer Backdoors

CWE-912: Hidden Functionality (Backdoor)
Уровень опасности по CVSS 3.0:низкий 2.4
Описание:
Зачастую, разработчики приложений создают backdoor для возможности входа при его отладки. Однако после выхода приложения в релиз данный backdoor просто забывают удалить. В результате чего злоумышленик может зайти в приложение не имея учетной записи на сервере.
Демонстрация наличия уязвимости:
В коде программы указан логин суперпользователя:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

При вводе которого возможно зайти в Приложение без указания пароля:

Рекомендации по повышению уровня защищенности:
удалить из кода Приложения возможность зайти на него без регистрации на сервере.

6.Android Backup vulnerability

CWE-530: Exposure of Backup File to an Unauthorized Control Sphere
Уровень опасности по CVSS 3.0:средний 4.6
Описание:
Устройства Android имеют функцию бэкапирования установленных приложений. При этом данные хранящиеся в приложении сохраняются в бэкапах. Таким образом, злоумышленник может, получив доступ к бэкап файлу, извлеч из него данные приложения.
Демонстрация наличия уязвимости:
В манифесте Приложения разрешено копирование данных приложения в бэкап устройства:


Таким образом при создании бэкапа Устройство существует возможность получить доступ к сохраненным в Приложении конфиденциальным данным. К примеру к зашифрованным логинам и паролям:

Рекомендации по повышению уровня защищенности:
запретить в манифесте Приложения копировать данные в бэкап файл.

7.Application Debuggable

CWE-215: Information Exposure Through Debug Information
Уровень опасности по CVSS 3.0:средний 4.6
Описание:
Android устройства возможно запустить в режиме отладки. При этом все приложения, которые в манифесте разрешено запускать в данном режиме, также возможно отлаживать. В результате, в процессе отладки появляется возможность получить доступ к расшифрованным данным приложения.
Демонстрация наличия уязвимости:
В манифесте Приложения присутствует строка android:debuggable="true", позволяющая производить отладку:

Таким образом, запустив отладку Приложения при автозаполнении логина и пароля можно перехватить указанные данные:

Рекомендации по повышению уровня защищенности:
отладку Приложения необходимо отключать при его выпуске.

8. Hardcoded secrets

CWE-321: Use of Hard-coded Cryptographic Key
Уровень опасности по CVSS 3.0:средний 4,6
Описание:
Логин и пароль пользователя хранятся на устройстве в зашифрованном виде. Однако шифрование и расшифровка указанных данных производится Приложением с использованием ключей, которые хранятся в коде программы.
Демонстрация наличия уязвимости:
Использовав код Приложения, возможно написать скрипт, который декодирует зашифрованные логин и пароль, хранящиеся в share_preferense:

import java.util.Base64;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.AlgorithmParameterSpec;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

class enc{


        public static byte[] aes256decrypt(byte[] ivBytes2, byte[] keyBytes, byte[] textBytes) throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
                AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes2);
                SecretKeySpec newKey = new SecretKeySpec(keyBytes, "AES");
                Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
                cipher.init(2, newKey, ivSpec);
                return cipher.doFinal(textBytes);
        }

        public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException {
                String theString = "v/sJpihDCo2ckDmLW5Uwiw==";
                String key = "This is the super secret key 123";
                byte[] ivBytes = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
                byte[] cipherData = aes256decrypt(ivBytes, key.getBytes("UTF-8"), Base64.getDecoder().decode(theString.getBytes("UTF-8")));
                System.out.println(new String(cipherData, "UTF-8"));
        }
}

Рекомендации по повышению уровня защищенности:
хранить ключи шифрования на серверной части Приложения.

9. Sensitive Information in Memory

CWE-316: Cleartext Storage of Sensitive Information in Memory
Уровень опасности по CVSS 3.0:средний 4.6
Описание:
При работе любых приложений используются переменные в оперативной памяти, которые могут хранить конфиденциальные данные.Так, Приложением используются переменные, хранящие в незащищенном виде логин и пароль. При этом срок хранения данных переменные не ограничен:
Демонстрация наличия уязвимости:

Таким образом в памяти устройства продолжительное время после аудонтификации возможно найти и прочитать данные пользователя.

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

10. Insecure Content Provider access

CWE-926: Improper Export of Android Application Components
Уровень опасности по CVSS 3.0:средний 5.7
Описание:
При использовании content provider разработчики не ограничивают обращение к нему из сторонних приложений.
Демонстрация наличия уязвимости:
В коде программы и в манифесте указано информацию об успешной авторизации писать в базу данных посредством content provider:

Однако данный content provider доступен из других приложений Устройства. Таким образом возможно, используя сторонние механизмы получить доступ к информации о том, под какими логинами заходили в Приложение:

Рекомендации по повышению уровня защищенности:
не использовать content provider для работы с конфиденциальными данными

11.Vulnerable Activity Components

CWE-926: Improper Export of Android Application Components
Уровень опасности по CVSS 3.0:низкий 2.4
Описание:
В некоторых случаях разработчики приложений используют intent функции в классах. При этом к данным функциям могут обращаться другие классы.
Демонстрация наличия уязвимости:
Приложение использует intent для определения имени пользователя под которым он вошел в приложение:


Однако, данный intent доступен из сторонних приложений Устройства. Таким образом возможно, не заходя в приложение, определить валидное имя пользователя:

Рекомендации по повышению уровня защищенности:
не использовать элементы intent для конфиденциальных данных пользователя.

12.Intent Sniffing and Injection

CWE-926: Improper Export of Android Application Components
Уровень опасности по CVSS 3.0:низкий 2.4
Описание:
В некоторых случаях разработчики приложений используют intent функции в классах. При этом к данным функциям могут обращаться другие классы.
Демонстрация наличия уязвимости:
Приложение использует intent для отправки смс об изменении пароля на Устройство:

Данный intent возомжно использовать из стороннего приложения. Таким образом пользователя можно ввести в заблуждение о том, что его пароль был изменен:

Рекомендации по повышению уровня защищенности: при использовании intent не следует открывать доступ к ним из сторонних приложений

13. Root Detection and Bypass

CWE-693: Protection Mechanism Failure
Уровень опасности по CVSS 3.0:средний 4.6
Описание:
Для защиты приложений от действий злоумышленников разработчики проверяют устройство на наличие расширенных прав. В случае обнаружения указанных прав ряд функционала Приложения следует отключить.
Демонстрация наличия уязвимости:
Приложение использует 2 функции для проверки Устройства на наличии прав root.

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

Рекомендации по повышению уровня защищенности:
при написании кода Приложения использовать переменные и ссылки для усложнения прочтения данного кода злоумышленником.

14. Android keyboard cache issues

CWE-524: Information Exposure Through Caching
Уровень опасности по CVSS 3.0:низкий 2.4
Описание:
В Android устройствах присутсвуют функции автокоррекции вводимого пользователем текста. Для заполнения полей используются встроенные словари. Таким образом существует опасность того, что информация о логине, вводимом пользователем может быть автоматически или вручную самим пользователем добавлена в "пользовательский словарь"
Демонстрация наличия уязвимости:
Указанная функция реализована при введении логина при входе в Приложение:


Содержимое "пользовательского словаря":

Таким образом злоумышленник может похитить указанные конфиденциальные данные пользователя.

Рекомендации по повышению уровня защищенности:
поля для ввода любых конфиденциальных данных должны иметь тип, к которому запрещено применение авторедактирования.

15. Insecure Webview implementation

CWE-749: Exposed Dangerous Method or Function
Уровень опасности по CVSS 3.0:средний 6.4
Описание:
При использовании метода webview разработчики не учитывают риск того, что файл, на который ссылается указанный метод может быть подменен злоумышленником на файл с кодом. При этом, при обращении метода webview к данному файлу код будет выполнен.
Демонстрация наличия уязвимости:
В приложении существует возможность просмотра последних переводов средств между счетами. Однако для этих целей используется небезопасный метод webview:


Пример выполнения кода, написанного в файле, к которому обращается метод webview Приложения:

Рекомендации по повышению уровня защищенности:
по возможности не использовать webview, либо обращаться не к локально размещенному на Устройстве файлу, а к базе даных сервера.

16. Weak change password implementation

CWE-620: Unverified Password Change
Уровень опасности по CVSS 3.0:средний 4.3
Описание:
Данная уязвимость характеризуется слабой защитой процедуры смены пароля.
Демонстрация наличия уязвимости:
Процедуру смены пароля в Приложении можно выполнить с любого стороннего устройства либо специализированного программного обеспечения. Для успешной смены пароля достаточно знать лишь имя пользователя:

Рекомендации по повышению уровня защищенности:
перед сменой пароля сервер должен сначало аутентифицировать пользователя.

При тестировании Приложения использовались следующие программные средства

  1. Android Studio
  2. Apktool
  3. Jadx-gui
  4. Frida
  5. Burp Suit
    Так как Приложение было развернуто на тестовом стенде, в ходе тестирования доступа к персональным данным получено не было. Изменений на рабочих серверах Приложения внесено не было.