Как известно, внутри файлов PDF можно размещать скрипты JavaScript, которые будут запускаться на исполнение в браузере. Например, если загрузить этот PDF, то вы увидите результат выполнения скрипта:
Это стандартная функция формата. Все разработчики браузеров знают, что PDF подобно HTML является активным контентом и может содержать исполняемые скрипты.
Несмотря на это, периодически некоторые специалисты по безопасности объявляют исполнение скриптов в PDF на сайте вариантом атаки Stored XSS.
В этом типа атаки предполагается, что внедрённый скрипт «постоянно хранится на целевом сервере, например, в базе данных, в форуме сообщений, журнале посетителей, поле комментариев, PDF-файле и т. д. Жертва извлекает и запускает вредоносный скрипт, когда запрашивает сохранённую информацию. Stored XSS также иногда называют Persistent или Type-II XSS.
На самом деле классическая атака Stored XSS предполагает, что где-то на сервере хранится HTML-документ, который впоследствии может быть вызван для отображения в браузере посетителя (жертвы). Это действительно является угрозой для безопасности, потому что встроенный скрипт может манипулировать куками (путём доступа к свойству
Но в случае с PDF накладывает серьёзные ограничения на функциональность скриптов в PDF, поэтому хранение таких файлов с активным контентом не является уязвимостью XSS.
В документации Chromium написано:
Это значит, что область выполнения скриптов из PDF очень ограничена: нет доступа к cookies или хранилищам, очень ограничена возможность делать запросы (можно только перемещать окно документа), нет возможности использовать мощные возможности веб-платформы с объектной моделью DOM, объектам
Если пользователь вручную отключает выполнение скриптов в браузере, то браузер должен распространять это ограничение также на документы PDF.
Например, в коде Chromium есть такой фрагмент:
В браузере Firefox на странице
Но конкретно он никак не влияет на выполнение скриптов в PDF, для них действует отдельный переключатель
В свою очередь, Chromium игнорирует заголовки
Таким образом, выполнение JavaScript в PDF-файлах — это не уязвимость, а стандартная функция формата. В то же время браузеры, другие программы и веб-приложения могут по-разному отображать содержимое PDF, у каждой из них свой движок для рендеринга и своя политика. И где-то в каком-то движке может оказаться уязвимость, которая разрешает выполнить потенциально опасный код.
Существуют специальные приложения вроде Dangerzone для санитарной обработки PDF, то есть удаления оттуда любых скриптов. Программа работает путём двойной конвертации через перевод документа в пиксели и обратно. В качестве побочного эффекта ещё и уменьшается размер файла.
Как вариант, сомнительные PDF можно открывать в движках, которые не поддерживают выполнение скриптов (например, xpdf, mupdf или atril) и поэтому неуязвимы для таких эксплоитов.
Можно добавить, что PDF не единственный формат, который разрешает активный контент, то есть выполнение программ JavaScript, встроенных в документ. Например, активный контент также разрешён в графическом формате SVG (см. SVG Scripting) для интерактивных анимаций и прочего, но браузер тоже сильно ограничивает их в функциональности. Формат PostScript тоже позволяет внедрить активный контент с исполняемым кодом.
При отображении таких файлов следует проявлять внимательность и следить, чтобы скрипты не вышли за рамки дозволенных ограничений. Или заблаговременно удалить/заблокировать любые скрипты.
Это стандартная функция формата. Все разработчики браузеров знают, что 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.
Например, в коде Chromium есть такой фрагмент:
/**
* Determine if the content settings allow PDFs to execute javascript.
*/
function configureJavaScriptContentSetting(browserApi: BrowserApi):
Promise<BrowserApi> {
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
:Но конкретно он никак не влияет на выполнение скриптов в PDF, для них действует отдельный переключатель
pdfjs.enableScripting
:В свою очередь, Chromium игнорирует заголовки
Content-Security-Policy
(CSP) в ответах на PDF-файлы, потому что он рендерит PDF-файлы с помощью веб-технологий, которые могут быть запрещены в CSP, что приводит к путанице и мешает разработчикам.Таким образом, выполнение JavaScript в PDF-файлах — это не уязвимость, а стандартная функция формата. В то же время браузеры, другие программы и веб-приложения могут по-разному отображать содержимое PDF, у каждой из них свой движок для рендеринга и своя политика. И где-то в каком-то движке может оказаться уязвимость, которая разрешает выполнить потенциально опасный код.
Существуют специальные приложения вроде Dangerzone для санитарной обработки PDF, то есть удаления оттуда любых скриптов. Программа работает путём двойной конвертации через перевод документа в пиксели и обратно. В качестве побочного эффекта ещё и уменьшается размер файла.
Как вариант, сомнительные PDF можно открывать в движках, которые не поддерживают выполнение скриптов (например, xpdf, mupdf или atril) и поэтому неуязвимы для таких эксплоитов.
Можно добавить, что PDF не единственный формат, который разрешает активный контент, то есть выполнение программ JavaScript, встроенных в документ. Например, активный контент также разрешён в графическом формате SVG (см. SVG Scripting) для интерактивных анимаций и прочего, но браузер тоже сильно ограничивает их в функциональности. Формат PostScript тоже позволяет внедрить активный контент с исполняемым кодом.
При отображении таких файлов следует проявлять внимательность и следить, чтобы скрипты не вышли за рамки дозволенных ограничений. Или заблаговременно удалить/заблокировать любые скрипты.
Комментарии (10)
CaptGg
01.09.2024 18:25+2Для просмотра PDF я использую обычно опенсорсный Sumatra PDF, который без проблем всегда все открывал. Но этот файл со скриптом он открывать отказался, показав ошибку. А я ожидал, что просто не будет выполняться скрипт.
Приму во внимание, что наличие скрипта в PDF в некоторых просмотрщиках может выглядеть будто документ поврежден и не может быть открыт.
OlegZH
Ага. Зато, теперь, понятно, почему при открытии PDF-файла в родном Adobe Acrobat Reader и попытке скопировать текст, иногда можно нарываться на "кракозяблы" или на довольно существенный сбой форматирования, а при открытии того же файла в браузере можно получить нечто более удовлетворительное.
ifap
Это обычно ошибки кодирования и внедрения шрифтов, универсального рецепта лечения которых не знают даже профи электронной верстки. Иногда помогает перевывод (печать заново) проблемного файла на PDF-принтер.
OlegZH
А, ведь, что могло бы быть проще, если бы где-то в интернете лежал бы электронный документ с исходниками и возможностью скачать требуемое. Ведь, PDF предназначен для печати, а нужен-то чаще всего только текст.
ifap
А Вы уверены, что какой-нибудь исходный PageMaker for DOS открылся бы у Вас с меньшими траблами? Скорее уж стоит PDFы выгонять в паблик руками, а не ногами. Кто проходил квест по сдаче верстки в PDF в типографию, тот так не поступает...
klirichek
В pdf можно делать вложения.
Например, нотный энгравер Lilypond может внедрять в созданный pdf исходный файл. Но там исходный файл - обычный текст, поэтому оно имеет смысл.
BasilioCat
Это эмбеддинг шрифта внутрь PDF с сокращением числа глифов - эмбеддятся только использованные в документе символы шрифта. При этом совсем не на те места, где они должны быть - первый использованный символ будет "а". В общем случае распознается через OCR как отрендеренная картинка (FineReader PDF), в частном - возможны варианты с подбором известных шрифтов, подбором порядка символов, частотным анализом...