javascript

Запуск Linux внутри PDF

  • понедельник, 7 апреля 2025 г. в 00:00:03
https://habr.com/ru/companies/globalsign/articles/898056/


По мнению некоторых пользователей, 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 и других операционных систем в браузере. Вот список виртуальных машин, которые можно запустить в браузере:

CPU ОС Пользовательский интерфейс Поддержка VFsync Адрес загрузки Комментарий
x86 Alpine Linux 3.12.0 Консоль Да ссылка
x86 Alpine Linux 3.12.0 X Window Да ссылка Меню по правой кнопке мыши
x86 Windows 2000 Графический Нет ссылка Отказ от ответственности
x86 FreeDOS VGA Text Нет ссылка
riscv64 Buildroot (Linux) Консоль Да ссылка
riscv64 Buildroot (Linux) X Window Да ссылка Меню по правой кнопке мыши
riscv64 Fedora 33 (Linux) Консоль Да ссылка Предупреждение: длительное время загрузки
riscv64 Fedora 33 (Linux) X Window Да ссылка Длительное время загрузки. Меню по правой кнопке мыши

Имея такой инструмент, упаковать эмулятор в документ PDF было делом техники.

С точки зрения безопасности, эксперимент определённо вызывает вопросы. Файлы PDF давно используются как контейнеры для вредоносных скриптов, но новый вектор атаки выводит опасность на новый уровень: теперь PDF превращаются в полноценный эмулятор ОС с хорошей вычислительной мощностью.

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



Код проекта LinuxPDF доступен на GitHub.

Как мы упоминали, ранее тот же разработчик запустил Doom внутри PDF в рамках эмулятора DoomPDF, который был спроектирован похожим образом.



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



Поиграть в DoomPDF можно здесь (предупреждение: сервер временами не справляется с нагрузкой).


Для защиты от таких угроз существуют специальные парсеры вроде pdfsyntax, которые визуализируют содержимое PDF-документа.