Защита баз данных в iOS

Уязвимость информации, хранимой в базах данных, является одной из самых распространенных проблем безопасности iOS приложений. Многие программы предлагают пользователю использовать пароль для доступа к данным — но в большинстве случаев это никаким образом не влияет на то, в каком виде хранится сама информация. Таким образом, к данным таких приложений, как менеджеры паролей, блокноты, органайзеры, трекеры финансов, может получить доступ практически любой посторонний, в руках у которого окажется ваше устройство.


При установке приложения внутри директории /var/mobile/Applications/ создается директория, служащая его «песочницей». Ее рамками ограничены практически все возможные действия приложения. Именно здесь хранятся настойки NSUserDefaults, прочие plist файлы, Cookies, а также базы данных и прочие ресурсы, которые могут быть изменены пользователем. Для доступа к этой директории на устройстве не должен быть установлен Jailbreak — это возможно с помощью любого файлового менеджера (например, iFunBox).

В качестве иллюстрации распространенности этой уязвимости возьмем приложение, постоянно мелькающее в платном топе App Store — Smart Safe.

С помощью iFunBox ознакомимся с содержимым папки /Documents. Помимо всего прочего, она содержит в себе следующие файлы: notes.sqlitenotes.sqlite-shmnotes.sqlite-wal. База данных notes.sqlite содержит в себе три таблицы:

  • ZNOTE,
  • Z_METADATA,
  • Z_PRIMARYKEY.

Особенный интерес представляет первая из них. В поле ZDATE содержится дата публикации, в ZBODY – текст заметки, в ZTITLE – ее заголовок. Весь текст не зашифрован и хранится в открытом виде:

Разработчик был уведомлен об обнаруженной уязвимости, но никаких комментариев и/или исправлений не последовало. Упомянутая уязвимость — не единственная, приложение хранит абсолютно все данные в открытом виде.

Один из способов борьбы с этой уязвимостью — использование фреймворка SQLCipher, поддерживающего прозрачное шифрование на лету. Для всех криптографических функций (AES256, генератор псевдослучайных чисел, PBKDF2 ключи) SQLCipher использует библиотеку OpenSSL. Подробное описание, документация и сборки находятся по этой ссылке.

В рамках статьи рассмотрим использование SQLCipher совместно с FMDatabase — популярной оберткой для работы с SQLite базами данных в Cocoa.

Если вы используете Cocoapods, то для добавления FMDatabase и SQLCipher в проект достаточно добавить строчку pod ‘FMDB/SQLCipher’ в podfile. Теперь обратимся к AppDelegate.m:

На этом все, зашифрованная база данных создана и можно начинать работать с ней. Напишем метод для открытия базы данных:

С открытой таким способом базой данных можно совершать любые действия: добавление строк, их удаление и прочее. Конечно, при работе с зашифрованной БД не рекомендуется использовать статичный ключ, зашитый в код приложения. Неплохим альтернативным вариантом будет разработать метод динамической генерации ключа, уникального для каждого устройства (для этого можно использовать комбинацию различных параметров, таких как identifierForVendor или установленный пользователем пароль для доступа к приложению). Смена ключа, используемого БД, происходит так же просто, как и все остальное:

Если один из параметров, на котором основана генерация ключа, является динамическим, не забывайте соответственно его изменениям вызывать этот метод.

Конечно, использование SQLCipher не сможет полностью обезопасить данные пользователей — но оно отпугнет начинающих исследователей и усложнит жизнь опытным взломщикам. Напоследок стоит упомянуть тот факт, что для появления в App Store приложения, использующего этот фреймворк, необходимо предоставить форму ERN, процесс получения которой прекрасно описан JacobL в этом посте.