Полезное

Как отредактировать PDF не ломая подписи

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

Небольшое отступление в 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

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

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

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

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

Так выглядит PDF для машины

Нападение

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

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

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

Замена

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

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

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

Скрытие

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

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

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

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

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

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

Реализация

Число 0 на изображении ниже обозначает первый номер объекта в таблице, 334 — количество объектов. Первый элемент таблицы всегда XXXXXXXXXX 65535 f. 65535 — это номер по умолчанию для первого элемента в таблице. F (бесплатно) — объект не используется. Напротив используемых объектов стоит n. Затем идет XXXXXXXXXX — это смещение от начала файла до объекта. В документе будет столько таблиц, сколько объектов добавлено в файл.

cross-reference table

Здесь мы рассмотрим первый тип атаки «Скры­тие» с элементами атаки «Скры­тие и замена», поскольку они по сути схожи. При реализации атаки имейте в виду, что таблица перекрестных ссылок (cross-reference table) представляет собой просто текстовую таблицу. Она начинается со слова xref и содержит ссылки на все объекты.

После таблицы идет trailer, затем значение startxref, которое указывает смещение от начала файла до таблицы. Программа начинает чтение документа в конце. Для проведения атаки нам потребуются следующие инструменты:

  • Крип­тоПро PDF;
  • сер­тификат, ключ;
  • Notepad++ (им я редак­тирую внут­реннос­ти PDF);
  • Крип­тоПро CSP для Windows;
  • Крип­тоПро CSP для Linux;
  • ImDisk.
  • Adobe Acrobat DC;

Перед началом обработки PDF-файла, нам нужно получить ключ с сертификатом, который подойдет для КриптоПро. Сгенерировать ключ в OpenSSL не получится. Поэтому запускаем машину Linux, заходим на сайт КриптоПро и скачиваем дистрибутив для нашей ОС (у меня он в виде файла .deb). Вы должны сначала зарегистрироваться.

Дистрибутив с файлами

Уста­нав­лива­ем пакет:

./install.sh

Те­перь перехо­дим в пап­ку /opt/cprocsp/bin/amd64. Там дол­жны появить­ся сле­дующие бинар­ники: certmgr, cpverify, cryptcp, csptest, csptestf, curl, der2xer, genkpim, inittst, wipefile.

Ге­нери­руем сер­тификат:

cryptcp -creatcert -provtype 81 -dn "C=RU, L=Rostov-na-Donu, CN=srv, 1.2.643.100.5=305867501589415" -exprt -ex -cont "\\\\.\\HDIMAGE\\srv" -ku -certusage "1.3.6.1.5.5.7.3.1" -hashAlg "1.2.643.7.1.1.2.3" -ca http://www.cryptopro.ru/certsrv

В этой коман­де исполь­зуют­ся сле­дующие клю­чи:

  • СА — центр сер­тифика­ции, который под­пишет нам пару клю­ча с сер­тифика­том. Дан­ная пара будет валид­ной, но дей­ство­вать будет толь­ко три месяца;
  • сont — имя кон­тей­нера, в которое сох­ранит­ся ключ с сер­тифика­том.
  • certusage — иден­тифика­тор наз­начения. Раз­лича­ют про­вер­ку сер­вера и кли­ента. Для нашего слу­чая он неважен;
  • hashAlg — алго­ритм шиф­рования для сер­тифика­та. Что­бы пос­мотреть, какие они есть, мож­но выпол­нить коман­ду cpconfig -defprov –view_type;

Про­веря­ем соз­данный кон­тей­нер:

./certmgr –list

Дол­жен появить­ся кон­тей­нер как на скрин­шоте ниже.

Кон­тей­нер в Linux-сис­теме

КриптоПро со своим CSP считает, что криптоконтейнер не должен храниться на жестком диске. Для этого были изобретены токены. Но поскольку у нас под рукой нет токена, а только жесткий диск, мы пойдем другим путем. Для этого нам понадобится ImDisk. Скачаем и установим его.

Данная программа способна создавать своего рода замкнутое дисковое пространство. Да, нам придется создать дополнительный виртуальный жесткий диск на нашем компьютере. Я создал раздел размером 60 МБ с папкой и закинул в него файлы контейнера. Теперь КриптоПро видит и ключ, и сертификат.

Перейдите в корневую папку / var / opt / cprocsp / keys /, где должен появиться каталог с именем, указанным в команде, для создания этого контейнера. В этом каталоге вы найдете шесть файлов с расширением .key — это контейнер. Загрузите и перенесите на свой компьютер с Windows.

Крип­тоПро CSP

Пе­рехо­дим к под­готов­ке самого фай­ла. Необ­ходимо иметь на машине редак­тор PDF — я выб­рал проб­ную вер­сию Adobe Acrobat DC, а так­же Крип­тоПро PDF для воз­можнос­ти под­писать файл.

