Skip to Content
 Русский Русский    English English   

 

Шифрование Android

Шифрование Android

Смартфоны прочно заняли свое место в нашей жизни. Мы доверяем им свои персональные данные, порой весьма конфиденциальные, не задумываясь о тех случаях, когда устройство попадает в чужие руки. Иной раз такая недальновидность может привести к катастрофе. На данный момент смартфоны на платформе Андроид лидируют по числу продаж во всем мире. Преимущества Android - использование открытых технологий, удобство в эксплуатации, наличие возможности шифрования данных.

Став счастливым обладателем смартфона на базе Android, меня стало интересовать, насколько надежно смартфон шифрует мои данные? Этой увлекательной теме я посвятила несколько октябрьских вечеров и данную статью. Для наглядности представила в графическом виде архитектуру модуля Сryptfs и алгоритм шифрования Android.

 

Безопасность шифрования Android

Максимально обезопасить свои данные на устройствах под управлением ОС Android позволяет полное шифрование диска. Шифрование данных было добавлено в Android 3.0 Honeycomb, данная версия Android была ориентирована для планшетов. Впервые для владельцев смартфонов возможность шифрования появилась в версии 4.0. Механизмы реализации системы шифрования данных буду рассматривать на примере новых версий Android.

Полное шифрование диска защищает конфиденциальные данные в случае потери устройства, кражи или конфискации по какой-либо причине. Для сотрудников спецслужб получение данных на зашифрованных устройствах весьма затруднено и зависит от ряда условий. Если устройство выключили во время транспортировки или же просто разрядилась батарея, то процесс получения данных осложняется.  Дело в том, что полное шифрование уязвимо для атаки "холодная загрузка" (сold-boot), с помощью которой методом физической заморозки устройства возможно считать информацию из оперативной памяти. Это достигается благодаря тому, что оперативная память при потере питания очищается в течение определённого количества времени, а при заморозке процесс очищения замедляется и может продолжаться от нескольких секунд до нескольких минут. Из оперативной памяти устройств на базе Android можно извлечь ключи AES, но расшифровка диска возможна только при разблокированном загрузчике. Прибегнуть к процедуре по разблокированию загрузчика можно лишь в том случае, когда разблокировка не приводит к уничтожению всех пользовательских данных (что зависит от конкретной модели устройства). Но даже если загрузчик заблокирован, то из оперативной памяти можно извлечь списки контактов, посещаемые веб-сайты, фотографии и др. Впервые данный вид атаки на смартфоны продемонстрировали немецкие исследователи, которые назвали свой метод FROST. Они продемонстрировали атаку на Samsung Galaxy Nexus, однако на смартфоне Samsung Galaxy SII им не удалось расшифровать диск, объяснили это тем, что шифрование на данном устройстве отличается от шифрования в официальном релизе Android.

Сотрудники US-CERT в статье "The growing impact of full disk encryption on digital forensics" описали три главные проблемы получения данных с зашифрованных устройств: во-первых, люди, собирающие доказательства, могут выключить устройство, не понимая, что оно зашифровано; во-вторых, если не известно, что устройство зашифровано, то команда аналитиков может потратить несколько часов впустую, пытаясь прочитать данные с устройства; в-третьих, в случае дискового шифрования уровня аппаратных средств, вмешательство в устройство может вызвать самоуничтожение данных.

Если у сотрудников спецслужб атака методом заморозки устройства не увенчалась успехом, то возможно применение техники перебора паролей (brute force), например, с помощью программы viaExtract. По-умолчанию в Android используется один и тот же пароль для разблокировки экрана и для шифрования данных. Это слабое место шифрования в Android, потому что длинный и сложный пароль крайне неудобно вводить каждый раз для разблокировки экрана, а простой пароль подвержен брутфорс-атаке. Чтобы сменить пароль для шифрования данных на длинный и сложный, оставив при этом простой пароль для разблокировки экрана, необходим root доступ, который по-умолчанию отсутствует. Необходимые для брутфорс-атаки данные (зашифрованный мастер-ключ и соль) находятся в конце раздела /data. Подбираемый пароль прогоняется при помощи 2000 циклов по стандарту PBKDF2 с солью, далее полученный ключ и IV (вектор инициализации) используются для расшифровки мастер-ключа, с помощью которого и расшифровываются данные. Детали брутфорс-атаки были изложены Томасом Кэнноном на конференции Defcon в 2012 году.

Перебор паролей на экране блокировки на тачскрине приведет к тому, что Android заблокирует экран и потребует ввести адрес электронной почты и пароль от аккаунта Google для разблокировки. Android хранит данные аккаунта в устройстве, поэтому подключение к сети не требуется. Спецслужбы постановлением суда могут направить официальный ордер в адрес компании Google с целью предоставить доступ (пример ордера, когда эксперты-криминалисты спецотдела ФБР не смогли получить доступ к смартфону Samsung SGH-T679). В таком случае требуется присутствие устройства к сети, а это может повлечь за собой уничтожение всех пользовательских данных хозяином устройства через удаленное управление. Поэтому спецслужбы предпочитают использовать WiFi-канал вместо EDGE/3G с предоставлением доступа определенным ip-адресам Google и протоколированием трафика.

Полное шифрование диска подвержено атаке "Evil maid" (также известной под названием bootkits). Имея физический доступ к устройству  можно записать в системный раздел приложение, которое будет ждать, когда пользователь загрузит телефон и затем предоставит удаленный доступ в расшифрованный пользовательский раздел. Возможен вариант подсаживания кейлоггера, который записывает пароль пользователя и передает по сети. Эта атака осуществима при условии наличия разблокированного загрузчика.

 Несмотря на данные уязвимости, шифрование диска максимально затрудняет получение данных с устройства, а при наличии пароля достаточной длины и сложности и заблокированного загрузчика (разблокировка которого приводит к уничтожению пользовательских данных) доступ к шифрованному персональному разделу практически не осуществим.

 

Что шифруем

Андроид шифрует раздел /data, который содержит все пользовательские данные, аккаунты, точки доступа и т.д. Данные хранятся в базе данных SQlite, чтение которых можно осуществить, например, с помощью дополнения к Firefox - SQLite Manager. Далее примеры баз данных с персональными данными.

Контакты:
/data/data/com.android.providers.contacts/databases/contacts2.db

История звонков:
/data/data/com.sec.android.provider.logsprovider/logs.db

Смс:
/data/data/com.android.providers.telephony/databases/mmssms.db

Email:
/data/data/com.android.email/databases/EmailProvider.db
/data/data/com.android.email/databases/EmailProviderBody.db

Аккаунты:
/data/system/accounts.db

История браузера:
/data/data/com.android.browser/databases/

Wi-fi пароли:
/data/misc/wifi/wpa_supplicant.conf

Пароль (PIN-код) на экран блокировки и соль:
/data/system/password.key

/data/data/com.android.providers.settings/databases/settings.db
SELECT * FROM secure WHERE name ='lockscreen.password_salt'
или
/data/system/locksettings.db
SELECT * FROM locksettings where name='lockscreen.password_salt'

История перемещений пользователя (до версии 4.0) хранится в папке /data/data/com.google.android.location/files/ в файлах cache.cell и cache.wifi. Android для получения координат использует метод опроса близлежащих сотовых станций и точек доступа Wi-Fi. Максимальное количество хранимых данных ограничено 50 записями для сот и 200 записями для WiFi-точек.

 

Теория полного шифрования диска в Android

Полное шифрование диска в Android основано на модуле dm-crypt из набора device-mapper. Это стандартная система криптозащиты дисков Linux, осуществляющая прозрачное для пользователя шифрование. В Linux за управление dm-crypt отвечает утилита cryptsetup, однако в Android данная утилита не используется из-за политики лицензирования - Google требует Apache-совместимой лицензии приложений, не входящих в ядро, поэтому в Android не включено программное обеспечение, распространяемое на условиях GPLv2.

В Android был разработан модуль Сryptfs, который взаимодействует с dm-crypt и реализует ряд команд по созданию и монтированию шифрованных разделов, проверки и смены пароля и др. Сryptfs был добавлен в состав демона Vold (Volume Demon). Vold принимает команды из пространства пользователя для выполнения операций по монтированию, а теперь и шифрованию устройств, а также занимается посылкой сообщений из ядра в пространство пользователя. Vold состоит из таких компонентов, как CommandListener, VolumeManager, DirectVolume, Volume, NetlinkManager, Cryptfs, Devmapper  и др.

Архитектура Cryptfs в Android 4.3:

