diff --git a/CHANGELOG.md b/CHANGELOG.md index a3cf796..ac3ddc7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -364,6 +364,18 @@ Hysteria-интеграции с официальной документацие тестом с настоящими сокетами, а гейт приёмки запрещает возврат `IsLoopback()` и требует негативного случая в тестах. +### Исправлено — зависимости frontend + +- **`browserslist@4.21.11` содержал high-advisory** (уязвимы `<= 4.28.6`) и + приходил транзитивно через `autoprefixer` и `update-browserslist-db`. Гейт + сборки отработал ровно так, как задуман: `pnpm audit` по всему lock-графу + остановил релиз до создания tarball. Закрыто точечным `pnpm.overrides` на + `4.28.7` — точной версией, а не диапазоном: security-патч обязан быть + детерминированным и не тащить за собой чужой major. Обновилось только + поддерево `browserslist` (`caniuse-lite`, `electron-to-chromium`, `escalade`, + `node-releases`, `update-browserslist-db`); `autoprefixer`, Vite и остальной + граф не тронуты. + ### Исправлено — гейты сборки - **Гейт fail-open срабатывал на корректном коде.** Проверка «авторизация не diff --git a/apps/frontend/package.json b/apps/frontend/package.json index c97b86e..1e07da4 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -72,7 +72,8 @@ "brace-expansion": ">=1.1.18", "picomatch": ">=2.3.2", "js-yaml": ">=4.3.1", - "table>ajv": ">=8.18.0" + "table>ajv": ">=8.18.0", + "browserslist": "4.28.7" } }, "engines": { diff --git a/apps/frontend/pnpm-lock.yaml b/apps/frontend/pnpm-lock.yaml index 26cc155..43ead38 100644 --- a/apps/frontend/pnpm-lock.yaml +++ b/apps/frontend/pnpm-lock.yaml @@ -11,6 +11,7 @@ overrides: picomatch: '>=2.3.2' js-yaml: '>=4.3.1' table>ajv: '>=8.18.0' + browserslist: 4.28.7 importers: @@ -1175,6 +1176,11 @@ packages: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} + baseline-browser-mapping@2.11.20: + resolution: {integrity: sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==} + engines: {node: '>=6.0.0'} + hasBin: true + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -1186,8 +1192,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.21.11: - resolution: {integrity: sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==} + browserslist@4.28.7: + resolution: {integrity: sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1209,6 +1215,9 @@ packages: caniuse-lite@1.0.30001539: resolution: {integrity: sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==} + caniuse-lite@1.0.30001810: + resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1343,8 +1352,8 @@ packages: echarts@6.1.0: resolution: {integrity: sha512-q0yaFPggC9FUdsWH4blavRWFmxdrIodbkoKNAjJudAI6CA9gNPxHtV2RcZNEepZVlk4yvBYkOkbk6HIVpIyHZA==} - electron-to-chromium@1.4.529: - resolution: {integrity: sha512-6uyPyXTo8lkv8SWAmjKFbG42U073TXlzD4R8rW3EzuznhFS2olCIAfjjQtV2dV2ar/vRF55KUd3zQYnCB0dd3A==} + electron-to-chromium@1.5.420: + resolution: {integrity: sha512-2yD6XreGusOfNV+dUcvipJEXc3n/n7fgr7996aszTG+YY5E4mqM4tOq/3uhP129cazL9YHbVWSpc79ePotWtPA==} element-plus@2.14.5: resolution: {integrity: sha512-bghYy/S+qg87enHPXELirhEdDqsVAUGcGpbGIeG8dz0kwpIkGz7gYsifulBshXX74iRtHib85XWQj0uSH2A1Yg==} @@ -1390,8 +1399,8 @@ packages: engines: {node: '>=18'} hasBin: true - escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-string-regexp@1.0.5: @@ -1865,8 +1874,9 @@ packages: node-fetch-native@1.6.7: resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} - node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + node-releases@2.0.54: + resolution: {integrity: sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==} + engines: {node: '>=18'} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -2392,11 +2402,11 @@ packages: webpack: optional: true - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + update-browserslist-db@1.3.2: + resolution: {integrity: sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==} hasBin: true peerDependencies: - browserslist: '>= 4.21.0' + browserslist: 4.28.7 uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -3435,7 +3445,7 @@ snapshots: autoprefixer@10.4.13(postcss@8.5.26): dependencies: - browserslist: 4.21.11 + browserslist: 4.28.7 caniuse-lite: 1.0.30001539 fraction.js: 4.3.6 normalize-range: 0.1.2 @@ -3455,6 +3465,8 @@ snapshots: balanced-match@4.0.4: {} + baseline-browser-mapping@2.11.20: {} + boolbase@1.0.0: {} brace-expansion@5.0.9: @@ -3465,12 +3477,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.21.11: + browserslist@4.28.7: dependencies: - caniuse-lite: 1.0.30001539 - electron-to-chromium: 1.4.529 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.21.11) + baseline-browser-mapping: 2.11.20 + caniuse-lite: 1.0.30001810 + electron-to-chromium: 1.5.420 + node-releases: 2.0.54 + update-browserslist-db: 1.3.2(browserslist@4.28.7) cac@7.0.0: {} @@ -3491,6 +3504,8 @@ snapshots: caniuse-lite@1.0.30001539: {} + caniuse-lite@1.0.30001810: {} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -3609,7 +3624,7 @@ snapshots: tslib: 2.3.0 zrender: 6.1.0 - electron-to-chromium@1.4.529: {} + electron-to-chromium@1.5.420: {} element-plus@2.14.5(vue@3.5.42(typescript@5.9.3)): dependencies: @@ -3686,7 +3701,7 @@ snapshots: '@esbuild/win32-ia32': 0.28.2 '@esbuild/win32-x64': 0.28.2 - escalade@3.1.1: {} + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -4134,7 +4149,7 @@ snapshots: node-fetch-native@1.6.7: {} - node-releases@2.0.13: {} + node-releases@2.0.54: {} normalize-path@3.0.0: {} @@ -4733,11 +4748,11 @@ snapshots: rollup: 4.63.1 vite: 7.3.6(jiti@2.7.0)(sass@1.103.1) - update-browserslist-db@1.0.13(browserslist@4.21.11): + update-browserslist-db@1.3.2(browserslist@4.28.7): dependencies: - browserslist: 4.21.11 - escalade: 3.1.1 - picocolors: 1.0.0 + browserslist: 4.28.7 + escalade: 3.2.0 + picocolors: 1.1.1 uri-js@4.4.1: dependencies: diff --git a/docs/build/02-build-layer-and-package.md b/docs/build/02-build-layer-and-package.md index 20fc1ee..6170d65 100644 --- a/docs/build/02-build-layer-and-package.md +++ b/docs/build/02-build-layer-and-package.md @@ -218,6 +218,31 @@ bundle из кода, который не проходит проверку ти локальной работы обходить нечего: `go test ./...`, `govulncheck ./...` и `pnpm audit` запускаются напрямую и tarball не создают. +#### Транзитивные зависимости чинятся точечным override + +Уязвимость обычно приходит не из прямой зависимости, а из чужого поддерева, и +поднимать ради неё весь frontend-граф не нужно. Такие случаи закрываются +списком `pnpm.overrides` в `apps/frontend/package.json`: + +| override | зачем | +| --- | --- | +| `lodash`, `lodash-es` | prototype pollution в старых ветках | +| `brace-expansion` | ReDoS | +| `picomatch` | ReDoS | +| `js-yaml` | разбор недоверенного YAML | +| `table>ajv` | уязвимая `ajv` в поддереве `table` | +| `browserslist` | high-advisory в `<= 4.28.6`; тянется через `autoprefixer` и `update-browserslist-db` | + +Правило записи значения: точная версия для security-патча (`4.28.7`), диапазон +`>=` — только там, где важна нижняя граница, а не конкретный релиз. Точная +версия делает граф детерминированным и не тащит вместе с патчем чужой major. + +Снимать override можно тогда, когда прямая зависимость сама поднялась выше +уязвимой границы, — и только после `pnpm why <пакет>`, показывающего, что старая +версия больше не приходит ни из одного поддерева. Просто «выглядит лишним» — не +основание: список существует ровно потому, что верхние пакеты обновляются +медленнее advisories. + ### Тесты и типы Та же политика и по той же причине. Аварийного выхода у этого шага **нет**: