Рис. 1. Процедура инкрементального сохранения, на которой основаны цифровые подписи PDF. По результатам тестирования, это самый эффективный способ подделки документов

Теоретически, цифровые подписи PDF надёжно удостоверяют автора документа. Но на практике обработку PDF обычно осуществляет проприетарный софт, который не совсем корректно выполняет проверку. Специалисты Рурского университета в Бохуме (Германия) описали несколько вариантов подделки PDF-документов с цифровой подписью, которые срабатывают в большинстве программ просмотра PDF и сервисов онлайновой проверки.

Защита от всех атак обеспечивается только в единственной программе, да и та работает под Linux.

Структура PDF



Рис. 2. Структура документа PDF

Структура документа PDF изображена на рис. 2. При инкрементальном сохранении изменений в PDF-документ добавляются новые объекты в body, а также новая таблица Xref с описанием новых объектов и новый trailer со ссылками на catalog (см. рис. 1). Каталог — это корневой объект PDF-файла, он определяет структуру документа и может дополнительно определять разрешения на доступ.

Каждый объект начинается с номера объекта и номера версии, который увеличивается при каждом обновлении объекта.


Рис. 2. Структура объекта PDF

Создание подписи


Добавление цифровой подписи в PDF-документ полагается на механизм инкрементального сохранения (см. рис. 1). При добавлении подписи во время инкрементального сохранения в документ добавляется следующий контент:

  • новый Catalog с новый параметром Perms, который определяет разрешения на изменение документа; этот параметр ссылается на объект Signature;
  • объект Signature (5 0 obj) с информацией о криптографических алгоритмах, использованных для хэширования и подписи документа, с параметром Contents, который содержит hex-кодированный блоб PKCS7 — в нём хранятся сертификаты и значение подписи, созданной с помощью приватного ключа, который соответствует открытому ключу в сертификате. Параметр ByteRange определяет, какие байты PDF-файла используются на входе функции хэширования для вычисления подписи (пары a, b и c, d), то есть какая часть файла подписывается;
  • новая таблица Xref со ссылкой на новый объект;
  • новый Trailer.

На рис. 3 приведена упрощённая схема PDF-файла с цифровой подписью.


Рис. 3. Упрощённая схема PDF-файла с цифровой подписью

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

Проверку подписи осуществляет приложение, в котором открывается PDF-документ. Оно сразу извлекает подпись из PDF и применяет криптографические операции для проверки её корректности, а затем проверят, можно ли доверять сертификату X.509, ключи которого использовались для подписи.

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

Подделка цифровой подписи


Исследователи описывают три способа подделки с изменением содержимого подписанных PDF-документов.

  • универсальная подделка подписи (Universal Signature Forgery, USF);
  • атака на инкрементальное сохранение (Incremental Saving Attack, ISA);
  • атака на обёртку подписи (Signature Wrapping Attack, SWA).

Универсальная подделка подписи (USF)


Атака USF предусматривает отключение проверки подписи в приложении, которое открывает PDF. При этом пользователю выводится нормальное сообщение об успешной валидации подписи. Это делается с помощью манипуляции объектом Signature в документе: или внутри этого документа создаётся некорректная запись, или из файла удаляется ссылка на сам объект. Хотя программа просмотра PDF не может проверить корректность подписи, но в некоторых случаях программа всё равно показывает её наличие, что удовлетворяет целям злоумышленника.

Исследователи сформулировали 18 векторов атаки USF, восемь из них показаны на рис. 4.


Рис. 4. Восемь вектором атаки для обхода проверки цифровой подписи

Все эти способы работают в том случае, если программа просмотра PDF неправильно осуществляет проверку цифровой подписи.

Атака на инкрементальное сохранение (ISA)


Этот класс атак заключается в переопределении структуры и контента в добавочной секции документа. Идея в том, что подпись вычисляется на основе диапазона байтов, указанного в ByteRange, а добавочная секция не попадает в этот диапазон, как показано на рис. 5.


Рис. 5. При добавлении контента в добавочную секцию не нарушается цифровая подпись

Есть несколько способов, как обойти проверку на изменение документа и блокировать показ соответствующего предупреждения в программе просмотра PDF-документов.

Атака на обёртку подписи (SWA)


Наконец, последний класс атак позволяет обойти проверку подписи без инкрементального сохранения, а путём перемещения подписанной части PDF в конец документа и повторного использования указателя xref в подписанном Trailer на изменённую таблицу Xref. При этом чтобы избежать обработки перемещённой части, она может быть обёрнута в какой-нибудь посторонний объект, например, stream или dictionary.


Рис. 6. Сравнение оригинального и изменённого документов PDF

Эффективность атак


Исследователи проверили эффективность каждого типа атаки в разных программах для просмотра PDF. Не удалось обмануть только Adobe Reader 9 под Linux. Во всех остальных программах проверка подписи обходится одним или несколькими способами.



Не лучше ситуация и с сервисами онлайновой проверки цифровой подписи PDF.

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


  1. Rohan66
    13.03.2019 13:18

    А если документ подписывается сторонней программой (ViPNet CryptoFile)?


    1. amphasis
      13.03.2019 13:38

      Если подписывается целиком файл (все его содержимое), то о данной проблеме и речи нет. Уязвимость именно в механизме встраивания ЭЦП в PDF-файл.


      1. Rohan66
        13.03.2019 13:43

        Спасибо, понял.


      1. paranoya_prod
        13.03.2019 14:24

        Если подписывается весь файл, то эту подпись надо как-то передать и где-то хранить отдельно от файла — такой вариант подвержен подделке.