Я только что установил Marshmallow на Nexus 5 через push-обновление. Я не совсем понимаю, как работает шифрование. У меня есть хорошие технические знания о шифровании на компьютерах. Я хотел бы получить аналогичные знания об Android 6.
Вот что я сделал и как запутался. После сброса настроек я установил PIN-код и зашифровал устройство. При загрузке он попросил у меня PIN-код, который ожидался. Затем я удалил PIN-код и перезапустил устройство. Он не запрашивал PIN-код при загрузке, но устройство по-прежнему сообщало о себе как зашифрованное в меню настройки. Последнее меня смущает, так как я ожидал, что PIN-код разблокирует ключ дешифрования.
Вопросов:
- Откуда взялся ключ дешифрования в случае шифрования без PIN-кода? Я предполагаю, что он хранится на чипе, похожем на TPM, это правильно? Если так, что мешает хакеру запросить этот ключ у чипа? Проверяет ли хэш прошивки? Что-нибудь еще? Технические детали будут высоко оценены.
- В случае шифрования с помощью PIN-кода, используется ли PIN-код в качестве дополнительного токена для доступа к ключу дешифрования? Или процесс расшифровки работает точно так, как если бы не было PIN-кода.
TL; DL ответ:
Ключ расшифровки разблокирован со всеми следующими:
- PIN-код (или пароль и т. Д.) Или пароль по умолчанию, если его нет
- TEE (генератор подписи с аппаратной поддержкой, который использует ключи, которые не могут быть извлечены)
- Соль (легкодоступная, но предотвращающая атаки радужных таблиц)
6.0-marshmallow
disk-encryption
marcv81
источник
источник
Ответы:
Я цитирую руководство по Android здесь , но:
НОТА:
Источник, который я использовал, не имеет прямого отношения к Зефиру, но имеет отношение к Леденцу и выше.
TL: DR
Я просто сейчас отвечу на вопросы ОП. Технические детали будут следовать.
Ключ шифрования по умолчанию исходит от аппаратного источника (микросхема, похожая на TPM) и пароля AOSP по умолчанию, определенного как
default_password
вcryptfs.c
исходном файле, см. Ниже.Да, не только по умолчанию, но любой пароль превращается в ключ и хранится в микросхеме типа TPM, называемой TEE (сокращение от «Trusted Execution Environment», дополнительную информацию см. Ниже).
Хакер с UART / JTAG-доступом к микросхемам на SoC устройства может технически получить доступ к ключу TEE, или пользовательское ядро может передать эту информацию хакеру. Некоторые трехбуквенные агентства в теориях заговора могут, возможно, вступить в партнерские отношения с ОЕМ, чтобы эти небезопасные ядра использовались в производственных устройствах, но я бы не стал прилагать к этому много усилий. Снова, посмотрите последний раздел этого ответа для получения дополнительной информации.
Единственное, что мешает хакеру получить доступ к ключу, - это огромное количество усилий, необходимых для этого.
dm-verity
. Однако это не зависит от состояния шифрования.Источник: руководство по безопасности AOSP здесь .
обзор
При первой загрузке устройство создает случайно сгенерированный 128-битный мастер-ключ, а затем хэширует его с паролем по умолчанию и сохраненной солью. Пароль по умолчанию: «default_password». Однако полученный хеш также подписывается через TEE (такой как TrustZone), который использует хэш подписи для шифрования главного ключа.
Вы можете найти пароль по умолчанию, определенный в файле cryptfs.c проекта Android с открытым исходным кодом .
Когда пользователь устанавливает PIN-код / пароль или пароль на устройстве, только 128-битный ключ повторно шифруется и сохраняется. (т.е. изменения ПИН-кода / пароля / шаблона пользователя НЕ вызывают повторное шифрование раздела пользовательских данных.)
Запуск зашифрованного устройства с шифрованием по умолчанию
Это то, что происходит, когда вы загружаете зашифрованное устройство без пароля. Поскольку устройства Android 5.0 шифруются при первой загрузке, не должно быть установленного пароля, и поэтому это состояние шифрования по умолчанию.
Определите, что устройство Android зашифровано, потому что / данные не могут быть подключены, и один из флагов
encryptable
илиforceencrypt
установлен.vold
устанавливаетvold.decrypt
значениеtrigger_default_encryption
, которое запускаетdefaultcrypto
службу.trigger_default_encryption
проверяет тип шифрования, чтобы узнать, зашифрованы ли / data с паролем или без него.Создает
dm-crypt
устройство поверх блочного устройства, чтобы оно было готово к использованию.vold
затем монтирует дешифрованный раздел реального / данных и затем готовит новый раздел. Он устанавливает свойствоvold.post_fs_data_done
к0
и затем устанавливаетvold.decrypt
вtrigger_post_fs_data
. Это вызываетinit.rc
запуск егоpost-fs-data
команд. Они будут создавать необходимые каталоги и ссылки , а затем установитьvold.post_fs_data_done
в1
.После того, как
vold
видит 1 в этой собственности, она устанавливает свойствоvold.decrypt
в:trigger_restart_framework
. Это заставляетinit.rc
снова запускать службы в классе,main
а также запускать службы в классе late_start впервые после загрузки.Теперь платформа загружает все свои сервисы, используя расшифрованные данные / данные, и система готова к использованию.
Запуск зашифрованного устройства без шифрования по умолчанию
Это то, что происходит при загрузке зашифрованного устройства с установленным паролем. Пароль устройства может быть пин-кодом, шаблоном или паролем.
Определите, что устройство Android зашифровано, потому что флаг
ro.crypto.state = "encrypted"
vold
устанавливаетсяvold.decrypt
наtrigger_restart_min_framework
потому что / данные зашифрованы паролем.init
устанавливает пять свойств для сохранения начальных параметров монтирования, заданных для / data, с параметрами, переданными изinit.rc
.vold
использует эти свойства для настройки криптографического отображения:ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags
(8-значный шестнадцатеричный номер ASCII, которому предшествует 0x)Фреймворк запускается и видит, что
vold.decrypt
установленоtrigger_restart_min_framework
. Это говорит фреймворку, что он загружается сtmpfs /data
диска и ему нужно получить пароль пользователя.Однако сначала необходимо убедиться, что диск был правильно зашифрован. Он посылает команду
cryptfs cryptocomplete
кvold
.vold
возвращает 0, если шифрование было успешно завершено, -1 при внутренней ошибке или -2, если шифрование не было успешно завершено.vold
определяет это, просматривая крипто-метаданные дляCRYPTO_ENCRYPTION_IN_PROGRESS
флага. Если он установлен, процесс шифрования был прерван, и на устройстве нет доступных данных.Если
vold
возвращается ошибка, пользовательский интерфейс должен отобразить сообщение для пользователя, чтобы перезагрузить устройство и выполнить заводские настройки устройства, и дать пользователю кнопку, чтобы нажать для этого.После
cryptfs cryptocomplete
успешного завершения среда отображает пользовательский интерфейс, запрашивающий пароль диска. Чеки UI пароль, отправив командуcryptfs checkpw
вvold
. Если пароль правильный (что определяется путем успешного монтирования дешифрованного/data
во временном местоположении, а затем его размонтирования), vold сохраняет имя дешифрованного блочного устройства в свойствеro.crypto.fs_crypto_blkdev
и возвращает статус 0 в пользовательский интерфейс. Если пароль неверный, он возвращает -1 в пользовательский интерфейс.Пользовательский интерфейс создает криптографическую загрузку и затем вызывает команду vold
cryptfs restart
.vold
устанавливает свойствоvold.decrypt
наtrigger_reset_main
, что вызываетinit.rc
делатьclass_reset main
. Это останавливает все службы вmain
классе, что позволяетtmpfs /data
отключаться.vold
затем монтирует дешифрованный реальный/data
раздел и подготавливает новый раздел (который, возможно, никогда не был подготовлен, если он был зашифрован с помощью параметра очистки, которое не поддерживается в первом выпуске). Он устанавливает свойствоvold.post_fs_data_done
к0
и затем устанавливаетvold.decrypt
вtrigger_post_fs_data
. Это заставляетinit.rc
его запускатьpost-fs-data commands
. Они будут создавать необходимые каталоги и ссылки , а затем установитьvold.post_fs_data_done
в1
. Как толькоvold
видит1
в этом свойстве, оно устанавливает свойствоvold.decrypt
вtrigger_restart_framework
. Это вызываетinit.rc
запуск служб в классеmain
снова, а также запуск служб в классеlate_start
впервые после загрузки.Теперь фреймворк загружает все свои сервисы, используя расшифрованную файловую систему / data, и система готова к использованию.
Хранение зашифрованного ключа
Зашифрованный ключ хранится в крипто-метаданных. Аппаратное обеспечение реализовано с использованием возможности подписи Trusted Execution Environment (TEE). Ранее мы шифровали мастер-ключ с помощью ключа, сгенерированного путем обращения
scrypt
к паролю пользователя и сохраненной соли.Чтобы сделать ключ устойчивым к внешним атакам, мы расширяем этот алгоритм, подписывая полученный ключ хранимым ключом TEE. Результирующая подпись затем превращается в ключ соответствующей длины еще одним применением
scrypt
. Этот ключ затем используется для шифрования и дешифрования главного ключа. Чтобы сохранить этот ключ:scrypt
пароль пользователя и соль для получения 32-байтового промежуточного ключа 1 (IK1).scrypt
к IK2 и соли (та же соль, что и на шаге 2) для получения 32-байтового IK3.источник