pdf-hack

добывание информации из pdf-файлов\\ или взлом eBook'ов своими руками

крис касперски ака мыщъх, noemail

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

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

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

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

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

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

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

pdf-hack_image_1.jpg

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

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

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

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

U-пароль используется для защиты документа от несанкционированного просмотра и если он установлен, при открытии pdf-файла мы увидим обескураживающее диалоговое окно с требованием «enterpassword» (см. рис. 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  DocumentProperties) или нажав <Ctrl-D>, появится диалоговое окно с приблизительно следующей информацией:

(печать) printing allowed (разрешена)
(сборка документа) documentassembly not allowed (запрещена)
(копирование или извлечение содержимого) contentcopingorextraction 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 свойства нашего документа, запрещено все, кроме печати

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

Рисунок 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 антиотладочные приемы все-таки появились, а eBookReader защищен пакетом PACEIntelLock, шифрующим код и противодействующим отладчику, но вот проверки целостности там по прежнему нет.

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

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

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

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

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

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

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

Заголовок (header) описывает различную служебную информацию и нам свершено не интересен, а вот тело файла (body) не мешает рассмотреть поподробнее. Оно состоит из последовательности объектов (object), идентифицируемых двумя числами — номером объекта (objectnumber) и номером поколения (generationnumber). Внутренне объекты состоят из потока данных (streamdata) и словаря потока (streamdictionary). Словарь описывает атрибуты данных, объясняя вьюверу что это вообще такое: графическое изображение, текст, шрифты, зашифрованы они или нет и если зашифрованы то по какому алгоритму и т.д. Таблица перекрестных ссылок (crossreferencetable) связывает номера объектов с их позицией в файле и всегда хранится в незашифрованном состоянии.

<PDF file> ::= <header> <body> <cross-reference table> <trailer>

<body> ::= <object> {<object>}

<object> :: <objectID> (<data> | <> <stream>)

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

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

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

Имена начинаются с наклонной черты, той самой, которой разделяют каталоги в UNIX (например, «/ThisIsName»), ссылки на объекты обозначаются парой чисел — номер объекта/поколения, за которыми идем ключевое слово «R» (например, «23 0 R»). Данные разных типов могут быть объединены в массив (array) или словарь (dictionary). Массив обрамляется прямыми скобами (например, «[23 0 R /XYZnull]»), а словарь «типографскими кавычками» (например, ««/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 он содержит так называемый «trailerdictionary» (дословно «словарь прицепа»), содержащий ссылки на важнейшие объекты документа, в том числе и словарь шифрования (encryptiondictionary), который присутствует в любом зашифрованном 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% поле запретов

/Length 40% длина ключа шифрования

endobj

Листинг 4 словарь шифрования, описывающий алгоритм и атрибуты шифра

Поле с именем «/Filter (имя фильтра)» специфицирует имя дескриптора безопасности, определяющего алгоритм шифрования. По умолчанию это «/Standard», однако, при наличии плагинов поддерживаются и другие фильтры, из которых в первую очередь хотелось бы отметить Rot13 от New Paradigm Resource Group (www.nprg.com), со стоимостью в $3000 за копию, что мыщъху явно не по карману, то есть не по хвосту, под которым у него как известна находится дырка, тем более что все ключи легко обнаруживаются тривиальным контекстным поиском в теле плагина; FileOpen-фильтр, разработанный FileOpen Systems (www.fileopen.com), требующей за лицензию $2500 и позиционируемый как «complete, securee-publishingsolution» (законченное, безопасное решение для электронных публикаций), но в действительности все не так. FileOpenPublisher версии 2.3 шифровал *все* документы одним-единственным ключом, не представляющим для хакеров никакого секрета и хранящимся прямо в плагине, начиная с версии 2.4 FileOpen Publisher используют сменные ключи, однако, сам зашифрованный документ содержит все необходимую информацию для мгновенного восстановления секретного ключа, короче очередная лажа; фильтр SoftLock от компании SoftLock Services, Inc. (www.softlock.com) идет немного дальше, используя для генерации ключа (SoftlockIDNumber) идентификатор тома жесткого диска. Пароль, введенный пользователем, должен соответствовать секретному идентификатору SoftlockID открываемого pdf-документа, то есть говоря другими словами, на чужой машине свой файл не прочтешь. Издатели ликуют, а хакеры между тем ломают книги только так! При эффективной длине пароля в 24 бита, даже на догигагерцовых компьютерах он вскрывается методом тупого перебора менее чем за сутки, а при использовании оптимизированных алгоритмов находится практически мгновенно. Так что, особого смысла во всех нестандартных фильтрах нет. Во всяком случае, пока… Впрочем, в подавляющем большинстве случаев используется фильтр типа «Standard», а все остальные встречаются крайне редко.

Поле «/V» описывает алгоритм, используемый фильтром для шифрования. Один и тот же фильтр может использовать множество различных алгоритмов и это поле позволяет выбрать тот или другой. Стандартный фильтр использует следующие значения:

  1. 0 — алгоритм недокументирован и более не поддерживается;
  2. 1 —открытый алгоритм шифрования с длиной ключа 40 бит, базовый для всех PDF;
  3. 2 — тот же самый алгоритм, но с длиной ключа свыше 40 бит, используется в PDF1.4+;
  4. 3 — усиленный недокументированный алгоритм с длинной ключа от 40 до 128 бит, используется в PDF 1.4+ (не документированность вызвана требованием американского департамента коммерции);

Поле «/R» указывает ревизию (подверсию) алгоритма шифрования. В частности, версия 1 (/V 1) поддерживала только ревизию номер 2 и 3.

Поле «/Length» задет размер ключа шифрования в битах (обязательно представляющий собой степень 8), в данном случае он равен 40, т.е. используется 40 битное шифрование по базовому алгоритму. Естественно, что все эти поля носят сугубо информативный характер и менять их не следует. От того, что мы сократим длину ключа с 40 бит до, ну скажем, 1, легче расшифровывать документ не будет.

Поле «/O» представляет собой 32-байтовую строку, генерируемую на основе O- и U-паролей. Это не сам пароль, а только его хэш, используемый для проверки правильности пароля владельца.

Поле «/U» представляет собой другую 32-байтовую строку, генерируемую на основе U-пароля и используемую для проверки правильности пароля пользователя

Поле «/P» это 32-битный флаг, отвечающий за политику доступа к документу, то есть за раздачу разрешений и запретов. То что нам надо!!! Каждый бит, последовательно пронумерованный от 1 до 32 (наименее значимый бит лежит по меньшему адресу, т.е. все как в x86), будучи сброшенным в ноль, запрещает то или иное деяние (подробности в таблице 2). А что если попробовать установить все биты в единицу, получив максимум полномочий и сняв все запреты? Увы! Ничего не получится! В Adobe сидят далеко не идиоты и поле /P попадает под пяту хэш-суммы, алгоритм генерации которой через несколько абзацев будет рассмотрен с высоты птичьего полета, а пока посмотрим какие ограничения наложены на наш документ.

P-флаг содержит значение -60 (минус 60), которое в HEX-представлении равно FFC4h. Если перевести это число в двоичную форму мы получим 1111111111000100 или около того. И что же эта сакральная грамота значит? Попробуем расшифровать. Два правых бита равны нулю, как им и положено быть. Третий бит разрешает печать и печать действительно разрешена, а вот все остальные операции (включая копирование текста в буфер обмена) строго-настрого запрещены…

битзначение
1-2зарезервированы и должны быть равны 0
3печать (начиная с ревизии 3 см бит 12)
4модификация документа (см. так же биты 6, 9 и 11)
5выделение/копирование
6вставка или модификация аннотаций
7-8зарезервированы, должны быть установлены в 1
9заполнение интерактивных полей (этот бит перекрывает бит 6)
10извлечение текста и графики доступной людям-инвалидам
11сборка страниц документа и создание закладок
12печать документа в ухудшенном качестве
13-32зарезервированы, должны быть равны нулю

Таблица 2 назначение отдельных битов P-флага, определяющего правомерность различных операций над pdf'ом

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

  1. берем U-пароль (обычно пустой) и дополняем его до 32 байт, используя следующую строку, жестко прописанную (hardcoded) в теле Acrobat'а: 28hBFh 4Eh 5Eh 4Eh 75h 8Ah 41h 64h 00h 4Eh 56hFFhFAh 01h 08h 2Eh 2Eh 00hB6hD0h 68h 3Eh 80h 2Fh 0ChA9hFEh 64h 53h 69h 7Ah, соединяя пароль со строкой операцией конкатенации (объединения);
  2. к полученной последовательности дописываем хэш O-пароля (/O поле);
  3. дописываем P-флаг, интерпретируемый как 4-байтовая целочисленная переменная типа LSB (Less Significant Bellow – наименее значимый байт лежит по меньшему адресу как в x86), если бы пункта 3 не существовало, мы бы могли свободно менять атрибуты P-флага в HEX-редакторе, а так… увы…
  4. дописываем идентификатор (поле /ID), если он есть (это необязательное поле);
  5. пропускаем полученную последовательность через алгоритм MD5 и на выходе получаем хэш-сумму первые 5 байт которой и будут ключом шифрования (encryptionkey) для 40-битного алгоритма (примечание: в ревизии 3 полученный хэш пропускается через MD5-алгоритм 50 раз, и от финальной хэш-последовательности берется столько байт, сколько нужно для ключа);

Хэш-сумма пользовательского пароля, хранящаяся в /U-поле это всего лишь 32-байтовая последовательность, дополненная вышеуказанной hardcoded-строкой, зашифрованная по алгоритму RC4 с использованием 5-байтового ключа шифрования (encryptionkey).

Проверка пароля, введенного пользователем, осуществляется выполнения пунктов 1-5 с последующий сравнением полученного результата со значением /U-поля. Если обе последовательности совпадают по последнего бита, пароль считается истинным и наоборот.

Проверка пароля владельца осуществляется по аналогичной схеме. Выполняем пункты 1-5 используя либо пароль пользователя, либо жестко кодированную последовательность, если этого пароля нет. Полученным ключом шифрования encryptionkey расшифровываем O-поле по алгоритму RC4 и трактуем образовавшуюся последовательность как U-пароль, проверяя его по вышеописанной схеме. Очевидно, если мы знаем U-пароль (или содержимое документа незашифрованно), мы можем модифицировать P-флаг и регенерировать /O-поле, рассчитав его новое значение, которое Acrobat воспримет как правильное.

С расшифровкой содержимого, зашифрованного непустым U-паролем, все обстоит намного сложнее. Да, мы можем рассчитать новое /U-поле для пустого пароля и Acrobat подумает, что никакого пароля здесь нет, но открыть файл он все равно не сможет. Прежде его необходимо расшифровать. Это делается так:

  1. выполняем шаги 1-5, получая 5-байтовый ключ шифрования (или более длинный);
  2. дописываем 3-байтовый номер строки/объекта (string/objectnumber) и 2 байтовый номер поколения (generationnumber) см. рис. 10;Примечание: в фильтре ревизии 3 номер объекта и поколения пропускаются через скрамблер и к ним еще добавляется случайная привязка в лице SALT-строки (см. рис. 11);
  3. вычисляем MD5 хэш для данной 10-байтовой строки;
  4. используем первые 10 или более байт хэш-суммы в качестве ключа шифрования по RC4, расшифровывая содержимое строки/объекта.

Если пароль пользователя не установлен, мы можем легко и быстро расшифровать PDF-файл, освобождаясь от оков O-пароля, т.к. в этом случае вместо U-пароля используется жестко прошитая строка. Просто расшифруйте все секции и строки, удаляя /Encrypt-поле из trailer'а, после чего pdf будет свободен от каких-либо ограничений.

Хуже, если O-пароль не пустой и при открытии файла выскакивает противное диалоговое окно, требующее его ввода. Ничего другого не остается кроме как перебирать…

Рисунок 10 алгоритм расшифровки pdf документа стандартным фильтром ревизии 1 и 2

Рисунок 11 алгоритм расшифровки pdf документа стандартным фильтром ревизии 3

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

Короче мы вляпались. Криптография — штука серьезная и все надежда на то, что пользователь был лох и назначил простой словарный пароль, который легко подобрать. Для этого совершенно необязательно каждый раз запускать Acrobat и вводить все словарные слова одно за другим. Это долго и непроизводительно. Будем использовать тот же самый метод аутентификации, что и сам Acrobat. Вычисляем хэш-сумму испытуемого пароля и сравниваем ее с /U-полем. На наше несчастье, хэш-сумма вычисляется по медленному алгоритму MD5 и на быстрый успех тут рассчитывать не приходится. Так же мы не можем заранее рассчитать хэш-суммы всех словарных паролей, чтобы впоследствии использовать их множестве файлов (именно так ломается NT и некоторые другие криптосистемы). Хитрые разработчики pdf'а использовали привязку к идентификатору документа и потому все хэш-суммы строго индивидуальны. Короче придется попотеть.

Для 40-битного шифрования есть крохотная лазейка, позволяющая нам гарантированно подобрать ключ шифрования не более чем за 30 дней на P-III. Для вскрытия электронных книг и других документов это вполне приемлемый срок. Атака получила название «Keysearch» (поиск ключей) и вот в чем состоит ее суть.

Ранние версии Acrobat'а (вплоть до 4.х) поддерживали всего лишь 40-битное шифрование (PDF 1.2/1.3), следовательно, независимо от длины введенного пароля, мы имеем всего лишь 2^40 (1.099.511.627.776) ключей. Разбиваем все пространство ключей на блоки, обрабатываемые независимо друг от друга на одном или нескольких компьютерах, до тех пор пока не найдем единственный правильный ключ. Легендарный AdvancedPDFPasswordRecovery от Elcomsoft именно так и поступает. Если же ждать совсем невмоготу и хочется открыть файл как можно скорее, необходимо использовать большое количество мощных машин, или… напрячь свои мозговые клетки. Как уже говорилось криптоанализ не стоит на месте и алгоритм шифрования RC4 скомпрометировал себя уже не раз и не два. Используя предвычисленные таблицы можно подобрать ключ за очень короткое время можно даже сказать практически мгновенное (подробнее об этом можно прочитать в моих статьях, посвященных взлому беспроводных сетей и голубого зуба — там используется схожая технология шифрование). Единственный минус — предвычисленные таблицы требуют очень много памяти, а если ее нет, приходится делать своп на диск и «мгновенные» секунды растягиваются в часы или даже дни. В своей презентации Дмитрий Скляров приводит следующие оценки времени поиска 40-битных ключей на 450MHZ P-III:

ревизия фильтра \ тип пароляUserOwner
ревизия 1,2190,0001xMD5 + 1xRC4100,000 2xMD5 + 2xRC4
ревизия 33,25051xMD5 + 20xRC41,610 102xMD5 + 40xRC4

Таблица 3 скорость перебора паролей в секунду

PCs \ HDD0 GB128 GB256 GB384 GB512 GB
1960 ч480 ч240 ч120 чr60 ч
2480 ч240 ч120 ч60 чr30 ч
3320 ч160 ч80 ч40 чr20 ч
4240 ч120 ч60 ч30 ч15 ч

Таблица 4 время, необходимое для поиска 40-битного ключа в худшем случае

Смотрите, на одной машине с 512 жестким диском (или массивом из нескольких дисков меньшего размера), поиск пароля занимает всего 60 часов или меньше трех дней, а 4 машины справятся с этой задачей в худшей случае за 15 часов, а в среднем пароль будет найден за один рабочий день. Весьма впечатляющий результат, не правда ли? Тем более, что на работе можно запрячь гораздо больше количество машин. Правда, 128-битный ключ шифрования таким способ взломать уже не удастся. Во всяком случае пока… Вся надежда на криптоаналетиков (вдруг уже завтра они выдумают что-то новое) и простые словарные пароли!

40-битное шифрование можно быть гарантировано вскрыто в течении 30 дней на 450 MHZP-III даже без применения современных криптоаналетических алгоритмов.

Все это, конечно хорошо, но писать свою собственную pdf-ломалку может позволить себе далеко не каждый. Одним не хватает времени, другим — знаний, но самое главное — к чему изобретать велосипед, когда можно купить уже готовый. Вот именно, что купить! Большинство взломщиков pdf-файлов распространяются платной основе. Поиск в гуглу по запросу «pdfpassword» обнаруживает свыше 57 миллионов (!) ссылок, но все они ведут преимущественно всего на два продукта: Advanced PDF Password Recovery Professional от Elcomsoft и PDF Password Remover от www.verypdf.com.

Первый — это действительно профессиональный продукт, мгновенно удаляющий O-пароли и вскрывающий 40-битные U-пароли не более чем за 30 дней на P-III, в противном случае приходится использовать словарный перебор, который ничего не гарантирует, однако, взломщик поддерживает множество шаблонов и настроек, позволяющих подобрать наиболее адекватную стратегию поиска. К сожалению, шифрование от сторонних поставщиков (Fileopen, ROT13) не поддерживается.

Рисунок 12 таквыглядит Advanced PDF Password Recovery

Рисунок 13 таквыглядит Advanced PDF Password Recovery Professional

PDF Password Remover восстанавливает только O-пароли, освобождая документ от наложенных на него ограничений. И хотя он это делает мгновенно, нестандартные алгоритмы шифрования им так же не поддерживаются и к тому же он не способен восстанавливать U-пароли. Так что за что разработчики просят деньги — непонятно. Американцы — что с них возьмешь…

Рисунок 14 так выглядит PDF Password Remover

Обе этих утилиты (как и большинство других) демонстрационную версию отдают бесплатно, однако, она сохраняет лишь первые 10% расшифрованного файла, а PDF Password Remover к тому же заставляет вскрытый документ при каждом открытии отображать назойливое диалоговое окно, напоминающее, что он был расшифрован с помощью незарегистрированной версии. И самое главное — все они не поддерживают нестандартные фильтры и не способны ломать электронные книги типа eBook.

Бесплатная утилита PDFPasswordRecoveryCOMSDK работает по тому же самому принципу, только поддерживает более новые версии pdf (вплоть до версии 1.5). В комплект поставки входит пара защищенных pdf-файлов версии 1.4 со 128-битным шифрованием и фильтром ревизии 3, с которым ни Advanced PDF Password Recovery, ни PDF Password Remover уже не справляются! Вотон:

12 0 obj

«/Filter /Standard

/V 2

/Length 128

/R 3

/P -3904

/O<36451BD39D753B7C1D10922C28E6665AA4F3353FB0348B536893E3B1D

B5C579B>

/U<27CDC0844E3EB1E90E9320F5AC6F399900000000000000000000000000000000>

endobj

Листинг 5 128-битное шифрование стандартным фильтром ревизии 3

Обратите внимание, что /O и /U поля представляют собой HEX-массив (pdf-спецификация это допускает, но далеко не все pdf-взломщики об этом догадываются). Откройте такой файл вашей любимой утилитой и посмотрите что произойдет, а вот PDFPasswordRecoveryCOMSDK справляется с ним на раз! К тому же, он представляет собой не вещь в себе (типа exe), а именно SDK, то есть комплект разработчика, пригодный для встраивания в ваши собственные приложения, написанные на Си, DELPHI или VB. Вот это чисто хакерский подход к делу! Правда, как и все остальные программы, PDFSDK хочет денег, а демонстрационная версия сохраняет только половину страниц.

Ряд утилит работает совсем по другому принципу. Вместо того, чтобы реализовывать свой собственный pdf-декриптор, они открывают pdf-файл (или электронную книгу) «руками» IE и грабят расшифрованное содержимое в отдельный pdf, свободный от всяких ограничений. Естественно, взломать неизвестный U-пароль они не в состоянии, однако, могут, например, «отвязать» eBook от Интернета, если он получает скрытый пароль по сети.

Подавляющее большинство pdf-взломщиков не поддерживают фильтры шифрования от сторонних поставщиков (типа FileOpen, SoftLock). Пишите для их вскрытия свои собственные утилиты!

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

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

pdf-hack_image_14.jpg

Рисунок 15 жаба все еще душит держателей авторских прав

  1. eBooks security - theory and practice:
    1. презентация Дмитрия Склярова, посвященная взлому pdf-документов и электронных книг, прочитанная им на хакерской конференции DEFCONNine, 13 - 15 июня 2001 (AlexisParkinLasVegas, NevadaUSA), содержит массу технической информации и относится к разряду MustHave (на английском языке). К сожалению, дать точную ссылку затруднительно, поскольку файл постоянно меняет свою дислокацию, вот, попробуйте здесь: http://www.download.ru/defcon.ppt;
  2. how PDF encryption using Adobe's «Standard Security Handler» works:
    1. сжатое описание основных принципов шифрования ранних версий pdf, содержит некоторое кол-во ошибок и неточностей, поэтому по ходу изложения необходимо сверяться с фирменной спецификацией (на английском языке): http://www.cs.cmu.edu/~dst/Adobe/Gallery/anon21jul01-pdf-encryption.txt
  3. PDF reference:
    1. фирменная спецификация на PDF, содержит буквально все (на английском языке): http://partners.adobe.com/public/developer/pdf/index_reference.html;
  4. PDF Password Recovery COM SDK Free Download:
    1. библиотечка хакерских функций для работы с зашифрованными pdf-файлами (на английском языке): www.shareup.com/PDF_Password_Recovery_COM_SDK-download-12693.html;
  5. ElcomSoft:
    1. главный сайт фирмы, специализирующийся на взломе разных документов (на русском и английском языках) http://www.elcomsoft.com;