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

По мнению некоторых пользователей, 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-документа.
Habrahabr.ru прочитано 6374 раза