Шифрование Android. Архитектура Cryptfs в Android

  • StorageManager - интерфейс по управлению хранилищами для приложений Android. StorageManager управляет такими элементами, как Opaque Binary Blobs (OBB). OBB позволяет упаковать файлы в один и хранить в общедоступном месте, а расшифровать и использовать файлы сможет только приложение, у которого есть соответствующие на это права. Android использует OBB начиная с версии 2.3.
  • MountService реализует серверные службы для управления хранилищами.
  • NativeDaemonConnector устанавливает соединение между MountService и демоном Vold.
  • CommandListener ожидает команды от NativeDaemonConnector и посылает их на выполнение соответствующим компонентам. Для коммуникации с NativeDaemonConnector используется vold сокет.
  • Cryptfs выполняет команды по созданию и монтированию шифрованных разделов, проверки и смены пароля и др.
  • VolumeManager обеспечивает выполнение команд, поступающих из CommandListener. Информирует MountService о статусе изменения томов.
  • Volume осуществляет дисковые операции mount, unmount и др. DerectVolume является подклассом Volume.
  • NetlinkManager устанавливает соединение с Sysfs: открывает сокет и слушает uevents (события, генерируемые Sysfs). Создает экземпляр NetlinkHandler с открытым сокетом и активирует его, чтобы начать слушать Netlink сокет.
  • NetlinkHandler ожидает и обрабатывает uevents, вызывает обработчики команд, определенные в VolumeManager.
  • Sysfs - виртуальная файловая система, унаследованная из Linux (монтируется на /sys/sys), экспортирует информацию об устройствах и драйверах из ядра в пространство пользователя, также используется для конфигурации.
  • Devmapper - интерфейс для работы с device mapper, осуществляет шифрование блочного устройства.
  • Device Mapper - компонент ядра, с помощью которого организуется управление логическими томами - создаёт и обеспечивает работу нового логического блочного устройства на основе списка интервалов секторов блочных устройств. Каждый сектор логического устройства отображается с помощью определенного метода на существующие блочные устройства. Модуль dm-crypt из набора device-mapper реализует метод crypt отображения виртуального блочного устройства на низлежащее блочное устройств.
  • Power - интерфейс для работы с электропитанием. Приложения и сервисы запрашивают ресурсы ЦПУ с помощью механизма "блокировки сна" (англ. wake locks - механизмы-инструкции, которые не позволяют устройству на основе ядра Linuх перейти в режим глубокого сна) через фреймворк приложений и стандартные библиотеки Linux. Если нет активных "блокировок сна", то Android остановит ЦПУ. Библиотеки из пространства пользователя (любые функции аппаратных средств из /device/lib/hardware/) не должны вызывать Android Power Management непосредственно. Обход политики управления электропитанием во времени выполнения Андроида дестабилизирует систему.
  • Android Power Management - это надстройка над Linux Power Management, разработана для того, чтобы ЦПУ не потреблял мощность, если приложения или сервисы ее не требуют.
  • Libc (C runtime library) - вариант стандартной библиотеки языка Си, разработанный Google под названием Bionic.
  • Cutils - библиотека Android, необходимая для работы системы свойств (свойства позволяют обмениваться информацией между процессами), логирования и др.  Исходники находятся в папке system/core/libcutils, хидеры - system/core/include/cutils.
  • System Call Handler - механизм взаимодействия процессов из пространства пользователя с ядром. Системный вызов возникает, когда пользовательский процесс требует некоторой службы, реализуемой ядром, и вызывает специальную функцию. Системные вызовы в общем случае защищают доступ к ресурсам, которыми управляет ядро.
  • OpenSSL - криптографический пакет, поддерживает различные стандарты сертификации, шифрования, хеширования.

В качестве алгоритма шифрования используется 128 AES с режимом шифрования CBC и ESSIV:SHA256. Мастер-ключ зашифрован другим 128-битным AES ключом, полученным из пользовательского пароля при помощи 2000 циклов PBKDF2 с 128 битами случайной соли через вызов библиотеки openssl. Соль используется для добавления большей случайности при создании хеша по стандарту PBKDF2 и предотвращает от "rainbow table" атак на пароль.

Сryptfs.c:

#define HASH_COUNT 2000
#define KEY_LEN_BYTES 16
#define IV_LEN_BYTES 16
...
static void pbkdf2(char *passwd, unsigned char *salt, unsigned char *ikey)
{
    /* Turn the password into a key and IV that can decrypt the master key */
    PKCS5_PBKDF2_HMAC_SHA1(passwd, strlen(passwd), salt, SALT_LEN,
                           HASH_COUNT, KEY_LEN_BYTES+IV_LEN_BYTES, ikey);
}

