20.10.2017

Создание USB-песочницы на базе компьютера USB Armory

image

USB Armory представляет собой небольшой компьютер с процессором ARM A8 800 МГц и оперативной памятью 512 Мб на базе USB-корпуса.

Автор: Pedro Vilaca

Некоторое время назад мой приятель получил загадочную USB-ручку с запиской о том, что внутри находится опасный вредонос. Мой друг оставил это USB-устройство нетронутым и, естественно, мне стало очень любопытно, что же там внутри. Поскольку вряд ли кто-либо будет подключать неизвестное USB-устройство к компьютеру (хотя, по сути, любое устройство, которое мы покупаем, является неизвестным, но здесь совсем другая история), и я не хотел идти на поводу своего любопытства и ставить сомнительные эксперименты, то решил соорудить песочницу на базе USB Armory для анализа содержимого USB-ручки.


Рисунок 1: Песочница для анализа USB-устройств на базе компьютера USB Armory

USB Armory представляет собой небольшой компьютер с процессором ARM A8 800 МГц и оперативной памятью 512 Мб на базе USB-корпуса. Это устройство достаточно функционально для реализации различных интересных проектов. Одна из наиболее интересных функций – безопасная загрузка, которая называется High Assurance Boot (загрузка в высоким уровнем защиты) и позволяет защитить целостность нашей USB-песочницы. Кстати, недавно появилась заметка о безопасности, касаемо этой функции (хотя во время сборки я не предполагал, что в загрузчике есть какие-либо уязвимости). Песочница имеет приемлемый уровень аппаратной целостности, поскольку мы можем добавить свои PKI-ключи в безопасный загрузчик и поменять карту microSD на ту, которая будет использоваться во время анализа. У вредоноса мало способов нарушить целостность аппаратной части и сделать устройство непригодным для использования с точки зрения аналитика (имеется ввиду, постоянный руткит, который сможет постоянно вредить нашему анализу). USB Armory можно заказать на сайте Inverse Path. Кроме того, вам потребуется хост-адаптер, без которого мы не сможем реализовать этот проект.


Рисунок 2: Хост-адаптер

Компьютер может работать в двух режимах: host и non-host. Режим non-host используется по умолчанию и позволяет подсоединить устройство к USB-порту. После подключения песочница доступна по определенному IP-адресу (эта функция работает на базе эмуляции CDC Ethernet). По сути, в этом режиме один компьютер подключен к другому компьютеру. Подобная конфигурация используется для хранения конфиденциальных данных, в качестве аппаратного модуля безопасности (HSM), секретного мессенджера, TOR-роутера, менеджера паролей, безопасного кошелька Bitcoin и везде, где важная аппаратная целостность и надежность. В этой статье приведены другие примеры применений.

Дополнительным преимуществом является небольшой размер, и вы всегда можете носить устройство с собой.

В нашем проекте будет использоваться режим host, когда USB-песочница работает как отдельный компьютер, к которому, в случае наличия Linux-драйверов, можно подключить другие устройства: клавиатуру, монитор, электронный ключ и т. д.

В качестве одного из первых проектов я делал WiFi хот-спот / фаервол, используемый в путешествиях. Идея заключалась в том, что один WiFi-интерфейс подключается к публичной сети, а другой Ethernet- или WiFi-разъем к одному из моих устройств. Таким образом, мы изолируем наше устройство, и в то же время можем использовать публичную сеть. После подключения устройства к аккумулятору получаем собственную точку доступа. Ключевое различие заключается в том, что мы полностью контролируем это точку доступа и хорошо защищены от потенциальных вредоносов и уязвимостей, которым подвержены данные виды устройств (например, ни одна точка доступа не имеет безопасного загрузчика). Кроме того, можно добавить TOR-маршрутизацию и другие полезные функции (например, DNS-туннелинг для обхода сетей в аэропортах и так далее).

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

Этот проект имеет следующие требования:

Аппаратные требования:

  • USB armory.
  • Хост-адаптер для USB armory.
  • Адаптер Serial-USB (полезен для отладки любых проблем, иначе мы будем работать вслепую до тех пор, пока сеть не начнет работать).
  • Хаб USB 2.0/3.0.
  • JUE130 USB 3.0 Gigabit Ethernet Adapter.
  • Одна или несколько карт объемом 4ГБ+ (список совместимых карт).
  • Как минимум один кабель micro-USB (для подключения хост-адаптера к источнику питания).
  • Аккумулятор.

Программные требования:

  • Debian 8.x на отдельном хосте (как вариант - в качестве виртуальной машины).

Общая схема установки выглядит так:

Рисунок 3: Общая схема установки

В этой схеме источник питания используется для запитывания все устройств за исключением USB-хаба с автономным питанием. Использование массивных батарей также допустимо, если вы готовы пожертвовать портативностью всей системы. Хост-адаптер может работать в качестве USB-кондома (когда подключены только провода питания, а информационные каналы заблокированы), и мы можем легко запитать это устройство от обычного USB-порта, если необходимо. В случае присутствия энергоемких устройств (например, больших жестких дисков) может понадобиться дополнительное питание.

USB Armory подключается к одному из концов хост-адаптера, а USB-хаб к другому концу. Остальные USB-устройства подключаются к USB-хабу. Адаптер USB Ethernet можно подключить к сети, куда мы хотим скопировать данные. Чтобы повысить уровень безопасности, можно установить фаервол между сетью с USB armory и сетью, к которой мы хотим получить доступ. Далее блокируем все, кроме протокола SSH (теперь потребуется особо изощренный вредонос, чтобы обойти наш фаервол).

Существует несколько установочных образов, предварительно собранных компанией Inverse Path, и другие Linux-дистрибутивы, которые по умолчанию работают в режиме non-host. Чтобы активировать режим host, ознакомьтесь с этим документом.

Я не использовал заранее собранные образы, поскольку на тот момент в Linux-ядре не поддержки адаптера USB Ethernet, который я купил (хотя драйвера от производителя были доступны). Кроме того, сборка собственного образа позволила мне добавить дополнительные программы. Недавно компания Inverse Path выложила в общий доступ Makefile для образа на базе дистрибутива Debian (теперь не нужно копировать и вставлять команды как раньше).
Я создал форк Armory Sandbox, где добавлены дополнительные пакеты, используемые при анализе, а также конфигурация Linux-ядра, которая содержит все необходимые драйвера (для адаптера USB Ethernet и некоторый файловых систем, например, HFS+). Нам нужна поддержка всех файловых систем, которые могут встретиться на анализируемых USB-устройствах. Если у вас есть особые требования, нужно сгенерировать новый конфигурационный файл ядра и обновить уже существующий. Стандартный конфигурационный файл, используемый при создании песочницы, находится в папке kernel_conf/armorysandbox_linux-4.9.config. Конфигурация ядра обновляется следующим образом:

KBUILD_BUILD_USER=usbarmory KBUILD_BUILD_HOST=usbarmory ARCH=arm CROSS_COMPILE=arm-none-eabi- make menuconfig

Сохраните конфигурацию и скопируйте поверх старой (или обновите старый файл напрямую). Если вы не сделаете так, как показано выше, конфигурационный файл будет собран для хоста (в нашем случае для архитектуры x86), а наш целевой компьютер работает на архитектуре ARM. Вы можете использовать и другие опции при создании конфигурации, если умеете работать с неграфическим режимом.
Перед сборкой образа необходимо установить некоторые программы на хосте, а конкретно – кросс-компилятор для архитектуры ARM и программы, необходимые для создания корневой файловой системы.

sudo apt-get install bc binfmt-support bzip2 gcc gcc-arm-none-eabi git gnupg make parted qemu-user-static wget xz-utils zip sudo debootstrap

Makefile проверяет сигнатуры ядра и загрузчика U-Boot, и мы должны импортировать соответствующие GPG-ключи:

gpg --keyserver hkp://keys.gnupg.net --recv-keys 38DBBDC86092693E
gpg --keyserver hkp://keys.gnupg.net --recv-keys 87F9F635D31D7652

Теперь мы можем компилировать код для архитектуры ARM.
Перед сборкой образа для песочницы клонируем репозитарий на хост-машину:

git clone https://github.com/gdbinit/armorysandbox

В Makefile в переменную SSH_KEY добавляем ssh-ключ.

Вы можете поменять зеркало для Debian, используемое по умолчанию, на то, которое работает быстрее конкретно в вашем случае. Нужно отредактировать переменную DEBIAN_MIRROR. Кроме того, вы можете отредактировать переменную IMAGE_SIZE, которая содержит стандартный размер образа (3500 Мб). Этот размер предполагает, что будет использоваться карта microSD размером 4 Гб. Если размер карты больше, мы можем изменить размер раздела позже (см. FAQ). Если вы не хотите возиться с изменением размера раздела, то можете изменить значение переменной IMAGE_SIZE.

Учетная запись, используемая по умолчанию, - usbarmory (пароль тот же).  Чтобы изменить стандартный пароль, необходимо отредактировать переменную CHANGEME в файле Makefile.

Следующий шаг – сборка образа, которая делается в четыре шага:

    • Сборка файловой системы и пакетов.
    • Сборка ядра.
    • Сборка загрузчика U-Boot.
    • Установка ядра и U-Boot в сырой образ.

Если все шаги завершатся успешно, появится файл armorysandbox-debian_jessie-base_image-YYYYMMDD.raw, который нужно записать на карту microSD:
Проверка целевой системы из терминала при помощи команды dmesg (Linux):

sudo dd if=armorysandbox-debian_jessie-base_image-YYYYMMDD.raw of=/dev/sdX bs=1M conv=fsync

Проверка целевой системы из терминала при помощи команды diskutil list (Mac OS X):

sudo dd if=armorysandbox-debian_jessie-base_image-YYYYMMDD.raw of=/dev/rdiskN bs=1m

Нет необходимости в создании разделов на карте microSD. Эта команда сотрет все, что есть на карте, а в сыром образе, который мы сгенерировали, уже есть информация о всех необходимых разделах. Перед записью несколько раз проверьте целевое устройство.

После того как команда dd завершит запись образа, вы можете вставить карту microSD в USB armory. Далее включите USB armory, подсоедините серийную консоль (схема пинов доступна здесь) и проверьте, что все загрузилось корректно.

IP-адрес, используемый по умолчанию, - 10.1.0.1/24. Шлюз не используется, поскольку мы не хотим, чтобы пакеты этого устройства передавались куда-либо еще. Вы можете добавить IP-псевдоним машине, которая будет использовать сеть для доступа к песочнице.

Mac OS X:

sudo ifconfig en0 alias 10.1.0.2 255.255.255.0

Если эта сеть для вас не подходит, отредактируйте Makefile перед сборкой ядра, или подключитесь через серийную консоль и измените файл /etc/network/interfaces.
Если вы хотите включить безопасную загрузку, ознакомьтесь с документацией. Имейте ввиду, что эта функция на данный момент не настолько ценна из-за упомянутой ранее уязвимости, однако в некоторых случаях (в том числе и в нашем) может оказаться полезной. По крайней мере до тех пор, пока не будут обнародованы полные детали уязвимости. Проблема в основном касается устройств, оставленных без присмотра, и физического проникновения. Однако в отсутствии подробностей мы не можем оценить, смогут ли некоторые виде вредоносов/эксплоитов обойти защитную загрузку, скомпрометировать нашу установку и/или испортить результаты анализа. Однако главная причина отсутствия безопасной загрузки в нашем проекте в том, что эта функция предполагает постоянные и необратимые действия.

Чтобы добавить пакеты нужно отредактировать файл Makefile, а конкретно строку с командой qemu-debootstrap. У меня были некоторые проблемы с пакетами, связанными с python 2.7 minimal. Относительно этой темы есть несколько отчетов об ошибках, и окончательного решения пока нет. Если вам нужны пакеты, у которых есть проблемы и из-за которых возникают ошибки при сборке образа, вы всегда можете выполнить установку позже при помощи apt-get и dpkg(загрузить вручную или подключиться к интернету).

Когда песочница завершит загрузку, вы можете подключиться через серийную консоль или SSH, подключить любое поддерживаемое устройство, проанализировать файловую систему или сделать образ для последующего анализа на другой машине. Если вы придерживаетесь строгих правил безопасности, после завершения анализа вы можете избавиться от карты microSD (или продать на EBay). Более щадящий вариант: просто стереть всю информацию и записать новый образ. В последнем случае возникает вопрос о методах стирания: использование собственных методов стирания или подключение отдельного устройства. При втором методе нужно быть осторожным, поскольку сторонние устройства могут нанести вред карте microSD.

Этот проект не первый, где делается попытка создании изолированной системы для анализа USB-носителей. Например, ранее уже было создано устройство CIRCLean USB Sanitizer на базе системы Raspberry Pi. Проблема этого решения заключается в том, что это устройство пытается автоматически конвертировать недостоверные документы в другой формата и, что более важно для меня, не разделяет носители. То же самое «изолированное» устройство работает с плохим и хорошим USB-носителем. В такой архитектуре безопасное разделение отсутствует априори. Я предпочитаю решения, когда доступ осуществляется через сеть, поскольку мы можем добавить фаервол между изолированным подключаемым устройством. Кроме того, у меня нет желания добавлять автоматическое преобразование информации. Меня интересует только изоляция среды. Конечно, проект CIRCLean можно доработать, чтобы было соответствие вышеупомянутым требованиям. По умолчанию в Raspberry Pi отсутствует безопасная загрузка (хотя при помощи дополнений можно добавить эту функцию). И безопасная загрузка была большим плюсом USB armory по крайней мере до тех пор, пока не были найдены уязвимости (моя первоначальная сборка была сделана перед обнародованием этих брешей).

USB armory – очень интересная платформа и при наличии творческой искры можно реализовать новые и не менее полезные проекты. Рекомендую вам купить и ознакомиться с этим устройством. 

comments powered by Disqus