Данные из сторонних источников формируют SQL-выражение
Класс
| ThirdpartyFlowsToSQLIssue
Модуль
| Santaint (Marivanna)
Описание
В операционной системе Android приложение может получать данные из различных источников: пользовательский ввод, чтение бэкапа, Intents, данные других приложений и т.п.
В некоторых случаях эти данные могут быть использованы в SQL-выражениях или их частях, что может привести к уязвимости в приложении.
Пример источников данных: данные из getIntent()
внутри Activity, Service, ContentProvider, BroadcastReceiver, пользовательский ввод, непосредственное использование (для ContentProvider).
Пример получателей данных: любые методы классов SupportSQLiteDatabase
, SQLiteQueryBuilder
, SQLiteDatabase
, ContentResolver
, CursorLoader
, работающие с SQL-выражениями или их частями (параметры).
Пример:
Если обращение к базе данных осуществляется следующим образом:
то при передаче значения name = "v' or '1=1'" из базы данных будут выбраны все записи. Кроме того, если в этой же базе есть другая таблица, то можно получить и записи из нее с помощью UNION: name = ".
Проблема
Если данные из неконтролируемых источников используются без проверки в SQL-выражениях или их частях, это может привести к уязвимости в приложении.
Рекомендации
Необходимо рассматривать все данные из сторонних источников как зловредные, не использовать и не передавать готовые SQL-выражения целиком, вместо этого использовать выражения с подстановкой аргументов (placeholders). Android API уже содержит безопасные методы работы с базами данных, достаточно правильно их использовать.
Пример:
В данном случае подстановка в переменную name любого значение не приведет к возникновению SQL-инъекции, любое значение будет воспринято как искомое значение в столбце "name".