static int encrypt_master_key(char *passwd, unsigned char *salt,
                              unsigned char *decrypted_master_key,
                              unsigned char *encrypted_master_key)
{
unsigned char ikey[32+32] = { 0 }; /* Big enough to hold a 256 bit key and 256 bit IV */
EVP_CIPHER_CTX e_ctx;
int encrypted_len, final_len;

/* Turn the password into a key and IV that can decrypt the master key */
pbkdf2(passwd, salt, ikey);

/* Initialize the decryption engine */
if (! EVP_EncryptInit(&e_ctx, EVP_aes_128_cbc(), ikey, ikey+KEY_LEN_BYTES)) {
       SLOGE("EVP_EncryptInit failed\n");
       return -1;
}
...

Pbkdf2 генерирует 256 бит, где 128 бит используется как IV (вектор инициализации). Вектор инициализации необходим для уникального результата шифрования одного и того же текста.

Алгоритм шифрования Android:

Алгоритм шифрования Android

Шифрование мастер-ключа другим ключом позволяет быстро менять пользовательский пароль, так как при смене пароля заново шифруется только ключ, а не весь раздел. Зашифрованный мастер-ключ, соль и другие данные, необходимые для расшифровки, сохраняются в последних 16 КБайт зашифрованного раздела /data.

 

Получение пароля от пользователя при загрузке системы было большой проблемой для разработчиков, так как пароль запрашивается у пользователя в пользовательском интерфейсе (UI), однако для запуска UI необходим раздел /data. Разработчики решили проблему следующим образом. При загрузке Android создается временный раздел /data, который монтируется на tmpfs в Ram-disk, необходимый для запроса пароля. После этого временная файловая система в точке /data перемонтируется на реальную расшифрованную.

У разработчиков также были проблемы с завершением и перезапуском различных сервисов для того, чтобы /data мог быть перемонтирован. Каждый процесс, который открыл файлы на временной файловой системе, должен быть остановлен и запущен с использованием реального раздела /data. Для этого решено было каждый сервис (службу) определить в одну из трех классов (групп): базовый (core),  главный (main) и поздний старт (late_start). Базовые сервисы никогда не завершаются после старта. Главные сервисы завершаются и перезагружаются после запроса пароля. Late_start сервисы не стартуют до расшифровки и монтирования /data. Для использования этих действий свойству "vold.decrypt" устанавливаются различные значения. Также в init была добавлена новая команда "class_reset" для остановки сервисов, но позволяющей рестартовать сервисы командой "class_start". Если используется команда "class_stop" вместо новой команды "class_reset", то к состоянию различных останавливаемых сервисов  добавляется флаг SVC_DISABLED.

 

Включение шифрования в Android

Чтобы включить полное шифрование диска, необходимо предварительно задать пароль на экран блокировки. Для этого в главном меню выберите "Настройки" -> "Экран блокировки" -> "Блокировка экрана" -> "PIN-код". Для шифрования данных пароль запрашивается минимум из 6 символов, с обязательным наличием хотя бы одной буквы. После процедуры шифрования Android разрешает изменить пароль до 4-х символов, но делать этого не рекомендуется.

Шифрование включается в разделе "Настройки" -> "Безопасность" -> "Зашифровать устройство". Во время шифрования необходимо подключить зарядное устройство. В случае прерывания процесса шифрования все данные могут быть потеряны.

Изменить интервал блокировки экрана (от мгновенной блокировки до максимум 30 минут) можно в разделе "Настройки" -> "Экран блокировки" -> "Блокировать автоматически". Мгновенная блокировка клавишей доступна в разделе - "Настройки" -> "Экран блокировки" -> "Мгнов.блок.клавишей".

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

$ su -c vdc cryptfs changepw пароль

Это не повлияет на PIN-код для разблокировки экрана, но если изменить PIN-код, то указанную команду необходимо заново запустить.

Если пароль для шифрования данных забыт, то восстановить его нельзя и в таком случае спасет только сброс Android до заводских настроек, при этом все пользовательские данные будут потеряны.

В последних версиях Android доступна возможность возврата к незашифрованному разделу с сохранением всех пользовательских данных.

Выводы

Шифрование Android при соблюдении ряда условий способно надежно уберечь персональные данные от постороннего глаза. Включение шифрования - довольно простая процедура. Процесс шифрования полностью автоматизирован и на смартфоне, например, Galaxy S3 составляет порядка 15 минут. Надеюсь, что мои изыскания по данной тематике помогут Вам с полным пониманием пользоваться этой возможностью Android.

Кроме физического доступа к устройству, персональным данным может угрожать их кража посредством вредоносных программ или перехвата трафика. Часть 2 - Сервисы и программы безопасности для Android.

 

Полезные ссылки:

Евгений Зобнин: Шифрофоны  в массы. Журнал Хакер

Android forensics techniques

Android Low-Level System Architecture

Cracking Android encryption using brute force

Eoghan Caseya, Geoff Fellowsb, Matthew Geigerc, Gerasimos Stellatosd: The growing impact of full disk encryption on digital forensics, Digital Investigation. Volume 8, Issue 2

Notes on the implementation of encryption in Android 3.0

Thomas Cannon: Into the Droid: Gaining Access to Android User Data. In DefCon, July 2012.

Tilo Muller, Michael Spreitzenbarth and Felix C. Freiling: FROST: Forensic Recovery Of Scrambled Telephones

William.L: Android Storage - Vold (Honeycomb 3.2)

 

 
Ваша оценка: Нет Средняя: 4.7 (32 голоса)