23 марта 2015 в 17:41

Электронная подпись в доверенной среде на базe загрузочной Ubuntu 14.04 LTS и Рутокен ЭЦП Flash

Процедура наложения электронной подписи, призванная обеспечить подтверждение целостности подписанного документа и его авторства, сама по себе может быть небезопасной.
Основные атаки на ЭП — это кража ключа и подмена подписываемой информации, а также несанкционированный доступ к средству ЭП (например, USB-токену) посредством кражи его PIN-кода.

Реализуются данные атаки различными способами и на различных уровнях. На уровне ОС это внедрение вредоносного ПО (вирусы, программы-шпионы, руткиты и т.п.), которое способно похищать ключи, PIN-коды и делать подмену документов посредством чтения и/или подмены данных в памяти системного процесса, используя различные механизмы «хака», заложенные в ОС.
Если мы говорим о подписи в браузере, то к данным атакам добавляется возможность проведения атаки man-in-the-middle, направленной на модификацию подписываемых данных на web-странице или на кражу PIN-кода или на перехват secure token для возможности злоумышленнику прикинуться абонентом системы. Кроме того, на сайтах возможна атака типа CSS, обусловленная безалаберностью разработчиков сайта.

Очевидно, что максимально защитить клиента при проведении процедуры ЭП возможно лишь комплексом мер.
К данным мерам можно отнести:
  • применение для электронной подписи криптографических смарт-карт/USB-токенов с неизвлекаемыми ключами
  • использование правильной реализации протокола TLS на сайте
  • правильное конфигурирование этой правильной реализации протокола TLS
  • использование специальных аппаратных средств для визуализации подписываемых данных перед наложением подписи (trustscreen)
  • корректная реализация браузерных плагинов и расширений, которые обеспечивают ЭП в браузере
  • регламентирование процедуры подписи для пользователя с учетом встроенных в браузер механизмов безопасности
    • проверка сертификата TLS-сервера пользователем перед ЭП
    • запуск браузерных плагинов и расширений только на доверенном сайте (сейчас правильно настроенные браузеры предупреждают пользователя о запуске)
    • ввод PIN-кода токена по запросу только доверенного сайта
    • реагирование на предупреждение браузера о получении «смешанного» контента — часть по HTTPS, часть по HTTP
  • защита ОС от вредоносного ПО (создание доверенной среды)

Некоторое время назад наша компания выпустила новый Рутокен ЭЦП Flash. Это устройство «два в одном» — криптографический токен и управляемая FLASH-память в едином корпусе. При этом контроллер позволяет настраивать FLASH-память таким образом, что атрибуты настройки нельзя изменить без знания PIN-кода к устройству.

В данной статье мы сделаем кастомную Ubuntu 14.04 LTS, в которую «упакуем» смарткарточные драйвера и Рутокен Плагин. Эту ОС запишем на FLASH-память Рутокен ЭЦП Flash (USB-live) и специальными средствами сделаем ее read-only, так, что без знания PIN-кода злоумышленник не сможет снять этот атрибут.

Таким образом, получим загрузочное устройство, при загрузке с которого пользователь сразу получит возможность подписи документов в браузере на неизвлекаемых ключах в доверенной среде, целостность которой гарантируется управляющим контроллером USB-токена.


Модификация образа Ubuntu


В качестве станка для кастомизации Ubuntu у меня был тоже Ubuntu.

Подготовка:

sudo su
apt-get install squashfs-tools genisoimage


Скачиваем ISO-образ Ubuntu 14.04 и складируем его куда надо:
mkdir ~/livecdtmp
mv ubuntu-14.04.1-desktop-i386.iso ~/livecdtmp
cd ~/livecdtmp


Монтируем ISO-образ:
sudo su
mkdir mnt
mount -o loop ubuntu-14.04.1-desktop-i386.iso mnt


Делаем экстракт образа:
sudo su
mkdir extract-cd
rsync --exclude=/casper/filesystem.squashfs -a mnt/ extract-cd


