Как вытащить электронную подпись из пдф файла
Исследователи постарались изменить содержимое подписанного 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. Источник.
Забавно, что единственное приложение, не поддавшееся ни на одну из уловок исследователей, это 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-файле. Их синтаксис совпадает с синтаксисом комментариев в PostScript, начинаются они с символа % и заканчиваются символом конца строки.
В таблице хранится информация об объектах в файле: эта таблица состоит из разделов, количество которых зависит от числа объектов, добавленных в файл. Trailer помогает программе, открывающей файл, находить таблицу перекрестных ссылок и специальные объекты. К слову, приложения должны читать PDF-файл с конца.
Чем дальше в лес, тем больше дров: за структурой формата «прячется» так называемая структура публикации.
Структура публикации
Углубляться в эти дебри мы не будем, достаточно знать, что текст внутри документа сжат и во внутренностях файла его увидеть не получится. Вот как, например, выглядит глава из книги в формате PDF, если попытаться просмотреть ее как простой текстовый файл.
Содержание PDF с точки зрения компьютера
Атака
Сначала давай разберемся с уязвимостью. Представим, что у нас есть Алиса (подписывает документ) и Боб (получает подписанный Алисой документ) и, естественно, сам документ. Алиса своим сертификатом подписала документ и отправила его Бобу. Боб уверен в том, что документ подлинный, так как он с подписью. Но вот что будет, если документ готовила не Алиса (она только подписала) и отправляла тоже не она? Атака с подменой содержимого подписанного документа обычно происходит в три этапа.
- Хакер готовит документ, в котором присутствует так называемое теневое содержимое. Это можно сравнить с пустым листом в сшитом договоре, куда можно добавить фрагмент после подписания.
- Хакер отправляет этот документ Алисе. Алиса подписывает его и отправляет обратно хакеру. Хакер меняет содержимое документа так, чтобы не сломать подпись.
- Хакер отправляет измененный документ Бобу. Боб уверен в том, что документ настоящий, и обрабатывает его.
О существовании этой уязвимости упоминалось еще в 2012 году, когда PDF соответствовал спецификации ISO 19005-3. Однако после выхода новой версии формата хакеры провели очередное исследование и привлекли внимание компаний, разрабатывающих программное обеспечение для работы с PDF.
Есть три способа изменить содержимое уже подписанного документа: скрытие, замена, а также скрытие и замена.
Скрытие
Результатом этой атаки будет сокрытие какого‑либо контента за видимым содержимым файла. Как только хакер получает подписанный Алисой документ, он манипулирует документом таким образом, что видимый слой больше не отображается в приложении просмотра. Причем теперь уже ранее невидимые объекты становятся видны в PDF-файле.
Замена
Основная идея варианта «Замена» — добавить в подписанный документ новые объекты, которые считаются безвредными, но напрямую влияют на представление содержимого. Например, определение шрифтов напрямую не меняет содержимое. Однако это влияет на вид отображаемого контента и делает возможной замену цифр или символов.
Эта атака нацелена на интерактивные формы. Формы поддерживают различные маски ввода (например, текстовые поля, текстовые области, переключатели и кнопки выбора), где пользователи динамически вводят новое содержимое и сохраняют его в документе. Формы также могут иметь значения по умолчанию, которые при необходимости можно изменить.
Хакер готовит файл, в котором определяется шрифт, и его описание включается в документ. После подписания документа злоумышленники добавляют новое описание шрифта и перезаписывают предыдущее. Поскольку определение новых шрифтов считается безобидным, приложения, проверяющие подпись, не показывают никаких предупреждений о внесенных изменениях.
Скрытие и замена
В варианте атаки «Скрытие и замена» PDF-файл содержит второй скрытый документ с другим содержимым. Так как Алиса не может увидеть скрытое содержимое, она подписывает документ. После подписания хакер получает файл и добавляет только новую таблицу внешних ссылок и трейлер. В таблице внешних ссылок происходит лишь одно изменение: ссылка на описание.
Другими словами, хакер создает файл PDF, содержащий два объекта с одним и тем же идентификатором, но разным содержанием. Поскольку включение таблицы xref , указывающей на уже определенный объект в подписанной области, считается безвредным, никаких предупреждений о внесенных хакером изменениях не поступает, и проверка подписи проходит успешно. Тем не менее Боб и Алиса видят разный контент в одном и том же файле.
Этот вариант атаки наиболее мощный, так как позволяет изменить все содержимое документа. Хакер может создать теневой документ, влияющий на отображение каждой страницы или даже на общее количество страниц, а также на каждый содержащийся в файле объект.
В то же время этот вариант самый «шаткий», так как при подписании могут быть удалены неиспользуемые объекты, в том числе — теневые. Кроме того, сканер безопасности может обнаружить большое количество лишних незадействованных объектов и выдать предупреждение.
Продолжение доступно только участникам
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Читайте также: