Как работает Phantomdrive и для чего это вообще нужно?
<div class="articl-text-cover" style="position:relative;width:100%;max-width:800px;margin-left:auto;margin-right:auto;aspect-ratio:1200/676;margin-bottom:2rem;overflow:hidden">
<div itemprop="articleBody">Обычное шифрование защищает файлы, пока владелец не раскрывает пароль. Однако в некоторых странах человека могут заставить разблокировать носитель, а сам факт наличия зашифрованного раздела способен вызвать дополнительные вопросы. Открытый проект Phantomdrive предлагает другой подход: при подключении флешка показывает компьютеру обычный накопитель объёмом 8 ГБ, а оставшаяся память не определяется операционной системой.
Скрытый раздел открывается без отдельной программы. Пользователь редактирует текстовый файл на доступной части накопителя и записывает строку <code>password
UTYOURPASSWORDHERE</code>, подставляя вместо шаблона свой пароль. Устройство перехватывает запись, извлекает пароль, отключает видимый раздел и подключает зашифрованную область. Шифрование и расшифровка выполняются внутри самой флешки с помощью AES-256.
<pre><code class="language-text">password
UTYOURPASSWORDHERE</code></pre> Разработчик позиционирует Phantomdrive как носитель с правдоподобным внешним содержимым. Компьютер получает сведения только об открытых 8 ГБ и не видит оставшуюся ёмкость диска. Подход отличается от скрытого тома VeraCrypt: программный контейнер обычно оставляет признаки дополнительного зашифрованного пространства, тогда как Phantomdrive ограничивает доступ на уровне контроллера USB-накопителя.
Проект полностью открыт. В свободном доступе опубликованы принципиальная схема, печатная плата, прошивка и конструкция корпуса. Для проектирования использовались открытые инструменты, поэтому устройство можно изучить, изменить или собрать самостоятельно.
Основой накопителя служит микроконтроллер CH569. Чип выпускает та же компания, которая производит преобразователь CH340, хорошо известный по недорогим платам, совместимым с Arduino. В Phantomdrive задействованы контроллер USB 3.0, интерфейс SD/eMMC и аппаратный блок AES. Внутри CH569 также есть модуль китайского алгоритма SM4, но в проекте он не используется.
Память хранится на карте SD. Разработчик планировал применить eMMC, однако рост спроса со стороны производителей оборудования для искусственного интеллекта поднял цены на подобные микросхемы. Версия с eMMC должна появиться позже, когда стоимость памяти снизится.
Карта SD остаётся физически доступной при разборке корпуса, но вся скрытая область зашифрована. Половинки корпуса склеены эпоксидной смолой, поэтому вскрытие, скорее всего, повредит накопитель. Подобная защита не заменяет специализированный корпус с датчиками вмешательства, но усложняет незаметное извлечение карты.
Электронная часть состоит из CH569, разъёма USB, двух понижающих преобразователей напряжения, карты SD, кнопки обновления прошивки и вспомогательных компонентов. На плате также предусмотрены контактные площадки UART, которые используются во время разработки и отладки.
После публикации проекта на GitHub появились автоматически составленные отчёты о возможных уязвимостях. Часть замечаний описывала уже исправленные ошибки, часть содержала неверные выводы, а некоторые реальные ограничения подавались без учёта модели угроз. Наиболее содержательная дискуссия коснулась режима AES-XTS, который обычно применяют для шифрования дисков.
Работу криптографической части разработчик проверял функциональными тестами. Прошивка шифровала известные данные, после чего результат сравнивался с реализацией AES в OpenSSL. Совпадение подтверждало, что аппаратный блок и программная логика выполняют преобразования одинаково.
Пароль нельзя напрямую использовать как ключ AES-256. Алгоритму требуется ключ длиной 32 байта, однако простое дополнение пароля нулями почти не усложняет перебор. Слабую комбинацию вроде <code>password1234</code> современное оборудование может проверить за короткое время.
<pre><code class="language-c">uint8_t key[32] = {0}; memcpy(key, password, password_length);</code></pre> Дополнительную проблему создают заранее рассчитанные таблицы. Злоумышленник может один раз подготовить ключи для распространённых паролей, а затем быстро сравнивать их с данными разных устройств. Phantomdrive добавляет к паролю уникальную соль, связанную с конкретным экземпляром флешки. Поэтому таблицу приходится рассчитывать заново для каждого накопителя.
Соль можно узнать в Linux через серийный номер USB-устройства:
<pre><code class="language-bash">udevadm info --query=property --name=/dev/sdc | grep ID_SERIAL_SHORT ID_SERIAL_SHORT=Phantomdrive:34FC1FA7145467F7</code></pre> В приведённом примере солью служит последовательность <code>34FC1FA7145467F7</code>. Значение необходимо сохранить отдельно: без него восстановить данные после поломки контроллера будет сложнее. Переставить карту SD в другой экземпляр Phantomdrive тоже не получится, поскольку новый контроллер использует другую соль.
Название устройства, идентификаторы производителя и продукта USB можно изменить в прошивке. Такая настройка позволяет замаскировать Phantomdrive под другой накопитель, однако неправильные значения способны вызвать проблемы с совместимостью или затруднить восстановление данных.
Функция выработки ключа выполняет 100 тысяч раундов SHA-256 . Повторное хеширование замедляет каждую попытку подбора пароля. Сам накопитель открывает скрытый раздел примерно за три секунды, а атакующий вынужден тратить сопоставимое количество вычислений на каждую проверяемую комбинацию.
<pre><code class="language-c">for (uint32_t i = 0; i < 100000; i++) {sha256(password_and_salt, input_length, key);memcpy(password_and_salt, key, sizeof(key)); }</code></pre> Алгоритмы Argon2 или scrypt могли бы сильнее осложнить перебор, поскольку требуют большого объёма памяти. Возможности CH569 ограничены, поэтому подобные функции не укладываются в доступные ресурсы и приемлемое время разблокировки. Владелец может увеличить число раундов SHA-256, но тогда скрытый раздел будет открываться дольше.
Разработчик также допускает двойное шифрование средствами операционной системы. В другом сценарии аппаратное шифрование можно отключить и использовать Phantomdrive только для сокрытия раздела, поручив защиту данных VeraCrypt, LUKS или BitLocker.
AES обрабатывает блоки по 16 байт, поэтому для диска нужен режим, который связывает множество блоков в единый поток. Самый простой вариант AES-ECB шифрует каждый фрагмент отдельно. Одинаковые открытые блоки при этом превращаются в одинаковый шифротекст, из-за чего структура исходных данных частично сохраняется.
Режим ECB также не защищает порядок и целостность блоков. Злоумышленник может удалить или переставить участки зашифрованных данных, а после расшифровки изменения предсказуемо повлияют на содержимое. Для дискового накопителя подобная схема непригодна.
Phantomdrive поддерживает AES-CTR. Режим шифрует последовательность значений счётчика, а затем объединяет результат с открытым текстом операцией XOR. Упрощённая логика выглядит следующим образом:
<pre><code class="language-c">uint64_t i = 0; while (i < len) {uint8_t stream_byte = aes_encrypt_counter(i);ciphertext = plaintext ^ stream_byte;i++; }</code></pre> Главный риск AES-CTR связан с повторным использованием счётчика. Злоумышленник может скопировать шифротекст, вернуть устройство владельцу, дождаться записи новых данных и снова получить содержимое диска. Если одна из двух версий частично известна или угадывается, повторившийся поток позволяет восстановить информацию из другой.
Для дисков обычно применяют AES-XTS . Режим использует два ключа: первый шифрует данные, второй создаёт изменяемое значение для каждого сектора и блока. Номер сектора участвует в расчёте, поэтому одинаковые фрагменты на разных участках диска получают разный шифротекст.
<pre><code class="language-text">tweak = AES(key2, sector_number) C0 = AES(key1, P0 XOR tweak0) XOR tweak0 C1 = AES(key1, P1 XOR tweak1) XOR tweak1 C2 = AES(key1, P2 XOR tweak2) XOR tweak2</code></pre> XTS устраняет основную проблему повторного потока, но требует больше вычислений. Phantomdrive записывает данные с AES-CTR со скоростью около 9 МБ/с и читает со скоростью 20 МБ/с. При AES-XTS скорость падает примерно до 6 МБ/с при записи и 10 МБ/с при чтении.
Разработчик выбрал CTR как компромисс между скоростью и своей моделью угроз, однако прямо предупреждает об ограничениях. Пользователь, которому важнее устойчивость к повторному снятию образа диска, может переключиться на XTS или дополнительно зашифровать носитель программными средствами.
Прошивка опирается на две открытые библиотеки.
<pre><code class="language-text">https://github.com/hydrausb3/wch-ch56x-lib https://github.com/hydrausb3/wch-ch56x-isp</code></pre> Контроллер не разбирает файловую систему и не знает, где находится конкретный текстовый файл. При обмене с компьютером он получает команды USB Mass Storage <code>WRITE10</code> и <code>READ10</code>, а затем переводит их в команды карты SD. Поэтому пароль ищется непосредственно в необработанном потоке записываемых данных.
<pre><code class="language-c">void phantomdrive_snoop_write(uint8_t *buf, uint32_t len) {const char *prefix = "password:";const size_t prefix_len = 9;uint32_t i; for (i = 0; i + prefix_len <= len; i++) { if (buf != 'p') continue; if (memcmp(buf + i, prefix, prefix_len) != 0) continue; size_t pw_start = i + prefix_len; size_t pw_end = pw_start; while (pw_end < len && (pw_end - pw_start) < sizeof(pending_pw) && buf[pw_end] != '\n' && buf[pw_end] != '\r' && buf[pw_end] != '\0') { pw_end++; } size_t pw_len = pw_end - pw_start; memcpy(pending_pw, buf + pw_start, pw_len); pending_pw_len = pw_len; memset(buf + i, 0, pw_end - i); return;} }</code></pre> Функция просматривает каждую запись в открытый раздел и ищет последовательность <code>password:</code>. Символы после префикса копируются в оперативную память до перевода строки, нулевого байта или достижения установленного лимита. Затем исходный участок буфера заполняется нулями, поэтому пароль не попадает на карту SD.
Подход создаёт риск случайного срабатывания. Если пользователь хранит на открытой части большие объёмы данных, а внутри одного из файлов встретится последовательность <code>password:</code>, контроллер может принять следующий текст за команду разблокировки. Прошивка не проверяет имя файла и его расположение, поскольку работает ниже уровня файловой системы.
Phantomdrive остаётся экспериментальным устройством, а не сертифицированным криптографическим носителем. Конечно, это флешка не защищает от слабого пароля, компрометации компьютера, аппаратного анализа контроллера и принуждения, при котором проверяющая сторона уже знает о существовании скрытого раздела. Выбранный режим AES-CTR также требует учитывать риск повторного копирования шифротекста.
Главная особенность накопителя заключается не в новом алгоритме шифрования, а в сочетании аппаратно скрытой ёмкости, локальной обработки пароля и полностью открытой конструкции. Любой специалист может проверить прошивку, заменить CTR на XTS, изменить число раундов функции выработки ключа или переделать механизм разблокировки под собственную модель угроз.
<div class="articl-text-cover" style="position:relative;width:100%;max-width:800px;margin-left:auto;margin-right:auto;aspect-ratio:1200/676;margin-bottom:2rem;overflow:hidden">
<div itemprop="articleBody">Обычное шифрование защищает файлы, пока владелец не раскрывает пароль. Однако в некоторых странах человека могут заставить разблокировать носитель, а сам факт наличия зашифрованного раздела способен вызвать дополнительные вопросы. Открытый проект Phantomdrive предлагает другой подход: при подключении флешка показывает компьютеру обычный накопитель объёмом 8 ГБ, а оставшаяся память не определяется операционной системой.
Скрытый раздел открывается без отдельной программы. Пользователь редактирует текстовый файл на доступной части накопителя и записывает строку <code>password
<pre><code class="language-text">password
Проект полностью открыт. В свободном доступе опубликованы принципиальная схема, печатная плата, прошивка и конструкция корпуса. Для проектирования использовались открытые инструменты, поэтому устройство можно изучить, изменить или собрать самостоятельно.
Основой накопителя служит микроконтроллер CH569. Чип выпускает та же компания, которая производит преобразователь CH340, хорошо известный по недорогим платам, совместимым с Arduino. В Phantomdrive задействованы контроллер USB 3.0, интерфейс SD/eMMC и аппаратный блок AES. Внутри CH569 также есть модуль китайского алгоритма SM4, но в проекте он не используется.
Память хранится на карте SD. Разработчик планировал применить eMMC, однако рост спроса со стороны производителей оборудования для искусственного интеллекта поднял цены на подобные микросхемы. Версия с eMMC должна появиться позже, когда стоимость памяти снизится.
Карта SD остаётся физически доступной при разборке корпуса, но вся скрытая область зашифрована. Половинки корпуса склеены эпоксидной смолой, поэтому вскрытие, скорее всего, повредит накопитель. Подобная защита не заменяет специализированный корпус с датчиками вмешательства, но усложняет незаметное извлечение карты.
Электронная часть состоит из CH569, разъёма USB, двух понижающих преобразователей напряжения, карты SD, кнопки обновления прошивки и вспомогательных компонентов. На плате также предусмотрены контактные площадки UART, которые используются во время разработки и отладки.
После публикации проекта на GitHub появились автоматически составленные отчёты о возможных уязвимостях. Часть замечаний описывала уже исправленные ошибки, часть содержала неверные выводы, а некоторые реальные ограничения подавались без учёта модели угроз. Наиболее содержательная дискуссия коснулась режима AES-XTS, который обычно применяют для шифрования дисков.
Работу криптографической части разработчик проверял функциональными тестами. Прошивка шифровала известные данные, после чего результат сравнивался с реализацией AES в OpenSSL. Совпадение подтверждало, что аппаратный блок и программная логика выполняют преобразования одинаково.
Пароль нельзя напрямую использовать как ключ AES-256. Алгоритму требуется ключ длиной 32 байта, однако простое дополнение пароля нулями почти не усложняет перебор. Слабую комбинацию вроде <code>password1234</code> современное оборудование может проверить за короткое время.
<pre><code class="language-c">uint8_t key[32] = {0}; memcpy(key, password, password_length);</code></pre> Дополнительную проблему создают заранее рассчитанные таблицы. Злоумышленник может один раз подготовить ключи для распространённых паролей, а затем быстро сравнивать их с данными разных устройств. Phantomdrive добавляет к паролю уникальную соль, связанную с конкретным экземпляром флешки. Поэтому таблицу приходится рассчитывать заново для каждого накопителя.
Соль можно узнать в Linux через серийный номер USB-устройства:
<pre><code class="language-bash">udevadm info --query=property --name=/dev/sdc | grep ID_SERIAL_SHORT ID_SERIAL_SHORT=Phantomdrive:34FC1FA7145467F7</code></pre> В приведённом примере солью служит последовательность <code>34FC1FA7145467F7</code>. Значение необходимо сохранить отдельно: без него восстановить данные после поломки контроллера будет сложнее. Переставить карту SD в другой экземпляр Phantomdrive тоже не получится, поскольку новый контроллер использует другую соль.
Название устройства, идентификаторы производителя и продукта USB можно изменить в прошивке. Такая настройка позволяет замаскировать Phantomdrive под другой накопитель, однако неправильные значения способны вызвать проблемы с совместимостью или затруднить восстановление данных.
Функция выработки ключа выполняет 100 тысяч раундов SHA-256 . Повторное хеширование замедляет каждую попытку подбора пароля. Сам накопитель открывает скрытый раздел примерно за три секунды, а атакующий вынужден тратить сопоставимое количество вычислений на каждую проверяемую комбинацию.
<pre><code class="language-c">for (uint32_t i = 0; i < 100000; i++) {sha256(password_and_salt, input_length, key);memcpy(password_and_salt, key, sizeof(key)); }</code></pre> Алгоритмы Argon2 или scrypt могли бы сильнее осложнить перебор, поскольку требуют большого объёма памяти. Возможности CH569 ограничены, поэтому подобные функции не укладываются в доступные ресурсы и приемлемое время разблокировки. Владелец может увеличить число раундов SHA-256, но тогда скрытый раздел будет открываться дольше.
Разработчик также допускает двойное шифрование средствами операционной системы. В другом сценарии аппаратное шифрование можно отключить и использовать Phantomdrive только для сокрытия раздела, поручив защиту данных VeraCrypt, LUKS или BitLocker.
AES обрабатывает блоки по 16 байт, поэтому для диска нужен режим, который связывает множество блоков в единый поток. Самый простой вариант AES-ECB шифрует каждый фрагмент отдельно. Одинаковые открытые блоки при этом превращаются в одинаковый шифротекст, из-за чего структура исходных данных частично сохраняется.
Режим ECB также не защищает порядок и целостность блоков. Злоумышленник может удалить или переставить участки зашифрованных данных, а после расшифровки изменения предсказуемо повлияют на содержимое. Для дискового накопителя подобная схема непригодна.
Phantomdrive поддерживает AES-CTR. Режим шифрует последовательность значений счётчика, а затем объединяет результат с открытым текстом операцией XOR. Упрощённая логика выглядит следующим образом:
<pre><code class="language-c">uint64_t i = 0; while (i < len) {uint8_t stream_byte = aes_encrypt_counter(i);ciphertext = plaintext ^ stream_byte;i++; }</code></pre> Главный риск AES-CTR связан с повторным использованием счётчика. Злоумышленник может скопировать шифротекст, вернуть устройство владельцу, дождаться записи новых данных и снова получить содержимое диска. Если одна из двух версий частично известна или угадывается, повторившийся поток позволяет восстановить информацию из другой.
Для дисков обычно применяют AES-XTS . Режим использует два ключа: первый шифрует данные, второй создаёт изменяемое значение для каждого сектора и блока. Номер сектора участвует в расчёте, поэтому одинаковые фрагменты на разных участках диска получают разный шифротекст.
<pre><code class="language-text">tweak = AES(key2, sector_number) C0 = AES(key1, P0 XOR tweak0) XOR tweak0 C1 = AES(key1, P1 XOR tweak1) XOR tweak1 C2 = AES(key1, P2 XOR tweak2) XOR tweak2</code></pre> XTS устраняет основную проблему повторного потока, но требует больше вычислений. Phantomdrive записывает данные с AES-CTR со скоростью около 9 МБ/с и читает со скоростью 20 МБ/с. При AES-XTS скорость падает примерно до 6 МБ/с при записи и 10 МБ/с при чтении.
Разработчик выбрал CTR как компромисс между скоростью и своей моделью угроз, однако прямо предупреждает об ограничениях. Пользователь, которому важнее устойчивость к повторному снятию образа диска, может переключиться на XTS или дополнительно зашифровать носитель программными средствами.
Прошивка опирается на две открытые библиотеки.
<pre><code class="language-text">https://github.com/hydrausb3/wch-ch56x-lib https://github.com/hydrausb3/wch-ch56x-isp</code></pre> Контроллер не разбирает файловую систему и не знает, где находится конкретный текстовый файл. При обмене с компьютером он получает команды USB Mass Storage <code>WRITE10</code> и <code>READ10</code>, а затем переводит их в команды карты SD. Поэтому пароль ищется непосредственно в необработанном потоке записываемых данных.
<pre><code class="language-c">void phantomdrive_snoop_write(uint8_t *buf, uint32_t len) {const char *prefix = "password:";const size_t prefix_len = 9;uint32_t i; for (i = 0; i + prefix_len <= len; i++) { if (buf != 'p') continue; if (memcmp(buf + i, prefix, prefix_len) != 0) continue; size_t pw_start = i + prefix_len; size_t pw_end = pw_start; while (pw_end < len && (pw_end - pw_start) < sizeof(pending_pw) && buf[pw_end] != '\n' && buf[pw_end] != '\r' && buf[pw_end] != '\0') { pw_end++; } size_t pw_len = pw_end - pw_start; memcpy(pending_pw, buf + pw_start, pw_len); pending_pw_len = pw_len; memset(buf + i, 0, pw_end - i); return;} }</code></pre> Функция просматривает каждую запись в открытый раздел и ищет последовательность <code>password:</code>. Символы после префикса копируются в оперативную память до перевода строки, нулевого байта или достижения установленного лимита. Затем исходный участок буфера заполняется нулями, поэтому пароль не попадает на карту SD.
Подход создаёт риск случайного срабатывания. Если пользователь хранит на открытой части большие объёмы данных, а внутри одного из файлов встретится последовательность <code>password:</code>, контроллер может принять следующий текст за команду разблокировки. Прошивка не проверяет имя файла и его расположение, поскольку работает ниже уровня файловой системы.
Phantomdrive остаётся экспериментальным устройством, а не сертифицированным криптографическим носителем. Конечно, это флешка не защищает от слабого пароля, компрометации компьютера, аппаратного анализа контроллера и принуждения, при котором проверяющая сторона уже знает о существовании скрытого раздела. Выбранный режим AES-CTR также требует учитывать риск повторного копирования шифротекста.
Главная особенность накопителя заключается не в новом алгоритме шифрования, а в сочетании аппаратно скрытой ёмкости, локальной обработки пароля и полностью открытой конструкции. Любой специалист может проверить прошивку, заменить CTR на XTS, изменить число раундов функции выработки ключа или переделать механизм разблокировки под собственную модель угроз.
- Источник новости
- www.securitylab.ru