Ну и так далее:
sudo su
unsquashfs mnt/casper/filesystem.squashfs
mv squashfs-root editsudo su
cp /etc/resolv.conf edit/etc/
cp /etc/hosts edit/etc/
mount --bind /dev/ edit/dev
chroot edit
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devpts none /dev/pts
export HOME=/root
export LC_ALL=C
dbus-uuidgen > /var/lib/dbus/machine-id
dpkg-divert --local --rename --add /sbin/initctl
ln -s /bin/true /sbin/initctl


Собственно кастомизация — установка смарткарточного драйвера и плагина:
pt-get install libccid libpcsclite1 pcscd
mkdir /home/ubuntu/.mozilla
mkdir /home/ubuntu/.mozilla/plugins
chmod 776 /home/ubuntu/.mozilla
chmod 776 /home/ubuntu/.mozilla/plugins
cp npCryptoPlugin.so /home/ubuntu/.mozilla/plugins
cp librtpkcs11ecp.so /home/ubuntu/.mozilla/plugins


И технические работы по созданию нового ISO:
apt-get clean
rm /var/lib/dbus/machine-id
rm /sbin/initctl
dpkg-divert --rename --remove /sbin/initctl
umount /proc || umount -lf /proc
umount /sys
umount /dev/pts
exit
sudo su
umount edit/dev
sudo su
chmod +w extract-cd/casper/filesystem.manifest
chroot edit dpkg-query -W --showformat='${Package} ${Version}\n' > extract-cd/casper/filesystem.manifest
cp extract-cd/casper/filesystem.manifest extract-cd/casper/filesystem.manifest-desktop
sed -i '/ubiquity/d' extract-cd/casper/filesystem.manifest-desktop
sed -i '/casper/d' extract-cd/casper/filesystem.manifest-desktop
rm extract-cd/casper/filesystem.squashfs
mksquashfs edit extract-cd/casper/filesystem.squashfs -comp xz -e edit/boot
printf $(sudo du -sx --block-size=1 edit | cut -f1) > extract-cd/casper/filesystem.size
nano extract-cd/README.diskdefines
cd extract-cd
rm md5sum.txt
find -type f -print0 | sudo xargs -0 md5sum | grep -v isolinux/boot.cat | sudo tee md5sum.txt
mkisofs -D -r -V "$IMAGE_NAME" -cache-inodes -J -l -b isolinux/isolinux.bin -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -o ../ubuntu-14.04.1-desktop-i386-rutoken.iso .


Ubuntu-14.04.1-desktop-i386-rutoken.iso — это наш загрузочный кастомизированный образ (с установлеными смарткарточными драйверами и Рутокен Плагин), который готов к записи на Рутокен ЭЦП Flash.

Создание загрузочного устройства



Первым делом отформатируем Рутокен ЭЦП FLASH специальной утилитой, выставив памяти атрибут read-write (под виндой):
rtadmin.exe -F 1 30000 u rw -o 87654321 -z rtPKCS11ECP.dll


Затем запишем на него ISO, используя UNETBootin (под убунтой):


В качестве размера для preserve file установим 0. Тогда загрузочная Ubuntu будет хранить все изменения в RAM-памяти, а не на FLASH.
После записи образа установим специальными средствами атрибут read-only FLASH-памяти устройства:
rtadmin.exe -C 1 ro p -c 12345678 -z rtPKCS11ECP.dll


Теперь никто без знания PIN-кода устройства не сможет модифицировать записанный на FLASH-памяти образ Ubuntu.

Что получилось



Ниже показан процесс загрузки с Рутокен ЭЦП Flash и подпись документов в браузере в доверенной среде:

1. Boot-меню в bios



2. Выбор нужного пункта в меню загрузчика



3. Ubuntu загрузилась, запускаем браузер, заходим в демо-систему. Браузер спрашивает у пользователя позволения запустить плагин на web-странице



4. Разрешаем плагину «Rutoken» загрузиться — нажимаем «Allow» в правом верхнем углу браузера



5. F5



6. Авторизация в системе по сертификату, который хранится на Рутокен ЭЦП Flash