От­кры­ваем Acrobat и соз­даем пус­той файл. Пишем посере­дине ][aker. Сох­раня­ем и зак­рыва­ем его. При­мер­но так выг­лядят внут­реннос­ти пус­того фай­ла с одним сло­вом, которое мы вве­ли:

%PDF-1.3
3 0 obj
<</Type /Page
/Parent 1 0 R
/Resources 2 0 R
/Contents 4 0 R>>
endobj
4 0 obj
<</Filter /FlateDecode /Length 86>>
stream
xњ3Rрв2Р35W(зr
QРw3T02С30PISp
кZ*›лY)„¤(hg¦з)д¦*”д+¤§–($*Ґ–'Ґиi*„dЃф ьM
endstream
endobj
1 0 obj
<</Type /Pages
/Kids [3 0 R ]
/Count 1
/MediaBox [0 0 595.28 841.89]
>>
endobj
5 0 obj
<</Type /Font
/BaseFont /Helvetica-Bold
/Subtype /Type1
/Encoding /WinAnsiEncoding
>>
endobj
2 0 obj
<<
/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
/Font <<
/F1 5 0 R
>>
/XObject <<
>>
>>
endobj
6 0 obj
<<
/Producer (PyFPDF 1.7.2 http://pyfpdf.googlecode.com/)
/CreationDate (D:20201116165607)
>>
endobj
7 0 obj
<<
/Type /Catalog
/Pages 1 0 R
/OpenAction [3 0 R /FitH null]
/PageLayout /OneColumn
>>
endobj
xref
0 8
0000000000 65535 f
0000000242 00000 n
0000000430 00000 n
0000000009 00000 n
0000000087 00000 n
0000000329 00000 n
0000000534 00000 n
0000000643 00000 n
trailer
<<
/Size 8
/Root 7 0 R
/Info 6 0 R
>>
startxref
746
%%EOF

Вставляем картинку поверх надписи, ставим подпись и подписываем документ. Открываем его в Notepad ++ и находим внешнюю ссылку с таблицей для нашей картинки. Мы меняем необходимые значения n на f, делая их скрытыми.

За­мена таб­лицы на скры­тие объ­екта

Так же можно спрятать кар­тинку, обоз­начив ее как метадан­ные. Их обновле­ние прог­рамма не будет счи­тать вме­шатель­ством в содер­жимое докумен­та. Син­таксис метадан­ных PDF (ста­рого образца, но он работа­ет до сих пор, зна­чит, вер­сион­ность фор­матов под­держи­вает­ся) мож­но изу­чить, к при­меру, тут. Заг­ружа­ем файл, меня­ем метадан­ные и видим их в разоб­ранном виде. Далее методом проб и оши­бок пыта­емся под­кинуть изме­нен­ные дан­ные в файл.Получается сле­дующее:

stream

<?xpacket begin="п»ї" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.4-c006 80.159825, 2016/09/16-03:31:08 ">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/">
<xmp:ModifyDate>2019-08-07T13:48:36+02:00</xmp:ModifyDate>
<xmp:MetadataDate>2019-08-07T13:48:36+02:00</xmp:MetadataDate>
<xmp:CreateDate>2019-08-07T11:14:22+02:00</xmp:CreateDate>
<dc:format>application/pdf</dc:format>
<xmpMM:DocumentID>uuid:d24ecc88-2a52-0b43-9272-3abe5e065c85</xmpMM:DocumentID>
<xmpMM:InstanceID>uuid:9d3cd24f-99fe-0849-a303-c9cfac889c31</xmpMM:InstanceID>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>
endstream

Когда вы закончите, сохраните файл и закройте редактор. Надеюсь, он нам больше не нужен. Итак, мы подписали файл фотографией, и когда мы открываем документ, мы видим совершенно другое содержимое. Это доказывает, что есть брешь в безопасности, но работает она не везде. Различные версии разных программ просмотра PDF могут отображать измененный файл по-разному.

Защита

Adobe исправила ошибки CVE-2020-9592 и CVE-2020-9596 в обновлении от 12 мая 2020 г. Foxit Reader также отображает предупреждение системы безопасности при попытке открыть измененный документ с цифровой подписью.

Ошиб­ки под­писи

Старые версии программного обеспечения, такие как Adobe Acrobat Reader DC v 2019.021.20061, Foxit Reader 3.4.0.1012 и LibreOffice Draw до версии 6, уязвимы для этого типа атак. Самая актуальная защита на данный момент — не использовать устаревшее программное обеспечение. Для тех, кто любит просматривать PDF через браузер, ни один браузер не проверяет подпись на документе и, следовательно, этот трюк будет работать долгое время.

Итоги

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

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

 

 

Click to rate this post!
[Total: 1 Average: 5]
faza

Recent Posts

Лучший адаптер беспроводной сети для взлома Wi-Fi

Чтобы взломать сеть Wi-Fi с помощью Kali Linux, вам нужна беспроводная карта, поддерживающая режим мониторинга…

11 месяцев ago

Как пользоваться инструментом FFmpeg

Работа с консолью считается более эффективной, чем работа с графическим интерфейсом по нескольким причинам.Во-первых, ввод…

11 месяцев ago

Как создать собственный VPN-сервис

Конечно, вы также можете приобрести подписку на соответствующую услугу, но наличие SSH-доступа к компьютеру с…

12 месяцев ago

ChatGPT против HIX Chat: какой чат-бот с искусственным интеллектом лучше?

С тех пор как ChatGPT вышел на арену, возросла потребность в поддержке чата на базе…

12 месяцев ago

Разведка по Wi-Fi и GPS с помощью Sparrow-wifi

Если вы когда-нибудь окажетесь в ситуации, когда вам нужно взглянуть на спектр беспроводной связи, будь…

12 месяцев ago

Как обнаружить угрозы в памяти

Elastic Security стремится превзойти противников в инновациях и обеспечить защиту от новейших технологий злоумышленников. В…

12 месяцев ago