Как вытащить электронную подпись из пдф файла

Обновлено: 04.07.2024

Исследователи постарались изменить содержимое подписанного PDF-файла так, чтобы подпись оставалась валидной.

Файлы формата PDF используют практически все компании и правительственные учреждения. Нередко для обеспечения аутентичности документа в них применяются цифровые подписи. Группа исследователей из нескольких немецких университетов задалась вопросом, насколько надежно применение цифровой подписи защищает PDF-файлы от изменения его содержимого. Владислав Младенов из Рурского университета в Бохуме поделился находками группы на мероприятии Chaos Communication Congress (36С3).

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

Для проверки исследователи выбрали 22 популярные программы для просмотра PDF, разработанные для разных платформ, и методично скармливали им результаты своих экспериментов.

Структура PDF-файла

Для начала нужно сказать несколько слов о том, как устроен формат PDF. Файл состоит из четырех основных частей: заголовка (Header), где хранится версия PDF; основной части, где размещается контент, который видит пользователь (body); раздела Xref, представляющего собой каталог, в котором перечислены объекты внутри основного раздела и их местонахождение (он служит для корректного отображения контента); и трейлера (trailer) — раздела, с которого программы для чтения PDF начинают обработку документа. В трейлере находятся два важных параметра, сообщающих программе, с какого элемента следует начинать обработку файла, а также показывающих, где в файле начинается раздел Xref.

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

Следующим экспериментом стало удаление двух последних разделов (то есть обновление в основной раздел добавляется, а новые Xref и Trailer — нет). Некоторые приложения отказались работать с таким файлом. Две программы для просмотра PDF увидели, что разделов нет, и автоматически достроили их, не оповещая об изменении контента. Еще три без каких-либо возражений проглотили такой формат.

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

Когда документ подписывают, в инкрементальном обновлении добавляются два важных поля: /Contents, где содержится собственно подпись, и /ByteRange, в котором описывается, что именно было подписано. В нем находятся четыре параметра, определяющих начало файла, количество байтов до кода подписи, байт, определяющий, где код подписи кончается, и количество байтов после нее. Дело в том, что цифровая подпись — это последовательность символов, получаемая криптографическими методами из кода PDF-документа. По объективным причинам она не может подписывать сама себя, поэтому область, где хранится подпись, исключается из вычислений.

Исследователи попробовали добавить еще одно поле /ByteRange сразу после подписи. Первые два значения в нем остаются неизменными, меняется только адрес конца кода подписи. В результате в файле появляется дополнительное пространство, в которое можно добавить какие-нибудь вредоносные объекты и описывающий их раздел XRef. По идее, если бы файл читался правильно, то до этого раздела программа бы просто не добралась. Однако 17 из 22 приложений оказались уязвимыми к такой атаке.

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

Исследователи решили на всякий случай проверить приложения и при помощи стандартных пентестерских приемов — попробовать заменить значения разных полей на некорректные или просто удалить их. При экспериментах с разделом /contents выяснилось, что если вместо реальной подписи в нем будет значение 0x00, то две программы для просмотра все равно будут успешно валидировать ее.

А что будет, если оставить подпись на месте, но удалить информацию о том, что именно подписано (то есть раздел /ByteRange)? Или поставить в нем вместо реальных значений null? В обоих случаях нашлись приложения, которые валидировали такую подпись.

Итого, четыре программы из 22 имели ошибки в имплементации, которые можно эксплуатировать.

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

Сводная таблица уязвимостей в приложениях для чтения PDF. Источник: https://media.ccc.de/v/36c3-10832-how_to_break_pdfs

Сводная таблица уязвимостей в приложениях для чтения PDF. Источник.

Забавно, что единственное приложение, не поддавшееся ни на одну из уловок исследователей, это Adobe Reader 9. Проблема в том, что он подвержен RCE-уязвимости, а потому он стоит только у пользователей Linux — просто потому, что это последняя доступная для них версия.

Практические выводы

Какой практический вывод можно сделать из этого? Во-первых, что не стоит слепо доверять цифровой подписи PDF-файла. Если где-то рисуют зеленую галочку, это не значит, что подпись действительно валидна.

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


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

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


Рис. 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-файла с цифровой подписью

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

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

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

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

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

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

Исследователи сформулировали 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.

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

Если файл подписан только вами, можно удалить подпись и продолжить работу над документом или отредактировать исходный документ.

Чтобы удалить свою подпись, щелкните поле подписи правой кнопкой мыши и выберите Очистить подпись.

Очистить подпись

Если файл подписан только вами, вы можете удалить свою подпись и продолжить работу с ним. Если документ подписан кем-то другим, можно запросить у подписавшего неподписанную копию исходного документа.

Для вас или лица, подписывающего документ, доступна возможность его блокировки после подписания. В этом случае документ можно будет использовать только для чтения — его невозможно будет изменить и даже добавить подпись. Функция Блокировка документа после подписания полезна, если вы подписываете документ последним или если вы единственное подписывающее лицо.

Блокировка документа после подписания

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

Если лицо, подписавшее PDF-файл, решит заблокировать его содержимое после подписания, он становится доступен только для чтения для всех, в том числе и для подписавшего.

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

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

Если предполагается, что документ PDF будет подписан другими пользователями, не устанавливайте флажок Блокировка документа после подписания в диалоговом окне «Подписать как» или «Подписать документ».


PDF и XML — очень гиб­кие фор­маты. Гиб­кость дает удобс­тво, ради которо­го при­ходит­ся жер­тво­вать безопас­ностью. В обо­их фор­матах каж­дый год находят мно­жес­тво уяз­вимос­тей, свя­зан­ных как с крип­тогра­фией, так и со струк­турой самого фай­ла. И вот в оче­ред­ной раз доказа­но: даже элек­трон­ная под­пись не дает абсо­лют­ной уве­рен­ности, что в нед­рах элек­трон­ного докумен­та кто‑то не покопал­ся шалов­ливыми руками.

warning

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

Экскурс в PDF

PDF, или Portable Document Format, — это, как вид­но из наз­вания, перено­симый элек­трон­ный документ. Этим фор­матом поль­зуют­ся во мно­гих областях, преж­де все­го в биз­несе. PDF был раз­работан ком­пани­ей Adobe еще в далеком 2005 году. Вплоть до 2020 года фор­мат пре­тер­певал изме­нения четыре раза: в него добав­лялись встро­енные фай­лы, ссыл­ки, скрип­ты и раз­ного рода фун­кции. Тот фор­мат, который мы зна­ем на момент написа­ния этой статьи (PDF 2.0), вышел не так дав­но — в кон­це 2020 года вмес­те с его спе­цифи­каци­ей ISO 32000-2.

PDF вклю­чает в себя часть фун­кций язы­ка PostScript. Мож­но тран­сли­ровать PDF в PostScript. Есть прин­теры, которые уме­ют самос­тоятель­но интер­пре­тиро­вать PDF в PostScript.

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

  • за­голо­вок (header);
  • те­ло фай­ла (body);
  • таб­лица перек­рес­тных ссы­лок (cross-reference table);
  • блок поис­ка таб­лиц объ­ектов и ссы­лок (trailer).

За­голо­вок — это всег­да самая пер­вая стро­ка фай­ла, которая опре­деля­ет номер спе­цифи­кации.

Заголовок PDF

За­голо­вок PDF

Те­ло содер­жит ссыл­ки на объ­екты. К ним отно­сят­ся стра­ницы, изоб­ражения, шриф­ты. Ком­мента­рии могут рас­полагать­ся во всем PDF-фай­ле. Их син­таксис сов­пада­ет с син­такси­сом ком­мента­риев в PostScript, начина­ются они с сим­вола % и закан­чива­ются сим­волом кон­ца стро­ки.

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

Чем даль­ше в лес, тем боль­ше дров: за струк­турой фор­мата «пря­чет­ся» так называ­емая струк­тура пуб­ликации.

Структура публикации

Струк­тура пуб­ликации

Уг­лублять­ся в эти деб­ри мы не будем, дос­таточ­но знать, что текст внут­ри докумен­та сжат и во внут­реннос­тях фай­ла его уви­деть не получит­ся. Вот как, нап­ример, выг­лядит гла­ва из кни­ги в фор­мате PDF, если попытать­ся прос­мотреть ее как прос­той тек­сто­вый файл.

Содержание PDF с точки зрения компьютера

Со­дер­жание PDF с точ­ки зре­ния компь­юте­ра

Атака

Сна­чала давай раз­берем­ся с уяз­вимостью. Пред­ста­вим, что у нас есть Али­са (под­писыва­ет документ) и Боб (получа­ет под­писан­ный Али­сой документ) и, естес­твен­но, сам документ. Али­са сво­им сер­тифика­том под­писала документ и отпра­вила его Бобу. Боб уве­рен в том, что документ под­линный, так как он с под­писью. Но вот что будет, если документ готови­ла не Али­са (она толь­ко под­писала) и отправ­ляла тоже не она? Ата­ка с под­меной содер­жимого под­писан­ного докумен­та обыч­но про­исхо­дит в три эта­па.

  1. Ха­кер готовит документ, в котором при­сутс­тву­ет так называ­емое теневое содер­жимое. Это мож­но срав­нить с пус­тым лис­том в сши­том догово­ре, куда мож­но добавить фраг­мент пос­ле под­писания.
  2. Ха­кер отправ­ляет этот документ Али­се. Али­са под­писыва­ет его и отправ­ляет обратно хакеру. Хакер меня­ет содер­жимое докумен­та так, что­бы не сло­мать под­пись.
  3. Ха­кер отправ­ляет изме­нен­ный документ Бобу. Боб уве­рен в том, что документ нас­тоящий, и обра­баты­вает его.

О сущес­тво­вании этой уяз­вимос­ти упо­мина­лось еще в 2012 году, ког­да PDF соот­ветс­тво­вал спе­цифи­кации ISO 19005-3. Одна­ко пос­ле выхода новой вер­сии фор­мата хакеры про­вели оче­ред­ное иссле­дова­ние и прив­лекли вни­мание ком­паний, раз­рабаты­вающих прог­рам­мное обес­печение для работы с PDF.

Есть три спо­соба изме­нить содер­жимое уже под­писан­ного докумен­та: скры­тие, замена, а так­же скры­тие и замена.

Скрытие

Ре­зуль­татом этой ата­ки будет сок­рытие какого‑либо кон­тента за видимым содер­жимым фай­ла. Как толь­ко хакер получа­ет под­писан­ный Али­сой документ, он манипу­лиру­ет докумен­том таким обра­зом, что видимый слой боль­ше не отоб­ража­ется в при­ложе­нии прос­мотра. При­чем теперь уже ранее невиди­мые объ­екты ста­новят­ся вид­ны в PDF-фай­ле.

Замена

Ос­новная идея вари­анта «Замена» — добавить в под­писан­ный документ новые объ­екты, которые счи­тают­ся без­вред­ными, но нап­рямую вли­яют на пред­став­ление содер­жимого. Нап­ример, опре­деле­ние шриф­тов нап­рямую не меня­ет содер­жимое. Одна­ко это вли­яет на вид отоб­ража­емо­го кон­тента и дела­ет воз­можной замену цифр или сим­волов.

Эта ата­ка нацеле­на на инте­рак­тивные фор­мы. Фор­мы под­держи­вают раз­личные мас­ки вво­да (нап­ример, тек­сто­вые поля, тек­сто­вые области, перек­лючате­ли и кноп­ки выбора), где поль­зовате­ли динами­чес­ки вво­дят новое содер­жимое и сох­раня­ют его в докумен­те. Фор­мы так­же могут иметь зна­чения по умол­чанию, которые при необ­ходимос­ти мож­но изме­нить.

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

Скрытие и замена

В вари­анте ата­ки «Скры­тие и замена» PDF-файл содер­жит вто­рой скры­тый документ с дру­гим содер­жимым. Так как Али­са не может уви­деть скры­тое содер­жимое, она под­писыва­ет документ. Пос­ле под­писания хакер получа­ет файл и добав­ляет толь­ко новую таб­лицу внеш­них ссы­лок и трей­лер. В таб­лице внеш­них ссы­лок про­исхо­дит лишь одно изме­нение: ссыл­ка на опи­сание.

Дру­гими сло­вами, хакер соз­дает файл PDF, содер­жащий два объ­екта с одним и тем же иден­тифика­тором, но раз­ным содер­жани­ем. Пос­коль­ку вклю­чение таб­лицы xref , ука­зыва­ющей на уже опре­делен­ный объ­ект в под­писан­ной области, счи­тает­ся без­вред­ным, никаких пре­дуп­режде­ний о вне­сен­ных хакером изме­нени­ях не пос­тупа­ет, и про­вер­ка под­писи про­ходит успешно. Тем не менее Боб и Али­са видят раз­ный кон­тент в одном и том же фай­ле.

Этот вари­ант ата­ки наибо­лее мощ­ный, так как поз­воля­ет изме­нить все содер­жимое докумен­та. Хакер может соз­дать теневой документ, вли­яющий на отоб­ражение каж­дой стра­ницы или даже на общее количес­тво стра­ниц, а так­же на каж­дый содер­жащий­ся в фай­ле объ­ект.

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

Продолжение доступно только участникам

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Читайте также: