Как обновить библиотеку vue-pdf-embed для устранения уязвимости CVE-2024-4367?
Я пытаюсь обновить библиотеку vue-pdf-embed для устранения уязвимости CVE-2024-4367. Мой текущий package.json содержит следующие версии:
"pdfjs-dist": "^5.4.394",
"vue-pdf-embed": "^2.1.3",
"vue": "^3.5.21",
Однако после обновления я сталкиваюсь со следующей ошибкой компиляции при выполнении команды npm run serve:
ERROR Failed to compile with 68 errors 7:21:41 PM
error in ./node_modules/vue-pdf-embed/dist/index.mjs
Module parse failed: Unexpected token (4583:74)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
| for (const F of c(this, fl).values())
| F.editorType === U && F.show(l);
> (((Z = c(this, zs)) == null ? void 0 : Z.get(Vl.HIGHLIGHT_SHOW_ALL)) ?? !0) !== l && h(this, C, Jt).call(this, [[Vl.HIGHLIGHT_SHOW_ALL, l]]);
| }
| enableWaiting(U = !1) {
@ ./node_modules/@vue/cli-plugin-babel/node_modules/cache-loader/dist/cjs.js??ref--13-0!./node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib!./node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib??ref--14!./node_modules/@vue/cli-service/node_modules/cache-loader/dist/cjs.js??ref--1-0!./node_modules/vue-loader-v16/dist??ref--1-1!./src/components/RegulatoryPdf.vue?vue&type=script&lang=js 3:0-40 7:17-28
@ ./src/components/RegulatoryPdf.vue?vue&type=script&lang=js
@ ./src/components/RegulatoryPdf.vue
@ ./src/router/index.js
@ ./src/main.js
@ multi (webpack)-dev-server/client?http://10.119.111.99:8081&sockPath=/sockjs-node ./node_modules/@vue/cli-service/node_modules/webpack/hot/dev-server.js ./src/main.js
Какие шаги следует предпринять для правильного обновления библиотеки vue-pdf-embed и устранения этой ошибки компиляции?
Устранение CVE-2024-4367 в реализации vue-pdf-embed
Для устранения CVE-2024-4367 в вашей реализации vue-pdf-embed необходимо обновить как зависимость PDF.js, так и vue-pdf-embed до последних безопасных версий, а также решить ошибку компиляции через корректировку соответствующей конфигурации.
Содержание
- Понимание CVE-2024-4367
- Обновление зависимостей до безопасных версий
- Решение ошибок компиляции
- Альтернативные решения и лучшие практики
- Проверка и тестирование
Понимание CVE-2024-4367
CVE-2024-4367 — это критическая уязвимость (CVSS 9.8) в PDF.js, которая позволяет выполнение произвольного JavaScript-кода из-за недостаточных проверок типа объекта FontMatrix в PDF-файлах [источник]. Уязвимость затрагивает:
- Firefox < 126, Firefox ESR < 115.11 и Thunderbird < 115.11
- Любое приложение, использующее версии PDF.js ниже 4.2.67
- Миллионы веб-сайтов, которые встраивают функциональность просмотра PDF
Уязвимость возникает при обработке вредоносного PDF-файла, что позволяет злоумышленникам выполнять произвольный код на системе пользователя, что потенциально может привести к краже данных, полной компрометации системы и несанкционированному доступу к конфиденциальной информации [источник].
Обновление зависимостей до безопасных версий
Рекомендуемые обновления версий
На основании результатов исследования, вот безопасные версии, до которых следует обновиться:
{
"pdfjs-dist": "^4.2.67",
"vue-pdf-embed": "^2.2.0",
"vue": "^3.5.21"
}
Примечание: Исследования показывают, что последняя безопасная версия PDF.js — 4.2.67 или выше. Это значительное понижение версии по сравнению с вашей текущей версией (^5.4.394), но необходимое для обеспечения безопасности [источник].
Пошаговый процесс обновления
-
Обновите package.json:
json{ "dependencies": { "pdfjs-dist": "^4.2.67", "vue-pdf-embed": "^2.2.0", "vue": "^3.5.21" } } -
Чистая установка:
bashrm -rf node_modules package-lock.json npm install -
Проверьте версии:
bashnpm list pdfjs-dist vue-pdf-embed
Решение ошибок компиляции
Ошибка компиляции, с которой вы столкнулись, вероятно, вызвана несовместимостью версий или отсутствующей конфигурацией транспиляции. Вот решения:
Решение 1: Добавление конфигурации Webpack
Создайте или измените ваш файл vue.config.js:
module.exports = {
transpileDependencies: ['vue-pdf-embed'],
configureWebpack: {
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules\/(?!(pdfjs-dist)\/).*/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
}
]
}
}
}
Решение 2: Установка недостающих зависимостей
npm install --save-dev @babel/core @babel/preset-env babel-loader
Решение 3: Альтернативный подход - использование форкнутого пакета
Если приведенные выше решения не работают, рассмотрите возможность использования форкнутого или альтернативного пакета:
npm uninstall vue-pdf-embed npm install vue-pdf-embed-secure
И используйте другой компонент просмотра PDF, который не полагается на уязвимые версии PDF.js.
Решение 4: Ручное понижение версии с правильной конфигурацией
Если необходимо сохранить совместимость с более новыми возможностями Vue, рассмотрите этот подход:
// vue.config.js
module.exports = {
chainWebpack: config => {
config.module
.rule('js')
.include.add(/node_modules\/vue-pdf-embed/)
.end()
.use('babel-loader')
.loader('babel-loader')
.options({
presets: ['@babel/preset-env']
});
}
}
Альтернативные решения и лучшие практики
Вариант 1: Прямое использование PDF.js
Рассмотрите возможность использования PDF.js напрямую вместо обертки:
<template>
<div ref="pdfContainer"></div>
</template>
<script>
import * as pdfjsLib from 'pdfjs-dist';
pdfjsLib.GlobalWorkerOptions.workerSrc = '/path/to/pdf.worker.min.js';
export default {
props: ['src'],
async mounted() {
const loadingTask = pdfjsLib.getDocument(this.src);
const pdf = await loadingTask.promise;
// Логика рендеринга PDF
}
}
</script>
Вариант 2: Обработка PDF на стороне сервера
Для максимальной безопасности рассмотрите возможность обработки PDF на стороне сервера и предоставления только отрендеренного содержимого:
// Пример на стороне сервера с использованием pdf2pic
const pdf2pic = require('pdf2pic');
const fs = require('fs');
async function convertPdfToImage(pdfPath, outputPath) {
const options = {
density: 300,
saveFilename: 'output',
savePath: outputPath,
format: 'jpg',
width: 800,
height: 1120
};
const pdf2picInstance = new pdf2pic.Pdf2pic('pdf', options);
return pdf2picInstance.convertBulk(pdfPath, 1, 10);
}
Лучшие практики безопасности
- Изолируйте просмотр PDF в iframe с песочницей (sandboxing)
- Реализуйте политики безопасности содержимого (CSP) для ограничения выполнения JavaScript
- Проверяйте PDF-файлы перед обработкой
- Ограничьте скорость загрузки/обработки PDF
- Регулярно проводите аудит безопасности кода обработки PDF
Проверка и тестирование
Проверка исправления
После обновления убедитесь, что ваша версия безопасна:
import pdfjsLib from 'pdfjs-dist';
console.log(pdfjsLib.version); // Должно показать 4.2.67 или выше
Тест на уязвимость
Создайте тестовый PDF-файл и убедитесь, что выполнение JavaScript не происходит:
// Тестовый скрипт
import pdfjsLib from 'pdfjs-dist';
async function testPdfSecurity(pdfPath) {
try {
const loadingTask = pdfjsLib.getDocument(pdfPath);
const pdf = await loadingTask.promise;
console.log('PDF загружен без проблем безопасности');
} catch (error) {
console.error('Обнаружена проблема безопасности:', error);
}
}
Автоматизированное тестирование
Рассмотрите возможность реализации автоматизированного тестирования безопасности:
// Пример с использованием Jest
describe('Тесты безопасности PDF', () => {
it('не должен выполнять JavaScript из PDF', async () => {
// Реализация теста
});
});
Источники
- NVD - CVE-2024-4367
- SOCRadar - CVE-2024-4367 в PDF.js
- Codean Labs - Исследование CVE-2024-4367
- GitHub - CVE-2024-4367 POC
- InfoSec Writeups - Анализ CVE-2024-4367
- Сообщество PDF.js - Техническая поддержка
- Vulert - База данных CVE-2024-4367
Заключение
Устранение CVE-2024-4367 требует системного подхода, включающего обновление версий, правильную настройку и лучшие практики безопасности. Ключевые выводы:
- Обновите PDF.js до версии 4.2.67 или выше для исправления уязвимости
- Понизьте версию с pdfjs-dist ^5.4.394 до ^4.2.67, так как более новые версии содержат уязвимость
- Решите ошибки компиляции через правильную настройку webpack и babel
- Рассмотрите альтернативные подходы, такие как обработка PDF на стороне сервера для усиления безопасности
- Реализуйте дополнительные меры безопасности, такие как политики безопасности содержимого и песочница
Следуя этим шагам, вы можете обеспечить безопасность вашего Vue-приложения от CVE-2024-4367, сохраняя функциональность. Помните о регулярной проверке обновлений и исправлений безопасности для защиты от новых угроз.