Электронная подпись в доверенной среде на баз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. Подпись платежек в личном кабинете



    Метки:
    «Актив» 73,04
    Компания
    Поделиться публикацией
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Похожие публикации

    Вакансии компании «Актив»

    Комментарии 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
                      Всегда считал, что 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
            А какой подход к рискам загрузки доверенной среды внутрь виртуальной машины? Атаки типа 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
                Ага, действует «презумпция неуязвимости» :)

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

              Самое читаемое