По мнению некоторых пользователей, PDF — простой формат для обмена документами. На самом деле это очень сложный стандарт, который поддерживает выполнение практически любого кода. Неудивительно, что в прошлые годы энтузиастам удалось успешно запустить
Doom внутри PDF и провести ряд других интересных экспериментов.
Оказалось, что на этом возможности движка по рендерингу PDF не ограничиваются. Он способен запустить даже эмулятор полноценного процессора, а в нём —
целую операционную систему.
В документе PDF находится полный дистрибутив Linux, работающий на виртуальной машине. Его можно открыть даже в браузере, демонстрационная версия доступна по адресу
https://linux.doompdf.dev/ (работает только в браузерах на Chromium):
У самого документа адрес
linux.doompdf.dev/linux.pdf, размер файла PDF составляет 6,1 МБ.
Видео:
Как это работает
Дело в том, что формат PDF поддерживает JavaScript, хотя и с собственной ограниченной стандартной библиотекой. Но даже в этой плохо документированной библиотеке реализовано множество любопытных функций, включая
3D-рендеринг,
отправку HTTP-запросов и
распознавание всех дисплеев, подключённых к компьютеру.
Возможность выполнения JS в PDF и использовал разработчик
ading2210, также известный как
Аллен Динг (Allen Ding), студент-старшекурсник, который интересуется программированием, веб-разработкой и информационной безопасностью. В частности, нестандартными возможностями JavaScript, что видно по его
репозиториям.
Аллену удалось скомпилировать крошечный эмулятор TinyEMU на JavaScript, используя старую версию Emscripten, нацеленную на
asm.js вместо WebAssembly.
TinyEMU — известный эмулятор архитектур x86 и RISC-V от Фабриса Беллара. Отличается крайней минималистичностью.
Ранее на базе своего эмулятора Фабрис Беллар демонстрировал проект
JSLinux — запуск Linux и других операционных систем в браузере. Вот список виртуальных машин, которые можно запустить в браузере:
Имея такой инструмент, упаковать эмулятор в документ PDF было делом техники.
С точки зрения безопасности, эксперимент определённо вызывает вопросы. Файлы PDF давно используются как контейнеры для вредоносных скриптов, но новый вектор атаки выводит опасность на новый уровень: теперь PDF превращаются в полноценный эмулятор ОС с хорошей вычислительной мощностью.
Теоретически можно представить появление более умных PDF-файлов, способных взаимодействовать с пользователем интерактивным образом, как интерфейс операционной системы. Внутри себя они могут содержать различный бинарный контент, в том числе видео, фотографии и исполняемые файлы:
Код проекта LinuxPDF
доступен на GitHub.
Как мы упоминали, ранее тот же разработчик запустил
Doom внутри PDF в рамках эмулятора DoomPDF, который был спроектирован похожим образом.
При увеличении масштаба заметно, что видеокадры отображаются в виде строк ASCII. Этого достаточно, чтобы реализовать шестицветный монохром и сделать читаемым внутриигровой текст.
Поиграть в DoomPDF можно
здесь (предупреждение: сервер временами не справляется с нагрузкой).
Для защиты от таких угроз существуют специальные парсеры вроде
pdfsyntax, которые визуализируют содержимое PDF-документа.