Вводим PIN-код:



6. Подпись платежек в личном кабинете



Автор: @cryptoman
«Актив»
рейтинг 122,46
Похожие публикации

Комментарии (44)

  • 0
    при загрузке с которого пользователь сразу получит возможность подписи документов в браузере на неизвлекаемых ключах в доверенной среде


    А что защищает «доверенную среду» от автоматического исполнения недоверенных программ с НЖМД?
    • 0
      Правильная конфигурация ОС
      • +1
        Я не вижу каких-то модификаций по этой части в инструкции. Что конкретно нужно сделать, чтобы отключить возможность автоматического запуска программ на НЖМД в процессе загрузки Ubuntu?
        • 0
          При загрузке Ubuntu жесткий диск не подмонтирован. Это решение проблемы?
          • 0
            После завершения загрузки файловые системы на НЖМД действительно не подключены. Но это не значит, что они не были подключены и отключены ранее – в процессе загрузки. Вы не задавали себе вопрос, как Ubuntu определяет, с какого носителя нужно брать SquashFS? Ведь GRUB и syslinux не передают ядру адрес загрузочного устройства (такое происходит только при загрузке установленного дистрибутива, но никак не в случае с Live CD/USB), а значит этот адрес нужно получить как-то иначе.

            И не получится сделать «доверенную среду» путем простой модификации Ubuntu, без существенного изменения процесса ее загрузки.
            • 0
              И ядро в процессе поиска SquashFS подключает все доступные устройства и запускает с них недоверенные программы?
              • 0
                И ядро в процессе поиска SquashFS подключает все доступные устройства


                Да (но не ядро, а «early userspace»).

                и запускает с них недоверенные программы


                Да, но нужно придать им нужную форму. Поскольку Ubuntu поддерживает загрузку с файловых систем FAT и NTFS, то это вполне может сделать и «вирус» в «винде».
                • 0
                  Да, но нужно придать им требуемую форму


                  Fixed.
                • 0
                  Вы не могли бы привести рабочий пример когда загружающийся с USB Линукс самопроизвольно запускает программы с винта?

                  Просто я тоже был свято уверен что никакой самодеятельности здесь быть не может.
                  • 0
                    Для grml 2009.10 в режиме Live CD:
                    1. образ для записи на НЖМД – http://digitalcorpora.org/corp/aor/drives/2009-aor-test_grml200910.iso (это PoC);
                    2. скриншот для этого образа – http://forensicswiki.org/images/4/4c/Grml.png.

                    Следует отметить, что в live-initramfs (Debian) уже давно (с 2009 года) приоритет при поиске корневой файловой системы отдается съемным накопителям (а в Tails, если мне не изменяет память, загрузка вообще возможна лишь со съемных накопителей, что есть выстрел в ногу многим пользователям, ведь существуют накопители USB Flash и внешние НЖМД, которые udev не идентифицирует как съемные, а значит запуск Tails с них невозможен), в то же время в casper (Ubuntu) ничего особо не менялось в данном плане.
                    • 0
                      Использование Tails — это разумный подход с точки зрения безопасности.
                      Но нужно смотреть, что у него с usability.

                      В целом, данная статья — это демонстрация подхода на базе обновленной аппаратной платформы Рутокен ЭЦП Flash с применением ПО Рутокен. Выбор дистрибутива и его уровень его кастомизации — вопрос дискуссионный.
                      • 0
                        Использование Tails — это разумный подход с точки зрения безопасности.


                        Все-таки Tails, если в его последних релизах что-то существенно не меняли, не защитит от подмены корневой файловой системы с применением USB-накопителя (например, когда работник не отключает «плохую флешку» перед загрузкой в «доверенную среду»).

                        Выбор дистрибутива и его уровень его кастомизации — вопрос дискуссионный.


                        Поэтому нужно четко представлять возможные угрозы. Например, если заменить syslinux на GRUB, то появляется возможность подменить ядро операционной системы на то, которое разместили на другом накопителе. А применение спецификации мультизагрузки позволяет подменить и конфигурационный файл GRUB.
                        • 0
                          Все-таки Tails, если в его последних релизах что-то существенно не меняли, не защитит от подмены корневой файловой системы с применением USB-накопителя (например, когда работник не отключает «плохую флешку» перед загрузкой в «доверенную среду»).

                          Опять же вопрос.
                          Почему Ubuntu начнет использовать файловую систему именно с «плохой» флешки?
                          • 0
                            Ответил ниже.
                • 0
                  Всегда считал, что initramfs запускает первую программу с «финальной» файловой системы, то бишь в данном хранившуюся на флеше
                  • 0
                    В Ubuntu, если не включать постоянное хранилище данных и не использовать диск с обновлениями драйверов, можно лишь подменить корневую файловую систему на свою (а из нее уже запустить свою программу и переключиться в настоящую корневую файловую систему для продолжения загрузки). Но, например, в KNOPPIX можно подсунуть собственные модули ядра (в ряде случаев они будут автоматически загружены в память) и обновления операционной системы (последние будут без какого-либо участия пользователя распакованы в корень с заменой существующих файлов).
                    • 0
                      Вредоносный софт модифицирует файловую систему винды, и она «прикинется» корневой для Ubuntu?
                      Или злоумышленник подключит заранее настроенный HDD, который «обманет» Ubuntu, и она подмонтирует с него корневую файловую систему и запустит с нее приложение?
                      Такая модель угроз?

                      • 0
                        Да.
                        • 0
                          А откуда уверенность, что Ubuntu из, например, двух предложенных корневых систем выберет именно ложную?

                          Она же по понимает, что в случае наличия корневой системы на HDD и на bootable флешке (что является штатной ситуацией) использовать нужно именно файловую систему с флешки.
                          • 0
                            А откуда уверенность, что Ubuntu из, например, двух предложенных корневых систем выберет именно ложную?


                            Перебор файловых систем происходит в алфавитном порядке следования имен их блочных устройств: /dev/sda1 будет протестирован до /dev/sdb1. НЖМД определяется системой раньше, а значит его разделы будут следовать первыми.

                            Она же по понимает, что в случае наличия корневой системы на HDD и на bootable флешке (что является штатной ситуацией) использовать нужно именно файловую систему с флешки.


                            Процесс загрузки унифицирован и для CD, и для USB Flash, и для USB HDD, т. е. за все отвечает один и тот же код, который «не знает» про конкретный способ загрузки в данной ситуации, а значит не может игнорировать какие-то накопители. Более того, этот же код должен работать и в ситуации, когда загрузочное устройство заведомо не содержит корневую файловую систему (это редкая, но штатная ситуация для Live CD/USB).
                            • 0
                              Согласно вашей логике в случае наличия у меня на HDD корневого раздела файловой системы Ubuntu всегда будет использовать именно его файловую систему для работы.

                              Вы возьметесь продемонстировать атаку по подмене файловой системы?
                              • 0
                                В ней нет SquashFS (или иного образа с корневой файловой системой, который ищет код из initramfs в Live CD/USB), а значит Ubuntu проверит и пропустит данную файловую систему. Безоговорочный (без поиска характерных файлов и директорий) выбор файловой системы в качестве корневой происходит в Ubuntu лишь при одновременном соблюдении двух условий:
                                — на накопителе нет таблицы разделов, файловая система записана прямо в первый и последующий секторы;
                                — накопитель не идентифицируется программным обеспечением udev как имеющий дисковый тип (т. е. накопитель должен быть каким-то экзотическим).
                              • 0
                                Вы возьметесь продемонстировать атаку по подмене файловой системы?


                                Я ее уже демонстрировал, на одной конференции в том числе. Если очень хотите, могу показать еще раз, на примере с Ubuntu 14.04.
                                • 0
                                  Было бы неплохо.
                                  • 0
                                    Подготовка SquashFS (делать прямо из Live CD/USB):

                                    mkdir squashfs
                                    cd squashfs/
                                    mkdir sbin bin dev etc usr tmp var
                                    cp /bin/busybox bin/
                                    echo -e '#!/bin/busybox sh\nwhile true; do\necho pwned\ndone' > sbin/init
                                    chmod +x sbin/init
                                    sudo apt-get install squashfs-tools
                                    mksquashfs . ../a.squashfs
                                    cd ..
                                    


                                    Подготовка раздела и файловой системы:

                                    sudo fdisk /dev/sda # тут нужно создать один раздел
                                    sudo mkfs.ntfs -f /dev/sda1
                                    


                                    Запись необходимых данных в файловую систему:

                                    sudo mount /dev/sda1 /mnt/
                                    cp -R /cdrom/.disk /mnt/
                                    mkdir /mnt/casper
                                    mv a.squashfs /mnt/casper/
                                    sudo umount /mnt/
                                    


                                    Ребут и запуск того же дистрибутива с параметром «nosplash».
                                    • 0
                                      Кстати говоря, если интересно, то посмотрите, как в ALT Linux Rescue сделана защита от подмены корневой файловой системы.
                                      • 0
                                        Спасибо большое за предоставленную информацию. Я ее постараюсь обработать в ближайшее время.
                                        • 0
                                          Воспроизвели?
  • 0
    <мимо>
  • 0
    А какой подход к рискам загрузки доверенной среды внутрь виртуальной машины? Атаки типа Blue Pill.

    Полагаю, их можно избежать, например, каждый раз используя загрузку через Boot menu. Но вдруг кто-то bios или UEFI пропатчит? :)
    • 0
      Ну как бы да, откуда здесь возьмется гипервизор?
      • 0
        Например злоумышленник установит загрузчик на встроенный накопитель(HDD, SD Card, etc). И будет грузить доверенную среду в гипервизор. Или это уже не рассматривается в качестве риска?
        • 0
          С чего бы вдруг Ubuntu станет грузиться в гипервизор? Загрузчик у нас тоже доверенный и хранится на флеше.
          • 0
            Атака не на ваш девайс, а на компьютер, в котором его загружают. Например: настроили загрузку с USB Flash по умолчанию. Пользователь вставляет флешку и работает. Позже, злоумышленник, которому получил физический доступ к компьютеру, перенастраивает на загрузку с альтернативного HDD, в который установил свой загрузчик и гипервизор. Пользователь не замечает далее загрузку доверенной среды.
            • 0
              Ну про этот случай вы сами верно написали выше. Либо обязать пользователя каждый раз загружаться через boot-меню, либо таки защищать BIOS от несанкционированной модификации.

              Насколько я знаю, на рынке есть решения, которые позволяют использовать тот же Рутокен ЭЦП для аутентификации в UEFI.

              Сначала аутентифицируетесь в UEFI с помощью Рутокен ЭЦП Flash, потом загружаетесь с него же, потом им же аутентифицируетесь на web-сайте и им же подписываете документы.

              Я думаю, что подобный комплексный подход осложнит жизнь злоумышленнику.
  • 0
    А для рутокена существет-ли ubuntu репозитарий для более удобной загрузки броузерного плагина?
    Просто руками что-то куда-то копировать… при этом головой отслеживать зависимости
    А если-бы репозитарии с контрольными суммами, подключаемые через ppa
    • 0
      Пока нет репозитария.
      • 0
        Печаль :-(

        Но это скорее беда всего отечественного крипто-софта — ни каких исходников, никакого удобства использования не-windows пользователей.
        • 0
          Я бы сказал, что в данном контексте Рутокен Плагин — меньшее из зол :)
          • 0
            Просто сталкивался с токенами от Гос.Услуг — там тоже заявлено что работать будет из под linux-а, но .deb пакет собран настолько криво что пользоваться не возможно. А исходников что-бы собрать прямо и под i386 и под amd64 — нету :-(

            Касаемо Рутокена — .deb пакет который частично ставится в /opt и отсутствие зависимостей навивает тоску.
  • 0
    Софт внутри токена считается идеальным, не содержащим ошибок и уязвимостей?
    • 0
      Ага, действует «презумпция неуязвимости» :)

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка