НейроАгент

Обновление vue-pdf-embed для CVE-2024-4367: Полное руководство

Узнайте, как обновить библиотеку vue-pdf-embed для устранения уязвимости CVE-2024-4367. Пошаговое руководство с исправлениями конфигурации webpack и альтернативными решениями для безопасного просмотра PDF в приложениях Vue.js.

Как обновить библиотеку vue-pdf-embed для устранения уязвимости CVE-2024-4367?

Я пытаюсь обновить библиотеку vue-pdf-embed для устранения уязвимости CVE-2024-4367. Мой текущий package.json содержит следующие версии:

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 — это критическая уязвимость (CVSS 9.8) в PDF.js, которая позволяет выполнение произвольного JavaScript-кода из-за недостаточных проверок типа объекта FontMatrix в PDF-файлах [источник]. Уязвимость затрагивает:

  • Firefox < 126, Firefox ESR < 115.11 и Thunderbird < 115.11
  • Любое приложение, использующее версии PDF.js ниже 4.2.67
  • Миллионы веб-сайтов, которые встраивают функциональность просмотра PDF

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

Обновление зависимостей до безопасных версий

Рекомендуемые обновления версий

На основании результатов исследования, вот безопасные версии, до которых следует обновиться:

json
{
  "pdfjs-dist": "^4.2.67",
  "vue-pdf-embed": "^2.2.0",
  "vue": "^3.5.21"
}

Примечание: Исследования показывают, что последняя безопасная версия PDF.js — 4.2.67 или выше. Это значительное понижение версии по сравнению с вашей текущей версией (^5.4.394), но необходимое для обеспечения безопасности [источник].

Пошаговый процесс обновления

  1. Обновите package.json:

    json
    {
      "dependencies": {
        "pdfjs-dist": "^4.2.67",
        "vue-pdf-embed": "^2.2.0",
        "vue": "^3.5.21"
      }
    }
    
  2. Чистая установка:

    bash
    rm -rf node_modules package-lock.json
    npm install
    
  3. Проверьте версии:

    bash
    npm list pdfjs-dist vue-pdf-embed
    

Решение ошибок компиляции

Ошибка компиляции, с которой вы столкнулись, вероятно, вызвана несовместимостью версий или отсутствующей конфигурацией транспиляции. Вот решения:

Решение 1: Добавление конфигурации Webpack

Создайте или измените ваш файл vue.config.js:

javascript
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: Установка недостающих зависимостей

bash
npm install --save-dev @babel/core @babel/preset-env babel-loader

Решение 3: Альтернативный подход - использование форкнутого пакета

Если приведенные выше решения не работают, рассмотрите возможность использования форкнутого или альтернативного пакета:

bash
npm uninstall vue-pdf-embed
npm install vue-pdf-embed-secure

И используйте другой компонент просмотра PDF, который не полагается на уязвимые версии PDF.js.

Решение 4: Ручное понижение версии с правильной конфигурацией

Если необходимо сохранить совместимость с более новыми возможностями Vue, рассмотрите этот подход:

javascript
// 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 напрямую вместо обертки:

vue
<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 на стороне сервера и предоставления только отрендеренного содержимого:

javascript
// Пример на стороне сервера с использованием 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);
}

Лучшие практики безопасности

  1. Изолируйте просмотр PDF в iframe с песочницей (sandboxing)
  2. Реализуйте политики безопасности содержимого (CSP) для ограничения выполнения JavaScript
  3. Проверяйте PDF-файлы перед обработкой
  4. Ограничьте скорость загрузки/обработки PDF
  5. Регулярно проводите аудит безопасности кода обработки PDF

Проверка и тестирование

Проверка исправления

После обновления убедитесь, что ваша версия безопасна:

javascript
import pdfjsLib from 'pdfjs-dist';
console.log(pdfjsLib.version); // Должно показать 4.2.67 или выше

Тест на уязвимость

Создайте тестовый PDF-файл и убедитесь, что выполнение JavaScript не происходит:

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);
  }
}

Автоматизированное тестирование

Рассмотрите возможность реализации автоматизированного тестирования безопасности:

javascript
// Пример с использованием Jest
describe('Тесты безопасности PDF', () => {
  it('не должен выполнять JavaScript из PDF', async () => {
    // Реализация теста
  });
});

Источники

  1. NVD - CVE-2024-4367
  2. SOCRadar - CVE-2024-4367 в PDF.js
  3. Codean Labs - Исследование CVE-2024-4367
  4. GitHub - CVE-2024-4367 POC
  5. InfoSec Writeups - Анализ CVE-2024-4367
  6. Сообщество PDF.js - Техническая поддержка
  7. 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, сохраняя функциональность. Помните о регулярной проверке обновлений и исправлений безопасности для защиты от новых угроз.