fix(frontend): patch vulnerable browserslist dependency
pnpm audit по всему lock-графу остановил релизную сборку: browserslist@4.21.11 несёт high-advisory (уязвимы <= 4.28.6) и приходит транзитивно через autoprefixer и update-browserslist-db. Закрыто точечным pnpm.overrides на 4.28.7 — точной версией, а не диапазоном: security-патч обязан быть детерминированным и не тащить за собой чужой major. Обновилось только поддерево browserslist (caniuse-lite, electron-to-chromium, escalade, node-releases, update-browserslist-db); autoprefixer, Vite и остальной граф не тронуты. Проверено с pnpm 9.15.9 (contract из packageManager): pnpm why browserslist -> 4.28.7 pnpm audit --audit-level high -> 0, no known vulnerabilities pnpm install --frozen-lockfile -> lockfile is up to date typecheck + build:prod -> ok
This commit is contained in:
@@ -364,6 +364,18 @@ Hysteria-интеграции с официальной документацие
|
|||||||
тестом с настоящими сокетами, а гейт приёмки запрещает возврат `IsLoopback()`
|
тестом с настоящими сокетами, а гейт приёмки запрещает возврат `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 срабатывал на корректном коде.** Проверка «авторизация не
|
- **Гейт fail-open срабатывал на корректном коде.** Проверка «авторизация не
|
||||||
|
|||||||
@@ -72,7 +72,8 @@
|
|||||||
"brace-expansion": ">=1.1.18",
|
"brace-expansion": ">=1.1.18",
|
||||||
"picomatch": ">=2.3.2",
|
"picomatch": ">=2.3.2",
|
||||||
"js-yaml": ">=4.3.1",
|
"js-yaml": ">=4.3.1",
|
||||||
"table>ajv": ">=8.18.0"
|
"table>ajv": ">=8.18.0",
|
||||||
|
"browserslist": "4.28.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
|
|||||||
Generated
+39
-24
@@ -11,6 +11,7 @@ overrides:
|
|||||||
picomatch: '>=2.3.2'
|
picomatch: '>=2.3.2'
|
||||||
js-yaml: '>=4.3.1'
|
js-yaml: '>=4.3.1'
|
||||||
table>ajv: '>=8.18.0'
|
table>ajv: '>=8.18.0'
|
||||||
|
browserslist: 4.28.7
|
||||||
|
|
||||||
importers:
|
importers:
|
||||||
|
|
||||||
@@ -1175,6 +1176,11 @@ packages:
|
|||||||
resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
|
resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==}
|
||||||
engines: {node: 18 || 20 || >=22}
|
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:
|
boolbase@1.0.0:
|
||||||
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
|
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
|
||||||
|
|
||||||
@@ -1186,8 +1192,8 @@ packages:
|
|||||||
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
|
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
|
||||||
engines: {node: '>=8'}
|
engines: {node: '>=8'}
|
||||||
|
|
||||||
browserslist@4.21.11:
|
browserslist@4.28.7:
|
||||||
resolution: {integrity: sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==}
|
resolution: {integrity: sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==}
|
||||||
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
|
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
@@ -1209,6 +1215,9 @@ packages:
|
|||||||
caniuse-lite@1.0.30001539:
|
caniuse-lite@1.0.30001539:
|
||||||
resolution: {integrity: sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==}
|
resolution: {integrity: sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==}
|
||||||
|
|
||||||
|
caniuse-lite@1.0.30001810:
|
||||||
|
resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==}
|
||||||
|
|
||||||
chalk@2.4.2:
|
chalk@2.4.2:
|
||||||
resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
|
resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
|
||||||
engines: {node: '>=4'}
|
engines: {node: '>=4'}
|
||||||
@@ -1343,8 +1352,8 @@ packages:
|
|||||||
echarts@6.1.0:
|
echarts@6.1.0:
|
||||||
resolution: {integrity: sha512-q0yaFPggC9FUdsWH4blavRWFmxdrIodbkoKNAjJudAI6CA9gNPxHtV2RcZNEepZVlk4yvBYkOkbk6HIVpIyHZA==}
|
resolution: {integrity: sha512-q0yaFPggC9FUdsWH4blavRWFmxdrIodbkoKNAjJudAI6CA9gNPxHtV2RcZNEepZVlk4yvBYkOkbk6HIVpIyHZA==}
|
||||||
|
|
||||||
electron-to-chromium@1.4.529:
|
electron-to-chromium@1.5.420:
|
||||||
resolution: {integrity: sha512-6uyPyXTo8lkv8SWAmjKFbG42U073TXlzD4R8rW3EzuznhFS2olCIAfjjQtV2dV2ar/vRF55KUd3zQYnCB0dd3A==}
|
resolution: {integrity: sha512-2yD6XreGusOfNV+dUcvipJEXc3n/n7fgr7996aszTG+YY5E4mqM4tOq/3uhP129cazL9YHbVWSpc79ePotWtPA==}
|
||||||
|
|
||||||
element-plus@2.14.5:
|
element-plus@2.14.5:
|
||||||
resolution: {integrity: sha512-bghYy/S+qg87enHPXELirhEdDqsVAUGcGpbGIeG8dz0kwpIkGz7gYsifulBshXX74iRtHib85XWQj0uSH2A1Yg==}
|
resolution: {integrity: sha512-bghYy/S+qg87enHPXELirhEdDqsVAUGcGpbGIeG8dz0kwpIkGz7gYsifulBshXX74iRtHib85XWQj0uSH2A1Yg==}
|
||||||
@@ -1390,8 +1399,8 @@ packages:
|
|||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
escalade@3.1.1:
|
escalade@3.2.0:
|
||||||
resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
|
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
|
|
||||||
escape-string-regexp@1.0.5:
|
escape-string-regexp@1.0.5:
|
||||||
@@ -1865,8 +1874,9 @@ packages:
|
|||||||
node-fetch-native@1.6.7:
|
node-fetch-native@1.6.7:
|
||||||
resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
|
resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==}
|
||||||
|
|
||||||
node-releases@2.0.13:
|
node-releases@2.0.54:
|
||||||
resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==}
|
resolution: {integrity: sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==}
|
||||||
|
engines: {node: '>=18'}
|
||||||
|
|
||||||
normalize-path@3.0.0:
|
normalize-path@3.0.0:
|
||||||
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
|
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
|
||||||
@@ -2392,11 +2402,11 @@ packages:
|
|||||||
webpack:
|
webpack:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
update-browserslist-db@1.0.13:
|
update-browserslist-db@1.3.2:
|
||||||
resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
|
resolution: {integrity: sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
browserslist: '>= 4.21.0'
|
browserslist: 4.28.7
|
||||||
|
|
||||||
uri-js@4.4.1:
|
uri-js@4.4.1:
|
||||||
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
|
||||||
@@ -3435,7 +3445,7 @@ snapshots:
|
|||||||
|
|
||||||
autoprefixer@10.4.13(postcss@8.5.26):
|
autoprefixer@10.4.13(postcss@8.5.26):
|
||||||
dependencies:
|
dependencies:
|
||||||
browserslist: 4.21.11
|
browserslist: 4.28.7
|
||||||
caniuse-lite: 1.0.30001539
|
caniuse-lite: 1.0.30001539
|
||||||
fraction.js: 4.3.6
|
fraction.js: 4.3.6
|
||||||
normalize-range: 0.1.2
|
normalize-range: 0.1.2
|
||||||
@@ -3455,6 +3465,8 @@ snapshots:
|
|||||||
|
|
||||||
balanced-match@4.0.4: {}
|
balanced-match@4.0.4: {}
|
||||||
|
|
||||||
|
baseline-browser-mapping@2.11.20: {}
|
||||||
|
|
||||||
boolbase@1.0.0: {}
|
boolbase@1.0.0: {}
|
||||||
|
|
||||||
brace-expansion@5.0.9:
|
brace-expansion@5.0.9:
|
||||||
@@ -3465,12 +3477,13 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
fill-range: 7.1.1
|
fill-range: 7.1.1
|
||||||
|
|
||||||
browserslist@4.21.11:
|
browserslist@4.28.7:
|
||||||
dependencies:
|
dependencies:
|
||||||
caniuse-lite: 1.0.30001539
|
baseline-browser-mapping: 2.11.20
|
||||||
electron-to-chromium: 1.4.529
|
caniuse-lite: 1.0.30001810
|
||||||
node-releases: 2.0.13
|
electron-to-chromium: 1.5.420
|
||||||
update-browserslist-db: 1.0.13(browserslist@4.21.11)
|
node-releases: 2.0.54
|
||||||
|
update-browserslist-db: 1.3.2(browserslist@4.28.7)
|
||||||
|
|
||||||
cac@7.0.0: {}
|
cac@7.0.0: {}
|
||||||
|
|
||||||
@@ -3491,6 +3504,8 @@ snapshots:
|
|||||||
|
|
||||||
caniuse-lite@1.0.30001539: {}
|
caniuse-lite@1.0.30001539: {}
|
||||||
|
|
||||||
|
caniuse-lite@1.0.30001810: {}
|
||||||
|
|
||||||
chalk@2.4.2:
|
chalk@2.4.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
ansi-styles: 3.2.1
|
ansi-styles: 3.2.1
|
||||||
@@ -3609,7 +3624,7 @@ snapshots:
|
|||||||
tslib: 2.3.0
|
tslib: 2.3.0
|
||||||
zrender: 6.1.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)):
|
element-plus@2.14.5(vue@3.5.42(typescript@5.9.3)):
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3686,7 +3701,7 @@ snapshots:
|
|||||||
'@esbuild/win32-ia32': 0.28.2
|
'@esbuild/win32-ia32': 0.28.2
|
||||||
'@esbuild/win32-x64': 0.28.2
|
'@esbuild/win32-x64': 0.28.2
|
||||||
|
|
||||||
escalade@3.1.1: {}
|
escalade@3.2.0: {}
|
||||||
|
|
||||||
escape-string-regexp@1.0.5: {}
|
escape-string-regexp@1.0.5: {}
|
||||||
|
|
||||||
@@ -4134,7 +4149,7 @@ snapshots:
|
|||||||
|
|
||||||
node-fetch-native@1.6.7: {}
|
node-fetch-native@1.6.7: {}
|
||||||
|
|
||||||
node-releases@2.0.13: {}
|
node-releases@2.0.54: {}
|
||||||
|
|
||||||
normalize-path@3.0.0: {}
|
normalize-path@3.0.0: {}
|
||||||
|
|
||||||
@@ -4733,11 +4748,11 @@ snapshots:
|
|||||||
rollup: 4.63.1
|
rollup: 4.63.1
|
||||||
vite: 7.3.6(jiti@2.7.0)(sass@1.103.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:
|
dependencies:
|
||||||
browserslist: 4.21.11
|
browserslist: 4.28.7
|
||||||
escalade: 3.1.1
|
escalade: 3.2.0
|
||||||
picocolors: 1.0.0
|
picocolors: 1.1.1
|
||||||
|
|
||||||
uri-js@4.4.1:
|
uri-js@4.4.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|||||||
+25
@@ -218,6 +218,31 @@ bundle из кода, который не проходит проверку ти
|
|||||||
локальной работы обходить нечего: `go test ./...`, `govulncheck ./...` и
|
локальной работы обходить нечего: `go test ./...`, `govulncheck ./...` и
|
||||||
`pnpm audit` запускаются напрямую и tarball не создают.
|
`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.
|
||||||
|
|
||||||
### Тесты и типы
|
### Тесты и типы
|
||||||
|
|
||||||
Та же политика и по той же причине. Аварийного выхода у этого шага **нет**:
|
Та же политика и по той же причине. Аварийного выхода у этого шага **нет**:
|
||||||
|
|||||||
Reference in New Issue
Block a user