Взлом PDF |
Автор: ©Крис Касперски ака мыщъх
Защита интеллектуальной собственности в последнее время принимает все более непотребные и противоестественные формы, идущие в разрез с интересами потребителей, то есть — нас. Правообладатели ограничивают наши возможности, запрещая просматривать, копировать, печатать, редактировать информацию, но и хакеры не сидят сложа руки, сооружая баррикады и другие средства борьбы.
Товарищи! Технологический прорыв, о котором так долго говорили большевики, наконец-то свершился! Себестоимость электронной копии упала до нуля и на горизонте замаячил коммунизм, угрожающе надвигающиеся на буржуа. Как они засуетились! Тут же приняли DCMP (Digital Copyright Millennium Act), защищающий их права и ставящий все остальное человечество в позу, именуемую «раком». Запах американской свободы превратился в смердящую вонь. Америка — это наиболее закомплексованная и наименее свободная страна в настоящий момент (и негров они линчевали, чего никак не может забыть моя нигерийская жена). Здесь, в России, мы имеем куда больше прав и свобод. Наши магнаты интересуются нефтью, газом, лесом, углем, алюминием и авторские права попадут под их загребущую лапу еще не скоро. А до тех пор никто не будет преследовать нарушителей копирайта в «промышленном» масштабе, так что некоторое время можно жить и не умирать.
Впрочем, все это лирика. Переходим к практике. Во времена существования бумажных книг и магнитофонных бобин бороться с потребителями никому не приходило в голову. Напротив, все стремились предоставить как можно больше услуг и цифровые носители были одной из них. Электронные книги, музыка и фильмы в формате mp3/mp4 буквально взорвали старый мир и систему «продавец-покупатель», в том числе. Вместо того, чтобы идти в магазин, теперь мы лезем в Интернет или копируем файлы у знакомых. Торговать по старому в этих условиях уже невозможно, а осваивать новые технологии воротилы рынка не хотят. Все признаки революционной ситуации налицо! Прибыли медиамагнатов стремительно падают и чтобы их удержать, они вместо того, чтобы пойти навстречу пользователям, начинают действовать им во вред, изобретая все новые и новые защиты, ограничивающие наши возможности, удобства и права.
Самое время сделать небольшое отступление и заметить, что я вообще-то совсем не анархист и далеко не халявищик. Я готов платить! Считайте это идиотством или жестом доброй воли, но я готов. Поддержать любимого исполнителя/автора/режиссера рублем - святое дело! Правда, здесь есть одно «но». Желание расставаться с деньгами немедленно испаряется, если правообладатель начинает пакостить мне, например, запрещая выводить документ на печать или копировать текст электронной книги в буфер обмена. Ну, на хрена?! Любой пират такую защиту все равно обойдет, а честным пользователям - один геморрой и проблемы.
Технические средства позволяют обрабатывать информацию быстро и эффективно, только вот та злая зеленая жаба, что душит правообладателей, этого сделать не дает. Но мне, в общем-то, наплевать и на жабу, и на правообладателей, пускай они лижут ей задницу (это их личные половые проблемы), я же буду использовать всю мощь технического прогресса, чтобы работать с документом так, как нравится мне! Знания действительно освобождают нас от цепей и оков! Так что же мы сидим? Чего ждем? Вперед, на штурм!
Рисунок 1. Жаба, которая душит и тормозит прогресс.
Предметом наших исследований станет растение с семью лепестками, что можно встретить в укромном уголке любого огорода. Шучу. Мы будем ломать pdf, используемый для хранения самых разнообразных текстов и положенный в основу электронных книг типа eBook. Мы покажем, какие системы защиты используется в нем и как их обойти, используя доступные утилиты и свой ум.
Рисунок 2. Электронную книгу можно читать в любом месте, например, на КПК, который всегда с тобой, однако некоторые электронные книги имеют множество досадных защит и ограничений, которые мы собираемся обойти.
Внимание! Это довольно рискованное занятие! В книжный бизнес вовлечены огромные деньги, и пусть не такие огромные как, например, в наркотики или кино, но все же достаточные для того, чтобы засадить вас на весь оставшийся срок. Во всяком случае, в Америку вам лучше не ездить, а то зароют на три метра с головой и имени не спросят. Поэтому, чем меньше окружающих будет знать о том, чем вы там занимаетесь, тем лучше. В идеале, этого не должен знать никто!
Рисунок 3. Баннер, оставленный на память после случая с беспрецедентным арестом Дмитрия Склярова, лишний раз доказывая, что сильные мира сего не останавливаются ни перед чем и что миром правит международная мафия.
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'и приблизительно так и работают.
Рисунок 5. Общий принцип шифрования pdf-файлов.
Весь фокус в том, что в погоне за прибылью, фирма Abode не стала пересматривать базовый pdf-формат и лишь добавила к нему дополнительный уровень шифрования (см. рис. 6). А это значит, что на каком-то этапе неизбежно генерируется U-пароль, который хакер может перехватить и запомнить! Дополнительные уровни защиты тут же падут. Ну, разве жизнь не малина? Впервые, это продемонстрировал небезызвестный российский хакер Дмитрий Скляров на конференции Defcon и отведал этой малины по полной программе. Корпорация Abode, вложившая в рекламу формата eBook миллионы долларов, не смогла смириться с тем, что он раскрыл ее маленький секрет, подрывающий доверие издателей и влекущий за собой миллиарды долларов недополученной выгоды. Оказалось, что eBook совсем не так надежен, как его рекламируют, и вкладывать деньги в издательство электронных книг нельзя. Впрочем, это уже отдельная история. Вернемся к Acrobat'у.
Рисунок 6. Различные схемы защиты электронных книг, основанных на pdf-формате.
O-пароль не препятствует просмотру документа, но позволяет управлять политикой запретов, из которых наиболее неприятен запрет на выделение/копирование и печать. И какие только идиоты это запрещают? Ясно ведь, что если кто-то вознамерится сплагиатить pdf, то эта мера его все равно не остановит, а вот честные пользователи страдают.
Рисунок 7. Просмотр свойств документа, определяющих, что можно с ним делать, а что нельзя.
Узнать, какие ограничения наложены на данный документ можно из его свойств (Edit - > Document Properties) или нажав < Ctrl-D >, появится диалоговое окно с приблизительно следующей информацией:
(печать) printing | allowed (разрешена) |
(сборка документа) document assembly | not allowed (запрещена) |
(копирование или извлечение содержимого) content coping or extraction | not allowed (запрещено) |
(извлечение содержимого для сборки) content extraction for assembly | not allowed (запрещено) |
(вставка комментариев) commenting | not allowed (запрещена) |
(заполнение полей формы) filling of form fields | not allowed (запрещено) |
(вставка цифровой подписи) signing | not allowed (запрещена) |
(создание страниц-шаблонов) creating of template pages | not 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.
Запрет на выделение/копирование графических изображений легко обойти при помощи клавиши Print Screen, копирующей копию экрана в буфер обмена. Естественно, при этом копируются не весь документ, а только открытые страницы и только в том разрешении, в котором они отображаются на экране (то есть, вывести на печать векторную диаграмму с разрешением в 1200 DPI у нас все равно не получится), однако в большинстве случаев этого трюка оказывается вполне достаточно.
Точно также можно скопировать и блоки текста, протащив их через OCR (если, конечно, позволят качество документа).
Парни! Учите испанский! Это вещь! В сети легко найти множество электронных книг на испанском (переведенных с английского, конечно), оригинал которых отсутствует даже в Осле! А все потому, что испанский язык понимают очень немногие (в процентном отношении) люди и борцы за авторские права, к счастью, не принадлежат к этому числу, а потому факт несанкционированного распространения книг на испанском (японском и др. редких языках) никого не беспокоит и не смущает.
Вопреки мутным слухам о том, что 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 >». Строки и потоки могут быть зашифрованы, остальные типы данных - нет.
Рисунок 9. Исследование pdf-формата в hex-редакторе.
Имена начинаются с наклонной черты — той самой, которой разделяют каталоги в UNIX (например, "/ThisIsName»), ссылки на объекты обозначаются парой чисел - номер объекта/поколения, за которыми идем ключевое слово «R» (например, «23 0 R»). Данные разных типов могут быть объединены в массив (array) или словарь (dictionary). Массив обрамляется прямыми скобами (например, "[23 0 R /XYZ null]»), а словарь «типографскими кавычками» (например, "< < /Name1 (Val1) /Name2 /Val2 > >»)
Это минимум информации, которую необходимо знать для низкоуровневой работы с pdf-документом.
Базовые типы данных | Примеры использования |
Boolean | True |
Numeric | 3,1415926 |
Object reference | 23 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
Комментировать | « Пред. запись — К дневнику — След. запись » | Страницы: [1] [Новые] |