• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Подделка и редактирование цифровых подписей PDF файлов

pablo

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

Скрытие​

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

Замена​

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

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

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

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

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

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

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

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

Реализация​

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

Пример таблицы перекрестных ссылок

Пример таблицы перекрестных ссылок

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

После таблицы идет trailer, затем значение startxref, указывающее смещение от начала файла до таблицы. Чтение документа программой начинается с конца. Для выполнения атаки нам понадобятся следующие инструменты:
  • Adobe Acrobat DC;
  • КриптоПро CSP для Windows;
  • КриптоПро CSP для Linux;
  • КриптоПро PDF;
  • сертификат, ключ;
  • Notepad++ (им я редактирую внутренности PDF);
  • ImDisk.
Перед тем как мы начнем потрошить 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
В этой команде используются следующие ключи:
  • certusage — идентификатор назначения. Различают проверку сервера и клиента. Для нашего случая он неважен;
  • hashAlg — алгоритм шифрования для сертификата. Чтобы посмотреть, какие они есть, можно выполнить команду cpconfig -defprov –view_type;
  • СА — центр сертификации, который подпишет нам пару ключа с сертификатом. Данная пара будет валидной, но действовать будет только три месяца;
  • сont — имя контейнера, в которое сохранится ключ с сертификатом.
Проверяем созданный контейнер:
Код:
./certmgr –list
Должен появиться контейнер как на скриншоте ниже.

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

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

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

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

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

КриптоПро CSP

КриптоПро 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++ и находим xref с таблицей для нашей картинки. Меняем необходимые значения 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
Итак, мы подписали файл с фото, а при открытии документа видим абсолютно другой контент.

Итого:​

Баг отработает не везде. 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 через браузер, то ни один браузер не проверяет подпись в документе, для уязвимость будет работать еще долго.


По материалам статьи 8bit
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх