Дробью в PDF. Редактируем подписанный файл PDF, не ломая подписи

Содержание статьи

  • Экскурс в PDF
  • Атака
  • Скрытие
  • Замена
  • Скрытие и замена
  • Реализация
  • Как защититься
  • Заключение

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

PDF и XML — очень гиб­кие фор­маты. Гиб­кость дает удобс­тво, ради которо­го при­ходит­ся жер­тво­вать безопас­ностью. В обо­их фор­матах каж­дый год находят мно­жес­тво уяз­вимос­тей, свя­зан­ных как с крип­тогра­фией, так и со струк­турой самого фай­ла. И вот в оче­ред­ной раз доказа­но: даже элек­трон­ная под­пись не дает абсо­лют­ной уве­рен­ности, что в нед­рах элек­трон­ного докумен­та кто‑то не покопал­ся шалов­ливыми руками.

warning

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

 

Экскурс в PDF

PDF, или Portable Document Format, — это, как вид­но из наз­вания, перено­симый элек­трон­ный документ. Этим фор­матом поль­зуют­ся во мно­гих областях, преж­де все­го в биз­несе. PDF был раз­работан ком­пани­ей Adobe еще в далеком 2005 году. Вплоть до 2020 года фор­мат пре­тер­певал изме­нения четыре раза: в него добав­лялись встро­енные фай­лы, ссыл­ки, скрип­ты и раз­ного рода фун­кции. Тот фор­мат, который мы зна­ем на момент написа­ния этой статьи (PDF 2.0), вышел не так дав­но — в кон­це 2020 года вмес­те с его спе­цифи­каци­ей ISO 32000-2.

info

PDF вклю­чает в себя часть фун­кций язы­ка PostScript. Мож­но тран­сли­ровать PDF в PostScript. Есть прин­теры, которые уме­ют самос­тоятель­но интер­пре­тиро­вать PDF в PostScript.

В пер­вом приб­лижении струк­тура самого докумен­та PDF не очень слож­ная. Файл сос­тоит из сле­дующих эле­мен­тов:

  • за­голо­вок (header);
  • те­ло фай­ла (body);
  • таб­лица перек­рес­тных ссы­лок (cross-reference table);
  • блок поис­ка таб­лиц объ­ектов и ссы­лок (trailer).

Струк­тура PDF-фор­мата

За­голо­вок — это всег­да самая пер­вая стро­ка фай­ла, которая опре­деля­ет номер спе­цифи­кации.

За­голо­вок PDF

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

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

Чем даль­ше в лес, тем боль­ше дров: за струк­турой фор­мата «пря­чет­ся» так называ­емая струк­тура пуб­ликации.

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

Уг­лублять­ся в эти деб­ри мы не будем, дос­таточ­но знать, что текст внут­ри докумен­та сжат и во внут­реннос­тях фай­ла его уви­деть не получит­ся. Вот как, нап­ример, выг­лядит гла­ва из кни­ги в фор­мате PDF, если попытать­ся прос­мотреть ее как прос­той тек­сто­вый файл.

Со­дер­жание PDF с точ­ки зре­ния компь­юте­ра 

Атака

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

  • Ха­кер готовит документ, в котором при­сутс­тву­ет так называ­емое теневое содер­жимое. Это мож­но срав­нить с пус­тым лис­том в сши­том догово­ре, в который мож­но добавить фраг­мент пос­ле под­писания.
  • Ха­кер отправ­ляет этот документ Али­се. Али­са под­писыва­ет его и отправ­ляет обратно хакеру. Хакер меня­ет содер­жимое докумен­та так, что­бы не сло­мать под­пись.
  • Ха­кер отправ­ляет изме­нен­ный документ Бобу. Боб уве­рен в том, что документ нас­тоящий, и обра­баты­вает его.
  • О сущес­тво­вании этой уяз­вимос­ти упо­мина­лось еще в 2012 году, ког­да PDF соот­ветс­тво­вал спе­цифи­кации ISO 19005-3. Одна­ко пос­ле выхода новой вер­сии фор­мата хакеры про­вели оче­ред­ное иссле­дова­ние и прив­лекли вни­мание ком­паний, раз­рабаты­вающих прог­рам­мное обес­печение для работы с PDF.

    Есть три спо­соба изме­нить содер­жимое уже под­писан­ного докумен­та: скры­тие, замена, а так­же скры­тие и замена.

     

    Скрытие

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

     

    Замена

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

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

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

     

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

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

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

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

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

    Источник: xakep.ru

    Ответить

    Ваш адрес email не будет опубликован. Обязательные поля помечены *