-Поиск по дневнику

Поиск сообщений в Zicon

 -Подписка по e-mail

 

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 05.09.2011
Записей:
Комментариев:
Написано: 62


Взлом PDF

Четверг, 22 Декабря 2011 г. 11:26 + в цитатник

Добывание информации из PDF-файлов

Автор: ©Крис Касперски ака мыщъх

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

Введение

Товарищи! Технологический прорыв, о котором так долго говорили большевики, наконец-то свершился! Себестоимость электронной копии упала до нуля и на горизонте замаячил коммунизм, угрожающе надвигающиеся на буржуа. Как они засуетились! Тут же приняли DCMP (Digital Copyright Millennium Act), защищающий их права и ставящий все остальное человечество в позу, именуемую «раком». Запах американской свободы превратился в смердящую вонь. Америка — это наиболее закомплексованная и наименее свободная страна в настоящий момент (и негров они линчевали, чего никак не может забыть моя нигерийская жена). Здесь, в России, мы имеем куда больше прав и свобод. Наши магнаты интересуются нефтью, газом, лесом, углем, алюминием и авторские права попадут под их загребущую лапу еще не скоро. А до тех пор никто не будет преследовать нарушителей копирайта в «промышленном» масштабе, так что некоторое время можно жить и не умирать.

Впрочем, все это лирика. Переходим к практике. Во времена существования бумажных книг и магнитофонных бобин бороться с потребителями никому не приходило в голову. Напротив, все стремились предоставить как можно больше услуг и цифровые носители были одной из них. Электронные книги, музыка и фильмы в формате mp3/mp4 буквально взорвали старый мир и систему «продавец-покупатель», в том числе. Вместо того, чтобы идти в магазин, теперь мы лезем в Интернет или копируем файлы у знакомых. Торговать по старому в этих условиях уже невозможно, а осваивать новые технологии воротилы рынка не хотят. Все признаки революционной ситуации налицо! Прибыли медиамагнатов стремительно падают и чтобы их удержать, они вместо того, чтобы пойти навстречу пользователям, начинают действовать им во вред, изобретая все новые и новые защиты, ограничивающие наши возможности, удобства и права.

Самое время сделать небольшое отступление и заметить, что я вообще-то совсем не анархист и далеко не халявищик. Я готов платить! Считайте это идиотством или жестом доброй воли, но я готов. Поддержать любимого исполнителя/автора/режиссера рублем - святое дело! Правда, здесь есть одно «но». Желание расставаться с деньгами немедленно испаряется, если правообладатель начинает пакостить мне, например, запрещая выводить документ на печать или копировать текст электронной книги в буфер обмена. Ну, на хрена?! Любой пират такую защиту все равно обойдет, а честным пользователям - один геморрой и проблемы.

Технические средства позволяют обрабатывать информацию быстро и эффективно, только вот та злая зеленая жаба, что душит правообладателей, этого сделать не дает. Но мне, в общем-то, наплевать и на жабу, и на правообладателей, пускай они лижут ей задницу (это их личные половые проблемы), я же буду использовать всю мощь технического прогресса, чтобы работать с документом так, как нравится мне! Знания действительно освобождают нас от цепей и оков! Так что же мы сидим? Чего ждем? Вперед, на штурм!

Жаба, которая душит и тормозит прогресс

Рисунок 1. Жаба, которая душит и тормозит прогресс.

Чем мы будем заниматься

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

КПК

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

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

Баннер

Рисунок 3. Баннер, оставленный на память после случая с беспрецедентным арестом Дмитрия Склярова, лишний раз доказывая, что сильные мира сего не останавливаются ни перед чем и что миром правит международная мафия.

Завтрак диссидента или «чем богат Acrobat»

Adobe Acrobat поддерживает довольно гибкую, можно даже сказать, разветвлению систему шифрования, позволяющую выборочно закрывать доступ как к отдельным функциями (печать, редактирование, выделение и копирование) так и ко всему файлу целиком. Поддерживается два независимых пароля - пароль пользователя(user's password или, сокращенно U-пароль) и пароль владельца (owner's password или, сокращенно, O-пароль). Если пароль владельца не установлен, вместо него используется пароль пользователя, как обычно и происходит. К тому же, очень часто оба пароля совпадают друг с другом и потому для работы с документом достаточно знать лишь один.

U-пароль используется для защиты документа от несанкционированного просмотра и если он установлен, при открытии pdf-файла мы увидим обескураживающее диалоговое окно с требованием «enter password» (см. рис. 4) и до тех пор пока мы его не введем, документ не откроется.

Файлы, защищенные пользовательским паролем, зашифрованы достаточно надежными алгоритмами MD5/RC4, поэтому просто так хакнуть документ не получится. Ранние версии Acrobat'а использовали 40-битное шифрование (легко вскрываемое тупым перебором на Pentium-4), но, начиная с версии 5,0, появилась поддержка 56…128-битных ключей, которые тупым перебором уже не вскрываются. Однако криптоанализ не стоит на месте и за минувшее время появилось несколько эффективных атак, вскрывающих шифр за приемлемое время (см. «Атака на пользовательский ключ»).

Главный недостаток пользовательских паролей — это, конечно же, их открытость. Как известно, защитные механизмы делятся на два типа: схема построенные на знании некоторой секретной информации или на обладании уникальным предметом. Защита Acrobat'а принадлежит к первому типу, то есть мы вынуждены распространять документ вместе с ключом, иначе никто не сможет его прочитать. Например, издатель продет зашифрованные электронные книги, высылая пароль на email, и все вроде бы хорошо, за исключением, что если покупатель выложит пароль в открытый доступ (а он наверняка ее выложит, особенно если дружит с ослом), книгу смогут прочесть все желающие. Много при этом не наторгуешь!

Диалоговое окно, запрашивающее пользовательский пароль

Рисунок 4. Диалоговое окно, запрашивающее пользовательский пароль, защищающий документ от несанкционированного просмотра.

Вот и пришлось pdf-формат дорабатывать. Последние версии Acrobat'а поддерживают разнообразные лицензии, сертификаты и прочую криптографическую мишуру. Теперь пароль может не только вводиться с клавиатуры, но и скрытно извлекаться из файла сертификатов или даже передаваться по Интернету. Это означает, что держатель авторских прав может заставить нас выходить в Интернет при каждом открытии документа или ограничить время работы файла установленным сроком. Как вариант, пароль может генерироваться электронным устройством (например, хаспом) и без него его будет не прочитать. Различные eBook'и приблизительно так и работают.

Общий принцип шифрования pdf-файлов

Рисунок 5. Общий принцип шифрования pdf-файлов.

Весь фокус в том, что в погоне за прибылью, фирма Abode не стала пересматривать базовый pdf-формат и лишь добавила к нему дополнительный уровень шифрования (см. рис. 6). А это значит, что на каком-то этапе неизбежно генерируется U-пароль, который хакер может перехватить и запомнить! Дополнительные уровни защиты тут же падут. Ну, разве жизнь не малина? Впервые, это продемонстрировал небезызвестный российский хакер Дмитрий Скляров на конференции Defcon и отведал этой малины по полной программе. Корпорация Abode, вложившая в рекламу формата eBook миллионы долларов, не смогла смириться с тем, что он раскрыл ее маленький секрет, подрывающий доверие издателей и влекущий за собой миллиарды долларов недополученной выгоды. Оказалось, что eBook совсем не так надежен, как его рекламируют, и вкладывать деньги в издательство электронных книг нельзя. Впрочем, это уже отдельная история. Вернемся к Acrobat'у.

Различные схемы защиты электронных книг

Рисунок 6. Различные схемы защиты электронных книг, основанных на pdf-формате.

O-пароль не препятствует просмотру документа, но позволяет управлять политикой запретов, из которых наиболее неприятен запрет на выделение/копирование и печать. И какие только идиоты это запрещают? Ясно ведь, что если кто-то вознамерится сплагиатить pdf, то эта мера его все равно не остановит, а вот честные пользователи страдают.

Просмотр свойств документа

Рисунок 7. Просмотр свойств документа, определяющих, что можно с ним делать, а что нельзя.

Узнать, какие ограничения наложены на данный документ можно из его свойств (Edit - > Document Properties) или нажав < Ctrl-D >, появится диалоговое окно с приблизительно следующей информацией:

(печать) printingallowed (разрешена)
(сборка документа) document assemblynot allowed (запрещена)
(копирование или извлечение содержимого) content coping or extractionnot allowed (запрещено)
(извлечение содержимого для сборки) content extraction for assemblynot allowed (запрещено)
(вставка комментариев) commentingnot allowed (запрещена)
(заполнение полей формы) filling of form fieldsnot allowed (запрещено)
(вставка цифровой подписи) signingnot allowed (запрещена)
(создание страниц-шаблонов) creating of template pagesnot allowed (запрещено)

Таблица 1. Свойства нашего документа — запрещено все, кроме печати.

Если нажать кнопку «Show Details» можно узнать некоторые подробности, например, что здесь используется слабое (low) 40-битное RC4 шифрование, причем пароль на открытие документа (U-пароль) не установлен и имеется лишь пароль на управление запретами (O-пароль), так же называемый Permissions Password (пароль ограничений).

Пункты меню

Рисунок 8. Если выделение/копирование запрещено, то соответствующие пункты меню Acrobat'а заблокированы.

Можно ли преодолеть эти ограничения? Чтобы там не говорила Abode в своих рекламных проспектах, хакерская логика и интуиция подсказывают: если документ можно открыть, то скопировать его содержимое или вывести на печать - дело техники, ведь контект не зашифрован (иначе как мы бы могли его открыть?). Следование установленным запретам всего лишь вопрос честности работающих с ним приложений, а отнюдь не крипотографическая проблема. Грубо говоря, это то же самое что атрибут Read-Only на файле. Записи на секторном уровне он ничуть не предотвращает, а всего лишь информирует файловую систему, что сюда лучше не писать. То же самое и pdf. Acrobat специально спроектирован так, чтобы не печатать и не копировать текст, если создатель документа этого не хочет. Тем не менее, вьюверы от сторонних производителей могут вести себя иначе. В первую очередь это относится ко всевозможным конверторам (например, pdf в ps), которые случайно или умышлено «забывают» проанализировать атрибуты запретов, генерируя свежеиспеченный ps с которым можно делать все, что угодно (например, преобразовать обратно в «очищенный» pdf). Мы также можем написать свой собственный вьювер (под Linux'ом их пруд пруди), однако исторически сложилось так, что большинство пользователей предпочитает смотреть pdf-файлы Acrobat'ом.

Как разблокировать запреты? Среди пользователей ходит легенда, что внутри документа существует специальный бит, который достаточно исправить HIEW'ом и тогда… На самом деле это не совсем так, точнее совсем не так. Биты запрета печати/копирования действительно существуют и это действительно биты, но… вся проблема в том, что они используются для генерации зашифрованного ключа, которым расшифруются объекты документа. Измените хотя бы один запрещенный бит и pdf тут же затребует O-пароль при открытии! Да откуда же нам его знать?! Сам O-пароль в документе нигде не хранится, вместо этого там лежит его контрольная сумма. Восстановить оригинальный O-пароль невозможно, подбирать его слишком долго, но… что нам мешает снять все запреты с документа, а затем рассчитать новую контрольную сумму для O-пароля? Ведь содержимое документа не зашифровано, поэтому для смены пароля знать его оригинальное содержимое не обязательно!

Конечно, в HIEW'е эту операцию будет осуществить довольно затруднительно (ну разве что у вас находится калькулятор в голове), но можно написать специальную утилиту, которая будет это делать за нас или воспользоваться уже готовой отмычкой, благо что недостатка в них не ощущается.

Модификация акробата

Вместо того, чтобы воевать с O-паролем внутри pdf-файла, можно просто хануть сам Acrobat, чтобы он всегда все выделял и печатал, невзирая ни на какие запреты. Это действительно несложно сделать. Вплоть до версии 4,0 включительно компания Abode не предпринимала никаких противохакерских мер - ни проверки целостности кода, ни антиотладочных приемов, ни шифрованного кода. Правда, начиная с версии 5,0 антиотладочные приемы все-таки появились, а eBook Reader защищен пакетом PACE IntelLock, шифрующим код и противодействующим отладчику, но вот проверки целостности там по-прежнему нет.

Сердце защиты сконцентрировано вокруг функций MD5_Update и MD5_Init, которые легко обнаружить в дизассемблере по характерным константам 67452301h, EFCDAB89h, 98BADCFEh и 10325476h.

Взлом с помощью PrintScreen

Запрет на выделение/копирование графических изображений легко обойти при помощи клавиши Print Screen, копирующей копию экрана в буфер обмена. Естественно, при этом копируются не весь документ, а только открытые страницы и только в том разрешении, в котором они отображаются на экране (то есть, вывести на печать векторную диаграмму с разрешением в 1200 DPI у нас все равно не получится), однако в большинстве случаев этого трюка оказывается вполне достаточно.

Точно также можно скопировать и блоки текста, протащив их через OCR (если, конечно, позволят качество документа).

Кто будет полиглотом

Парни! Учите испанский! Это вещь! В сети легко найти множество электронных книг на испанском (переведенных с английского, конечно), оригинал которых отсутствует даже в Осле! А все потому, что испанский язык понимают очень немногие (в процентном отношении) люди и борцы за авторские права, к счастью, не принадлежат к этому числу, а потому факт несанкционированного распространения книг на испанском (японском и др. редких языках) никого не беспокоит и не смущает.

Структура pdf-документа

Вопреки мутным слухам о том, что pdf — недокументированный формат, дизассемблировать неподъемно тяжелый Acrobat Reader для восстановления алгоритма шифрования совершенно необязательно, ведь pdf расшифровывается как portable document format - то есть формат переносимых документов и с самого начала он разрабатывался как открытый стандарт, чем и объясняется его популярность. Мы не привязаны к одному поставщику (Abode) и можем свободно писать свои собственные программные пакеты, открывающие pdf хоть на PC, хоть на Mac'е, хоть на рабочей станции типа SUN.

Все алгоритмы шифрования документированы и детально описаны в спецификации формата, которую можно бесплатно скачать с сайта Adobe (http://partners.adobe.com/public/developer/pdf/index_reference.html) или заглянуть в исходные тексты любого OpenSource pdf-viewr'а. Никаких проблем на этом этапе возникнуть не должно.

Если говорить кратко, то pdf-файл представляет собой довольно сложное инженерное сооружение следующего вида: < PDF file > ::= < header > < body > < cross-reference table > < trailer >.

Заголовок (header) описывает различную служебную информацию и нам совершено не интересен, а вот тело файла (body) не мешает рассмотреть поподробнее. Оно состоит из последовательности объектов (object), идентифицируемых двумя числами - номером объекта (object number) и номером поколения (generation number). Внутренне объекты состоят из потока данных (stream data) и словаря потока (stream dictionary). Словарь описывает атрибуты данных, объясняя вьюверу, что это вообще такое: графическое изображение, текст, шрифты, зашифрованы они или нет и, если зашифрованы — то по какому алгоритму и т.д. Таблица перекрестных ссылок (cross reference table) связывает номера объектов с их позицией в файле и всегда хранится в незашифрованном состоянии.

< PDF file > ::= < header > < body > < cross-reference table > < trailer > < body > ::= < object > {< object >} < object > :: < objectID > (< data > | <   > < stream >) 

Листинг 1. Схематичное представление структуры PDF-файла.

Поддерживаются данные следующих типов: булевские константы (boolean), числа (numeric), ссылка на объекты (object reference), имена (name), строки (string) и потоки (stream). Потоки начинаются с ключевого слова «stream» и заканчиваются ключевым словом «endstream», а между ними расположены двоичные данные. Давайте откроем любой документ HIEW'ом, чтобы найти их (см. рис. 9). Строки могут быть как литеральными (т.е. состоящими из печатаемых символов), так и шестнадцатеричными. Литеральные строки заключаются в круглые скобки: "(это литеральная строка)», а шестнадцатеричные - в угловые: "< 4E6F762073686D6F7A206B6120706F702E >». Строки и потоки могут быть зашифрованы, остальные типы данных - нет.

Исследование pdf-формата в hex-редакторе

Рисунок 9. Исследование pdf-формата в hex-редакторе.

Имена начинаются с наклонной черты — той самой, которой разделяют каталоги в UNIX (например, "/ThisIsName»), ссылки на объекты обозначаются парой чисел - номер объекта/поколения, за которыми идем ключевое слово «R» (например, «23 0 R»). Данные разных типов могут быть объединены в массив (array) или словарь (dictionary). Массив обрамляется прямыми скобами (например, "[23 0 R /XYZ null]»), а словарь «типографскими кавычками» (например, "< < /Name1 (Val1) /Name2 /Val2 > >»)

Это минимум информации, которую необходимо знать для низкоуровневой работы с pdf-документом.

Базовые типы данныхПримеры использования
BooleanTrue
Numeric3,1415926
Object reference23 0 R
Name/ProcSet
String(Contents) *
Stream{binary data}*
Array[23 0 R /XYZ null]
Dictionary< < /Name1 (Val1) /Name2 /Val2 > >

Листинг 2. Базовые типы данных, используемые в pdf-документах.

Что ж! Мы довольно глубоко увязли в теории, пора вылезать на поверхность. Возьмем любой pdf-файл (пусть для определенности это будет http://www.encode-sec.com/pdf/esp0302.pdf) и загрузим его в свой любимый HEX-редактор.

Как и любой другой pdf, он содержит так называемый «trailer dictionary» (дословно — «словарь прицепа»), содержащий ссылки на важнейшие объекты документа, в том числе и словарь шифрования (encryption dictionary), который присутствует в любом зашифрованном pdf'е и без которого его невозможно ни открыть, ни прочитать.

Словарь прицепа может быть расположен в любом месте документа (как в начале, так и в конце), но его легко обнаружить по ключевому слову «trailer», которое стоит в его начале (в нашем случае оно расположено по смещению 451h), а следом за ним идут типографские скобки "< < », символизирующие собственно сам словарь. Заглянем, что у нас там?

trailer < <  /Size 519           % кол-во объектов в файле /Info 460 0 R       % ссылка на объект info /Encrypt 475 0 R    % ссылка на объект словаря шифрования /Root 474 0 R       % ссылка на объект «дерева страниц» /Prev 234761        % ID — необязательный идентификатор объекта /ID[< e1cbefe9c1eaa9478e694f620070dd20 >< eefb91f095d06a4b361ec3b16a9145c6 >]  > > 

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

Мы видим ссылку на объект «encrypt» с номером 457 "/Encrypt 475 0 R» (в других pdf-файлах этот номер наверняка будет иным). Что ж! Поищем его с помощью HIEW'а:

475 0 obj < <  /Filter /Standard                         % стандартный дескриптор безопасности /V 1                                      % версия алгоритма шифрования /R 2                                      % ревизия алгоритма шифрования 2 /O (U\rIA?¦/ya-Oa?g?q.VЦ-?a    ejWI07a+O) % хэш пароля владельца /U (Z.?-IСANйЎЦ~ >aoIД!жeA1 hr?а?eiTo)     % хэш пароля пользователя /P —60

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку