fix(deps/site-finder): 19 уязвимых пакетов во фронт-локе — пересборка без правки package.json #3210

Merged
bot-backend merged 1 commit from fix/deps-sitefinder-frontend-cve into main 2026-08-29 10:55:26 +00:00
Collaborator

Лок не пересобирали с 3 июля (у «Меры» — 7 августа). Весь разрыв по уязвимостям между двумя фронтендами объясняется этим одним фактом.

package.json не тронут — все фиксы влезли в существующие каретки.

Измерение

OSV batch API по локу до и после:

пакетов в дереве уязвимых
до 1010 19
после 749 4

Главное: Next закрывается патчем, а не мажором

У next@15.5.15 висело 21 advisory, 10 из них HIGH — обходы middleware/proxy, SSRF в Server Actions и в rewrites, набор DoS. Максимальный fixed_in среди всех — 15.5.21, то есть все они закрываются внутри ветки 15.5.x.

Переход на Next 16 для безопасности не нужен. Это отдельная миграция (тянет eslint-config-next 16 → eslint 10 → flat config), и здесь её нет.

Что поднялось

пакет было стало почему
next / eslint-config-next 15.5.15 15.5.24 21 advisory
sharp 0.34.5 0.35.4 унаследованные дыры libvips
postcss 8.5.10 8.5.26 чтение произвольного .map по sourceMappingURL
nanoid 3.3.11 3.3.18 зацикливание генератора
js-yaml 4.1.1 4.3.2 квадратичный CPU на merge-key
form-data 4.0.5 4.0.6 CRLF-инъекция
brace-expansion 1.1.14/2.1.0/5.0.6 1.1.18 три DoS
@babel/core 7.29.0 7.29.7
@opentelemetry/core 2.7.1 2.10.0
echarts 6.0.0 6.1.0
@sentry/nextjs 10.53.1 10.72.0
tailwindcss + @tailwindcss/postcss 4.2.4 4.3.3
react / react-dom 19.2.5 19.2.8

Дерево схлопнулось на 261 пакет

1010 → 749. Это следствие двухмесячной давности лока, а не косметика — поэтому приёмка шла через полный npm ci с нуля, а не по диффу.

Приёмка

  • npm ci --legacy-peer-deps с нуля — проходит (566 пакетов).
  • npm run buildпроходит, Next 15.5.24 + tailwind 4.3.3 + sentry 10.72 отдают все маршруты.
  • npm run test локально — 13 падений в 4 файлах, все вида TypeError: Cannot read properties of undefined (reading 'getItem') в sessionId.ts:8, то есть localStorage undefined при определённом window.

Про эти 13: версии тестового стека в диффе не менялись — jsdom 25.0.1, vitest 2.1.9, vite 5.4.21, @testing-library/dom 10.4.1 остались теми же (менялся только @testing-library/react 16.3.2→16.3.3). Локально здесь node 26, jsdom 25 его старше; CI гоняет node 20. Считаю это локальным окружением, но гейт — CI, и если frontend-tests покраснеет, PR не мержится, а причина разбирается.

Что осталось открытым (не чинится здесь)

  • postcss 8.4.31 — Next вендорит его внутри своего node_modules, нашими средствами не поднять.
  • vitest 2.1.9 → vite 5.4.21 → esbuild 0.21.5 — dev-цепочка, требует мажора vitest. Отдельная задача (CRITICAL у vitest нам неприменим: @vitest/ui не установлен, скриптов с --ui нет).

Заметка для тех, кто повторит локально

npm 12 по умолчанию режет remote-загрузки (allow-remote=none) и спотыкается об опциональную @tailwindcss/oxide-wasm32-wasi. Обходится флагом --allow-remote=all на время команды. В CI npm 10 — там этого ограничения нет, в репозиторий ничего не добавлено.

Лок не пересобирали с **3 июля** (у «Меры» — 7 августа). Весь разрыв по уязвимостям между двумя фронтендами объясняется этим одним фактом. `package.json` **не тронут** — все фиксы влезли в существующие каретки. ## Измерение OSV batch API по локу до и после: | | пакетов в дереве | уязвимых | |---|---|---| | до | 1010 | **19** | | после | 749 | **4** | ## Главное: Next закрывается патчем, а не мажором У `next@15.5.15` висело **21 advisory, 10 из них HIGH** — обходы middleware/proxy, SSRF в Server Actions и в rewrites, набор DoS. Максимальный `fixed_in` среди всех — **15.5.21**, то есть все они закрываются внутри ветки 15.5.x. **Переход на Next 16 для безопасности не нужен.** Это отдельная миграция (тянет eslint-config-next 16 → eslint 10 → flat config), и здесь её нет. ## Что поднялось | пакет | было | стало | почему | |---|---|---|---| | next / eslint-config-next | 15.5.15 | 15.5.24 | 21 advisory | | sharp | 0.34.5 | 0.35.4 | унаследованные дыры libvips | | postcss | 8.5.10 | 8.5.26 | чтение произвольного `.map` по `sourceMappingURL` | | nanoid | 3.3.11 | 3.3.18 | зацикливание генератора | | js-yaml | 4.1.1 | 4.3.2 | квадратичный CPU на merge-key | | form-data | 4.0.5 | 4.0.6 | CRLF-инъекция | | brace-expansion | 1.1.14/2.1.0/5.0.6 | 1.1.18 | три DoS | | @babel/core | 7.29.0 | 7.29.7 | | | @opentelemetry/core | 2.7.1 | 2.10.0 | | | echarts | 6.0.0 | 6.1.0 | | | @sentry/nextjs | 10.53.1 | 10.72.0 | | | tailwindcss + @tailwindcss/postcss | 4.2.4 | 4.3.3 | | | react / react-dom | 19.2.5 | 19.2.8 | | ## Дерево схлопнулось на 261 пакет 1010 → 749. Это следствие двухмесячной давности лока, а не косметика — поэтому приёмка шла через полный `npm ci` с нуля, а не по диффу. ## Приёмка - `npm ci --legacy-peer-deps` с нуля — **проходит** (566 пакетов). - `npm run build` — **проходит**, Next 15.5.24 + tailwind 4.3.3 + sentry 10.72 отдают все маршруты. - `npm run test` локально — **13 падений в 4 файлах**, все вида `TypeError: Cannot read properties of undefined (reading 'getItem')` в `sessionId.ts:8`, то есть `localStorage` undefined при определённом `window`. Про эти 13: **версии тестового стека в диффе не менялись** — jsdom 25.0.1, vitest 2.1.9, vite 5.4.21, @testing-library/dom 10.4.1 остались теми же (менялся только `@testing-library/react` 16.3.2→16.3.3). Локально здесь node 26, jsdom 25 его старше; CI гоняет node 20. Считаю это локальным окружением, но **гейт — CI**, и если `frontend-tests` покраснеет, PR не мержится, а причина разбирается. ## Что осталось открытым (не чинится здесь) - `postcss 8.4.31` — Next вендорит его **внутри своего** `node_modules`, нашими средствами не поднять. - `vitest 2.1.9 → vite 5.4.21 → esbuild 0.21.5` — dev-цепочка, требует мажора vitest. Отдельная задача (CRITICAL у vitest нам неприменим: `@vitest/ui` не установлен, скриптов с `--ui` нет). ## Заметка для тех, кто повторит локально npm 12 по умолчанию режет remote-загрузки (`allow-remote=none`) и спотыкается об опциональную `@tailwindcss/oxide-wasm32-wasi`. Обходится флагом `--allow-remote=all` на время команды. В CI npm 10 — там этого ограничения нет, в репозиторий ничего не добавлено.
bot-backend added 1 commit 2026-08-29 10:47:31 +00:00
fix(deps/site-finder): 19 уязвимых пакетов во фронт-локе — пересборка без правки package.json
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 1m57s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 11s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Successful in 59s
0cf89dd5bb
Лок не пересобирали с 3 июля (у «Меры» — 7 августа), и весь разрыв по уязвимостям
между двумя фронтендами объясняется этим. Прогон OSV: было 19 уязвимых пакет-версий,
стало 4. package.json не тронут — все фиксы влезли в существующие каретки.

Главное — Next: у 15.5.15 висело 21 advisory, 10 из них HIGH (обходы middleware/
proxy, SSRF в Server Actions и rewrites, набор DoS). Максимальный fixed_in среди них
— 15.5.21, то есть ВСЕ закрываются внутри ветки 15.5.x. Переход на 16 для
безопасности не требуется, это отдельная миграция.

  next / eslint-config-next  15.5.15 -> 15.5.24
  sharp                      0.34.5  -> 0.35.4   унаследованные дыры libvips
  postcss                    8.5.10  -> 8.5.26   чтение произвольного .map по
                                                 sourceMappingURL
  nanoid                     3.3.11  -> 3.3.18
  js-yaml                    4.1.1   -> 4.3.2    квадратичный CPU на merge-key
  form-data                  4.0.5   -> 4.0.6    CRLF-инъекция
  brace-expansion            ...     -> 1.1.18   три DoS
  @babel/core                7.29.0  -> 7.29.7
  @opentelemetry/core        2.7.1   -> 2.10.0
  echarts                    6.0.0   -> 6.1.0
  @sentry/nextjs             10.53.1 -> 10.72.0
  tailwindcss + postcss-плагин 4.2.4 -> 4.3.3
  react / react-dom          19.2.5  -> 19.2.8

Дерево схлопнулось с 1010 до 749 пакетов — это следствие двухмесячной давности
лока, а не косметика, поэтому приёмка шла через полный npm ci, а не по диффу.

Остаются 4 и не чинятся здесь: postcss 8.4.31 Next вендорит ВНУТРИ своего
node_modules, а vitest 2.1.9 -> vite -> esbuild требуют мажора vitest — отдельная
задача.

Проверено локально: npm ci с нуля и npm run build проходят, сборка Next 15.5.24 +
tailwind 4.3.3 + sentry 10.72 отдаёт все маршруты. npm run test локально даёт 13
падений в 4 файлах (localStorage undefined при определённом window) — это jsdom 25
под здешним node 26; версии тестового стека в диффе НЕ менялись (jsdom 25.0.1,
vitest 2.1.9, vite 5.4.21 те же), CI гоняет node 20 и он тут гейт.

NB для тех, кто повторит локально: npm 12 по умолчанию режет remote-загрузки
(allow-remote=none) и спотыкается об опциональную @tailwindcss/oxide-wasm32-wasi.
Обходится флагом --allow-remote=all на время команды; в CI npm 10, там этого нет.
bot-backend merged commit cec1eaaa1e into main 2026-08-29 10:55:26 +00:00
bot-backend deleted branch fix/deps-sitefinder-frontend-cve 2026-08-29 10:55:26 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3210
No description provided.