Как удалить JavaScript из файлов PDF

Как известно, внутри файлов PDF можно размещать скрипты JavaScript, которые будут запускаться на исполнение в браузере. Например, если загрузить этот PDF, то вы увидите результат выполнения скрипта:

a0pd8avrgk4qicevejp_iazs-is.png

Это стандартная функция формата. Все разработчики браузеров знают, что PDF подобно HTML является активным контентом и может содержать исполняемые скрипты.
Несмотря на это, периодически некоторые специалисты по безопасности объявляют исполнение скриптов в PDF на сайте вариантом атаки Stored XSS.

Stored XSS


В этом типа атаки предполагается, что внедрённый скрипт «постоянно хранится на целевом сервере, например, в базе данных, в форуме сообщений, журнале посетителей, поле комментариев, PDF-файле и т. д. Жертва извлекает и запускает вредоносный скрипт, когда запрашивает сохранённую информацию. Stored XSS также иногда называют Persistent или Type-II XSS.

На самом деле классическая атака Stored XSS предполагает, что где-то на сервере хранится HTML-документ, который впоследствии может быть вызван для отображения в браузере посетителя (жертвы). Это действительно является угрозой для безопасности, потому что встроенный скрипт может манипулировать куками (путём доступа к свойству document.cookie), манипулировать хранилищами веб-платформы (IndexedDB, localStorage и т. д.), проводить другие атаки.

Но в случае с PDF накладывает серьёзные ограничения на функциональность скриптов в PDF, поэтому хранение таких файлов с активным контентом не является уязвимостью XSS.

В документации Chromium написано:

PDF-файлы имеют возможность запускать JavaScript, обычно для облегчения проверки полей при заполнении формы. Обратите внимание, что набор привязок, предоставляемых PDF, более ограничен, чем тот, который DOM предоставляет HTML-документам, и PDF-файлы не получают никаких дополнительных полномочий, основанных на домене, с которого они загружаются (например, нет document.cookie).


Это значит, что область выполнения скриптов из PDF очень ограничена: нет доступа к cookies или хранилищам, очень ограничена возможность делать запросы (можно только перемещать окно документа), нет возможности использовать мощные возможности веб-платформы с объектной моделью DOM, объектам document, window, navigator и др. Хотя возможности JavaScript в PDF крайне ограничены, но программам для просмотра PDF следует быть осторожными и внимательно следить, чтобы случайно не выйти за рамки безопасных ограничений.

Скрипты PDF в браузере


Если пользователь вручную отключает выполнение скриптов в браузере, то браузер должен распространять это ограничение также на документы PDF.

syjwhzuqugxm_zofxv77iujpq80.png

Например, в коде Chromium есть такой фрагмент:

/**
 * Determine if the content settings allow PDFs to execute javascript.
 */
function configureJavaScriptContentSetting(browserApi: BrowserApi):
    Promise {
  return new Promise(resolve => {
    chrome.contentSettings.javascript.get(
        {
          'primaryUrl': browserApi.getStreamInfo().originalUrl,
          'secondaryUrl': window.location.origin,
        },
        (result) => {
          browserApi.getStreamInfo().javascript = result.setting;
          resolve(browserApi);
        });
  });
}


В браузере Firefox на странице about:config тоже есть переключатель javascript.enabled:

y7qntghrtktcmi9wvueldayfhi4.png

Но конкретно он никак не влияет на выполнение скриптов в PDF, для них действует отдельный переключатель pdfjs.enableScripting:

noyqqcuytvuzcsggl0eyol52y8s.png

В свою очередь, Chromium игнорирует заголовки Content-Security-Policy (CSP) в ответах на PDF-файлы, потому что он рендерит PDF-файлы с помощью веб-технологий, которые могут быть запрещены в CSP, что приводит к путанице и мешает разработчикам.

Таким образом, выполнение JavaScript в PDF-файлах — это не уязвимость, а стандартная функция формата. В то же время браузеры, другие программы и веб-приложения могут по-разному отображать содержимое PDF, у каждой из них свой движок для рендеринга и своя политика. И где-то в каком-то движке может оказаться уязвимость, которая разрешает выполнить потенциально опасный код.

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

lqjodo-tbq2tpypl77fghunbcd0.png

Как вариант, сомнительные PDF можно открывать в движках, которые не поддерживают выполнение скриптов (например, xpdf, mupdf или atril) и поэтому неуязвимы для таких эксплоитов.

Можно добавить, что PDF не единственный формат, который разрешает активный контент, то есть выполнение программ JavaScript, встроенных в документ. Например, активный контент также разрешён в графическом формате SVG (см. SVG Scripting) для интерактивных анимаций и прочего, но браузер тоже сильно ограничивает их в функциональности. Формат PostScript тоже позволяет внедрить активный контент с исполняемым кодом.

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

© Habrahabr.ru