Все карты SD/SDHC, удовлетворяющие стандартам организации SD Group, поддерживают защиту данных паролем на уровне карты. Это означает, что Вы можете назначить пароль (длиной до 16 байт) для любой карты SD. Если установлен пароль, то операции чтения/записи данных карты заблокированы. Если Вы захотите получить доступ к данным карты, то сначала должны ввести пароль.
Пароль хранится на самой карте, не на компьютере, куда подключается карта. Предоставленный по паролю доступ сохраняется только до тех пор, пока карта получает непрерывное питание; если у карты пропадет питание, и пароль в момент пропадания питания не был снят, то при восстановлении питания карты блокировка по паролю снова придет в действие.
В этой статье (перевод [1]) описывается устройство SD Locker 2. Это автономное устройство с батарейным питанием, которое может установить и сбросить защиту паролем карт SD и SDHC. Это испытательный проект, созданный для демонстрации - как использовать микроконтроллер для манипулирования паролем карты.
На фото показано устройство SD Locker 2, смонтированное в коробочке от леденцов Altoids. Устройство получает питание от двух батареек AA. Маленькая зеленая платка, посаженная на термоклей к сокету карты SD, это повышающий стабилизатор напряжения +3.3V, чтобы питание у карты и микроконтроллера ATmega328P было стабильным.
На правой стороне печатной платы (сверху) установлены красный светодиод (LED) и кнопка для блокировки карты (LOCK). Ниже находится зеленый LED и кнопка для разблокировки карты (UNLOCK).
На левой стороне платы находится одиночная кнопка для выбора доступа либо к TMP_WRITE_PROTECT bit (когда кнопка не нажата), либо к паролю карты (когда кнопка нажата).
[Общая концепция]
Этот проект основан на другом, ранее разработанном проекте SD Locker [2] (электронная начинка этого проекта почти такая же, у него только отсутствует кнопка выбора TMP_WRITE_PROTECT/password), который предоставляет доступ к биту TMP_WRITE_PROTECT карты SD. С помощью этого бита Вы можете запретить доступ к карте на запись, и данные карты будут доступны только для чтения. Однако данные карты будут все ещё доступны, содержимое карты не скрыто от несанкционированного доступа. Проект SD Locker 2 (SDL2) позволит Вам дополнительно установить на карту пароль, так что карту нельзя будет ни прочитать, ни записать.
Доступ к паролю карты SD осуществляется командой CMD42, как это описано в стандарте "SD Specifications Part 1, Physical Layer simplified Specification" организации SD Group, доступном на многих сайтах Интернета (к примеру, см. [3], перевод также см. в статье [4]). Использование регистра команды довольно сложное, и его описание занимает несколько страниц стандарта. В этой статье будут рассмотрены только основные моменты, за подробностями обращайтесь к [3, 4].
Пароль может содержать до 16 байт данных (это не обязательно должны быть видимые символы ASCII). Пароль определяется содержимым 16-байтного регистра PWD, и 1-байтным регистром PWD_LEN. По умолчанию PWD_LEN установлен в 0, показывая тем самым, что пароль карты не установлен.
Чтобы установить пароль на карту, нужно послать карте команду CMD42 вместе со следующей полезной нагрузкой:
Байт |
Функция |
Комментарий |
0 |
Flags |
Описывает операции, производимые командой CMD42. |
1 |
Length |
Содержит количество данных пароля, которые идут далее. |
N |
Data |
Блок данных пароля. |
Байт Flags использует 4 младших бита для определения операции, выполняемой над паролем.
Если установлен бит 0, то данные пароля записываются на карту, чтобы создать новый пароль.
Если установлен бит 1, и следующие данные пароля совпадают с текущим паролем карты, то пароль карты очищается. Это означает, что внутри карты значение PWD_LEN установится в 0, что снимает защиту паролем (при последующем включении карты для доступа к данным разблокировать карту по паролю не нужно).
Если установлен бит 2, и следующие данные пароля совпадают с текущим паролем, то активируется защита паролем на карте, и данные карты заблокированы на доступ чтения/записи. Если бит бит 2 очищен, то защита паролем карты временно деактивируется, и данные карты доступны для чтения/записи.
Если установлен бит 3, карта заблокирована паролем, и следующие данные пароля совпадают с текущим паролем карты, то все содержимое карты, включая регистры PWD и PWD_LEN, будет очищено. Это позволяет снять блокировку карты паролем, однако это также уничтожит все данные на карте.
Поле Length содержит количество байт в следующем блоке данных пароля. Если Вы устанавливаете пароль на карте, у которой пока что нет пароля, то это поле будет длиной записываемого пароля. Однако если у карты уже установлен пароль, и Вы хотите поменять этот пароль, то это поле должно быть суммой длины старого пароля и длины нового пароля. Подробности см. в спецификации [4].
Поле данных Data содержит все данные пароля для текущей команды. Если Вы устанавливаете пароль на карте, которая пока не имеет защиты паролем, то это поле содержит байты пароля. Однако если пароль на карте уже установлен, и Вы хотите поменять этот пароль, то это поле должно содержать байты оригинального пароля, за котором должны идти байты нового пароля.
Обратите внимание, что CMD42 должна быть отправлена Вашим устройством так, как будто это была операция записи сектора. Это означает, что Вы должны предоставить все байты для карты, которые обычно ожидала бы карта в команде записи сектора, даже если пароль короткий до 1 байта. Вы можете просто отправить блок байт 0xff чтобы заполнить оставшийся промежуток, поскольку карта будет использовать только то количество байт, которое задано полем Length.
Здесь следует обратить внимание на некоторые детали. Пароль может быть двоичный. Автор в качестве пароля использовал символы ASCII, поскольку пароль вводился с приглашения клавиатуры, однако Вы свободны в установке в качестве пароля последовательности пароля из "не печатаемых" байт, если это необходимо.
Успешная установка пароля еще не блокирует данные карты. Пока не будет передернуто питание карты, или пока не будет явно отправлена команда CMD42 с командой блокировки, данные карты останутся доступны. В реальной жизни это скорее всего не составляет проблемы, потому что когда Вы установили пароль, после чего извлекли карту из слота SD Locker 2, защита данных паролем немедленно вступит в действие. Это тонкий момент, который возможно не стоит особого внимания.
Спецификация подразумевает, что Вы можете комбинировать некоторые комбинации операций с паролем в одной команде CMD42. В частности спецификация подразумевает, что Вы можете одновременно установить биты 0 и 2 в одной команде, что сразу выполнит 2 действия - установка пароля и блокировка данных карты (активация защиты паролем). Однако на практике оказывается, что это иногда не работает, и зависит от бренда карты. В устройстве SD Locker 2 для надежной работы работа с командой CMD42 реализована по отдельности, сначала установка пароля, и затем блокировка данных.
В любой момент Вы можете определить состояние блокировки паролем отправкой команды CMD13 (SEND_STATUS) и проверкой 2 байт ответа, которые содержат статус карты. В спецификации описано содержимое этого регистра и ответ на команду CMD13. Нужно узнать состояние бита LOCK/UNLOCK, это 8-й бит из 16 бит данных, возвращаемых командой CMD13. Если бит 8 установлен, то это показывает, что карта заблокирована, и если бит 8 сброшен, то это показывает, что карта разблокирована. Если у Вас есть вопросы, то просмотрите содержимое исходного кода проекта SD Locker 2 [8].
[Использование SD Locker 2]
У SD Locker 2 есть три управляющие кнопки. Нажатие кнопки LOCK установит бит TMP_WRITE_PROTECT, чем заблокирует запись данных на карту. Нажатие кнопки UNLOCK очищает битTMP_WRITE_PROTECT, разрешая запись на карту.
Если Вы нажали и удерживаете кнопку PWD, и затем нажали кнопку LOCK, то устройство установит фиксированный пароль карты, и заблокирует карту. Если Вы нажали и удерживаете кнопку PWD, и затем нажали кнопку UNLOCK, то устройство сотрет этот фиксированный пароль и разблокирует карту. После операции UNLOCK на карте нет никакого пароля (PWD_LEN установлен в 0).
Имеются также 2 светодиода, UNLOCK LED и LOCK LED. Они показывают результаты последней операции. Например, если Вы нажали кнопку LOCK, и бит TMP_WRITE_PROTECT был успешно установлен, то LOCK LED будет светиться, а UNLOCK LED не будет.
Если Вы нажали кнопку PWD, светодиоды UNLOCK LED и LOCK LED покажут состояние блокировки карты. Например, если карта заблокирована паролем, то при нажатии кнопки PWD светодиод LOCK LED будет гореть, а светодиод UNLOCK LED погаснет. Когда Вы отпустите кнопку PWD, светодиоды UNLOCK LED и LOCK LED возвратятся к отображению состояния бита TMP_WRITE_PROTECT.
SD Locker 2 имеет 4-выводный коннектор для последовательной передачи данных по протоколу TTL-RS232. Имейте в виду, что уровни сигналов на этом коннекторе имеют логические уровни CMOS (т. е. 0 и +3.3V), но не в коем случае не уровни стандартного RS-232! Чтобы осуществить соединение с компьютером для передачи данных через RS-232, понадобится определенная схема преобразования уровней. Самым лучшим решением для этой цели будет использование переходника USB - TTL-UART (можно купить на aliexpress или dx.com). Имейте в виду, что для нормальной работы SD Locker 2 подключение к компьютеру через последовательный порт не требуется. Однако последовательный порт может использоваться для управления устройством SD Locker 2, и также предоставляет некоторую дополнительную информацию о работе.
Работа SD Locker 2 была опробована с дюжиной карт SD от разных производителей. Карты затем подключались к разным компьютерам, ноутбукам от лаптопов до до старого Mac Mini и к довольно современным игровым компьютерам PC. Карты подключались к компьютеру напрямую (в слот карт SD лаптопов и ноутбуков) и через USB-адаптеры разных производителей для чтения карт SD. Защита карт проверялась на разных операционных системах, включая старые версии Mac OS X, Windows XP и Windows 7.
Во всех случаях компьютер просто не видел подключенную карту. Не тот случай, когда Windows отображала иконку карты, но не могла открыть карту. Компьютер даже не обнаруживал тот факт, что карта была установлена. Если вставить защищенную паролем карту SD в лаптоп, настроенный на загрузку с карты SD через адаптер USB, то лаптоп просто зависал, ожидая появления устройства памяти, с которого можно было бы загрузиться.
[Для чего это нужно]
Этот проект дает доступ к функции безопасности, встроенной в карты SD изначально. Странно, что эта функция защиты чаще всего не используется. Автор нашел ссылку на использованием компанией Microsoft блокировки паролем карты на телефоне Nokia Focus [5]. Но кроме некоторых поставщиков, которые используют заблокированные паролем карты SD как своего рода встроенное хранилище данных для их устройства, остальные как будто не подозревают о существовании такой концепции защиты данных.
Однако возможности такой защиты огромны. С помощью устройства наподобие SD Locker 2 можно заблокировать доступ к финансовым данным, бизнес-планам, персональной информации, историческим заметкам, частным данным, программному обеспечению в стадии разработки и т. д.; почти все, что Вы можете сохранить на компьютере, можно также сохранить и на заблокированной паролем карте SD.
Будучи заблокированной, карта может быть физически перенесена в любое место и передана получателю для использования, и пароль защитит данные карты от несанкционированного доступа. При использовании маленьких карт размера microSDHC с их большой емкостью можно безопасно переносить и защищать данные с помощью устройства SD Locker 2.
Блокировка паролем также работает как инструмент защищенного архива. Просто разблокируйте карту, обновите её содержимое, заново активируйте блокировку и сохраните карту в безопасном месте. Невозможно будет прочитать карту без её разблокировки, и даже если карта будет потеряна или украдена, о безопасности данных можно не беспокоиться.
К безопасности данных относится существование некого риска наличия бэкдора, встроенного спецслужбами или производителем для обхода защиты карты. Автор ознакомился с многими статьями Сноудена по теме безопасности карт SD, но это не означает, что безопасность пароля не может быть скомпроментирована. Однако безопасность данных карты SD решительно отличается от безопасности данных, которые мы храним в Интернете. Существование бекдора на карте SD не поможет, если нет физического доступа к карте, что дает некоторую дополнительную защиту.
[Модификации и идеи]
Очевидной идеей было бы портировать эту разработку на Arduino, что раскрывает возможность защиты данных для многочисленных пользователей этой платформы. Код проекта достаточно прост, и есть готовые платы Ardouno и шилды со слотами карт SD, которые можно использовать для этой цели.
SD Locker 2 не использует контакт для определения наличия карты в слоте, который есть на большинстве коннекторов слота карт SD. Можно довольно просто добавить опрос этого контакта микроконтроллером, чтобы при подключении карты состояние светодиодов обновлялось немедленно. Код текущего проекта просто ожидает нажатия пользователем на кнопки, чтобы осуществилась попытка доступа к карте SD.
Можно создать адаптер USB с необходимыми кнопками и светодиодами, как у оригинального устройства SD Locker 2. Это может предоставить Вам единое устройство хранения с управлением защитой паролем кнопками. Это также позволит Вам создать защищенный паролем скрытый компьютер (password-protected stealth PC [6]), с дополнительной защитой возможности загрузки.
Адаптер USB можно снабдить подходящим кодом для модификации пароля. Проект SD Locker 2 использует простой, фиксированный пароль (жестко вшитый в код), однако работу устройства можно улучшить чтением регистра CID карты, который уникален для каждой карты, и вычислять по нему хеш на основе пароля (возможно вычисление хеша также по информации о Вас, Вашей группе, или по информации о Вашем PC), затем использовать этот пароль на основе хеша для блокировки карты.
Автор надеется, что этот проект заинтересует других людей для создания устройств с подобным функционалом. Код этого проекта можно без ограничений использовать в качестве стартовой точки для других разработок.
Схему проекта в виде документа PDF можно скачать с сайта автора. В архиве ZIP находится исходный код проекта и готовая прошивка в формате HEX, которую можно запрограммировать в микроконтроллер ATmega328P. Исходный код алгоритма работы с защитой карты SD находится в отдельном файле, кроме библиотеки UART. При желании код UART можно выкинуть из проекта SD Locker 2, для работы достаточно иметь кнопки и светодиоды.
Для разработки обмена данными с картой на низком уровне использовался исходный код знаменитой библиотеки ChaN FatFS [7]. Как и проект SD Locker [2], код проекта SD Locker 2 использует генератор CRC7, полученный с сайта Pololu.
[Ссылки]
1. Password-protect your SD cards site:seanet.com. 2. Build the SD Locker and Make Your SD Cards More Secure site:seanet.com. 3. SD Specifications Part 1 Physical Layer Simplified Specification Version 2.00 September 25, 2006 site:users.ece.utexas.edu. 4. Подключение карт SD через SPI (упрощенное описание стандарта). 5. Windows Phone 7's microSD mess: the full story (and how Nokia can help you out of it) site:engadget.com. 6. Building a Stealth PC site:seanet.com. 7. Библиотека FatFS: модуль файловой системы FAT. 8. 171004sdlocker.zip - исходный код, прошивки, документация. |