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

Данные из сторонних источников формируют SQL-выражение

Класс

| ThirdpartyFlowsToSQLIssue

Модуль

| Santaint (Marivanna)

Описание

В операционной системе Android приложение может получать данные из различных источников: пользовательский ввод, чтение бэкапа, Intents, данные других приложений и т.п.

В некоторых случаях эти данные могут быть использованы в SQL-выражениях или их частях, что может привести к уязвимости в приложении.

Пример источников данных: данные из getIntent() внутри Activity, Service, ContentProvider, BroadcastReceiver, пользовательский ввод, непосредственное использование (для ContentProvider).

Пример получателей данных: любые методы классов SupportSQLiteDatabase, SQLiteQueryBuilder, SQLiteDatabase, ContentResolver, CursorLoader, работающие с SQL-выражениями или их частями (параметры).

Пример:

Если обращение к базе данных осуществляется следующим образом:

database.rawQuery("SELECT * FROM users WHERE name = '" + name + "'", null);

то при передаче значения name = "v' or '1=1'" из базы данных будут выбраны все записи. Кроме того, если в этой же базе есть другая таблица, то можно получить и записи из нее с помощью UNION: name = ".

Проблема

Если данные из неконтролируемых источников используются без проверки в SQL-выражениях или их частях, это может привести к уязвимости в приложении.

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

Необходимо рассматривать все данные из сторонних источников как зловредные, не использовать и не передавать готовые SQL-выражения целиком, вместо этого использовать выражения с подстановкой аргументов (placeholders). Android API уже содержит безопасные методы работы с базами данных, достаточно правильно их использовать.

Пример:

database.query(UserDBHelper2.TABLE, null, "name=?", new String[]{name}, null, null, null);

В данном случае подстановка в переменную name любого значение не приведет к возникновению SQL-инъекции, любое значение будет воспринято как искомое значение в столбце "name".

Ссылки

  1. SQL injections

  2. SQL injection in Android content providers and how to be protected

К началу