From 0a3ee2d20ba6ba287a6d29665ec61e59f11fc8ad Mon Sep 17 00:00:00 2001 From: Corey Butler <770982+coreybutler@users.noreply.github.com> Date: Wed, 28 Oct 2026 23:06:49 -0500 Subject: [PATCH] docs: SIEM Event 120, InstallRoot, npx cooldown Launch logging is Event 120 nodejs.executed, not unused Event 200. Default InstallRoot is owner-writable. EOL aliases stay mirror-only. npx shares NpmModuleMinimumAge with npm. Signed-off-by: Corey Butler <770982+coreybutler@users.noreply.github.com> --- docs/_data/siemQueries.js | 18 +++++++++++------- docs/cfg/core.md | 2 +- docs/cfg/enterprise/registry.md | 8 ++++---- docs/command/package-manager-shims.md | 2 +- docs/features/author-mirror.md | 4 ++-- docs/features/modes.md | 2 +- docs/guide/builds/index.md | 4 ++-- docs/guide/security.md | 2 +- docs/guide/siem.md | 11 ++++++----- .../current/cfg/core.md | 2 +- .../current/cfg/enterprise/registry.md | 8 ++++---- .../current/command/package-manager-shims.md | 2 +- .../current/features/author-mirror.md | 4 ++-- .../current/features/modes.md | 2 +- .../current/guide/builds/index.md | 4 ++-- .../current/guide/security.md | 2 +- .../current/guide/siem.md | 12 ++++++------ 17 files changed, 47 insertions(+), 42 deletions(-) diff --git a/docs/_data/siemQueries.js b/docs/_data/siemQueries.js index 54a75ae..ac5402f 100644 --- a/docs/_data/siemQueries.js +++ b/docs/_data/siemQueries.js @@ -43,17 +43,21 @@ export const siemQueries = { wevtutilListsOnly: true, sentinel: `Event | where EventLog == "${CHANNEL}" -| where EventID == 200 -| summarize Launches = count() by tostring(EventData.NodeVersion), Computer +| where EventID == 120 +| where EventData.EventName == "nodejs.executed" +| extend Payload = parse_json(tostring(EventData.Payload)) +| summarize Launches = count() by tostring(Payload.NodeVersion), Computer | order by Launches desc`, - splunk: `index=wineventlog Channel="${CHANNEL}" EventCode=200 -| stats count as Launches by EventData.NodeVersion, Computer + splunk: `index=wineventlog Channel="${CHANNEL}" EventCode=120 EventData.EventName="nodejs.executed" +| eval Payload=json_decode(EventData.Payload) +| stats count as Launches by Payload.NodeVersion, Computer | sort -Launches`, elastic: `FROM logs-* -| WHERE winlog.channel == "${CHANNEL}" AND winlog.event_id == 200 -| STATS Launches = COUNT(*) BY version = winlog.event_data.NodeVersion, host = winlog.computer_name +| WHERE winlog.channel == "${CHANNEL}" AND winlog.event_id == 120 AND winlog.event_data.EventName == "nodejs.executed" +| EVAL Payload = TO_JSON(winlog.event_data.Payload) +| STATS Launches = COUNT(*) BY version = Payload.NodeVersion, host = winlog.computer_name | SORT Launches DESC`, - wevtutil: `wevtutil qe "${CHANNEL}" /q:"*[System[(EventID=200)]]" /f:text /c:20`, + wevtutil: `wevtutil qe "${CHANNEL}" /q:"*[System[(EventID=120)] and EventData[Data[@Name='EventName']='nodejs.executed']]" /f:text /c:20`, }, nodejsExecuted: { wevtutilListsOnly: true, diff --git a/docs/cfg/core.md b/docs/cfg/core.md index 9503f79..da0d1ba 100644 --- a/docs/cfg/core.md +++ b/docs/cfg/core.md @@ -28,7 +28,7 @@ Use `nvm config docs --json` for machine-readable metadata. | Option | Default | Values | Description | |--------|---------|--------|-------------| | `mode` | `shim` | `shim`, `link` | Specifies how Node.js commands and versions are managed, either through shim-based routing or direct junction/symlink linking. Same as `nvm use shim`/`nvm use link`. See [Operating Modes](../features/modes). | -| `root` | `%LOCALAPPDATA%\Author Software\nvm\installs` | Directory path | Root directory where Node.js versions are installed. Changing this does not move existing installs; migrate files yourself or reinstall versions. Windows, Program Files, profile folders, the NVM program folder, and parents of those paths are refused (**NVM4313**). | +| `root` | `%LOCALAPPDATA%\Author Software\nvm\installs` | Directory path | Root directory where Node.js versions are installed. Default path is writable by the installing user. Other users cannot write it (**NVM4305**). Set `InstallRoot` to a locked directory when versions must be immutable. Changing this does not move existing installs; migrate files yourself or reinstall versions. Windows, Program Files, profile folders, the NVM program folder, and parents of those paths are refused (**NVM4313**). | ## Downloads and mirrors diff --git a/docs/cfg/enterprise/registry.md b/docs/cfg/enterprise/registry.md index eb97cf4..72b11e1 100644 --- a/docs/cfg/enterprise/registry.md +++ b/docs/cfg/enterprise/registry.md @@ -50,7 +50,7 @@ See [Administrative Templates](ad) for GPO and Intune deployment. Download ADMX/ |**Disable version management**|`Enabled`|**Overridable** (`nvm on`/`nvm off`). Forces version management on or off. When off, NVM does not manage or redirect Node.js commands.

- `0` = off (`nvm off`)
- `1` = on

Default: `1`

`REG_DWORD`| |**Enforce permission model**|`EnforcePermissionModel`|**Overridable** (`enforce_permission_model`). Node shim prepends Node permission-model flag on `node` launches (shim-only). When `1`, the package-manager proxy also merges the same flag and `DefaultPermissionGrants` into `npm_config_node_options` for npm/npx/pnpm lifecycle scripts. npm-cli.js itself is not launched under `--permission`. Yarn, bun, corepack, and vlt are not covered. Does not set `NODE_OPTIONS`. Default-deny FS/network unless the process passes `--allow-*` at runtime. NVM does not inject `--allow-*` grants except `DefaultPermissionGrants`. NVM never injects `--permission-audit` (Node 25.8+ report-only). There is no policy that forces `--permission-audit`.

- Node 23+: `--permission`
- Node 20–22: `--experimental-permission`
- Node <20: no flag (unsupported)

- HKLM Policies `1`: strip caller `--permission-audit` (and `--permission-audit` already in `npm_config_node_options`) and inject `--permission` / `--experimental-permission`. Filter `--allow-*` even if the caller already passed `--permission`.
- Preference-only `1`: caller `--permission-audit` is a debug exception for `node` (no inject). Proxy still merges `--permission` into `npm_config_node_options` without stripping existing tokens.

- `0` = off (no env write)
- `1` = on

Default: `0`

`REG_DWORD`| |**Freeze V8 global objects**|`FreezeV8GlobalObjects`|**Overridable** (`freeze_v8_global_objects`). Node shim prepends `--frozen-intrinsics` so built-in prototypes cannot be patched (shim-only; Node.js 12+). When `1`, the package-manager proxy also merges this flag into `npm_config_node_options` for npm/npx/pnpm lifecycle scripts. Yarn, bun, corepack, and vlt are not covered. Does not set `NODE_OPTIONS`. Adds measurable startup cost.

- `0` = off (no env write)
- `1` = on

Default: `0`

`REG_DWORD`| -|**Install root**|`InstallRoot`|**Overridable** (`root`). Directory where Node.js versions are stored. Overrides machine and user preferences.

Default: `%LOCALAPPDATA%\Author Software\nvm\installs`

`REG_SZ`| +|**Install root**|`InstallRoot`|**Overridable** (`root`). Directory where Node.js versions are stored. Overrides machine and user preferences.

Default: `%LOCALAPPDATA%\Author Software\nvm\installs`. That directory is writable by the installing user. Other users cannot write it (**NVM4305**). Set this key to a locked directory when versions must be immutable (Governance).

`REG_SZ`| |**Local install source**|`LocalInstallDir`|**Overridable** (`local_dir`). Alternate local directory for Node.js archives (air-gapped mirrors). Overrides cache.

`REG_SZ`| |**Local install only**|`LocalInstallOnly`|**Overridable** (`local_install_only`). Restrict installs to `LocalInstallDir` only.

- `0` = off
- `1` = on

Default: `0`

`REG_DWORD`| |**Audit logging**|`LogExecutions`|**Overridable** (`log_executions`). Log every Node.js invocation to the Windows Event Log (shim-only). Most useful on **Audit+** (structured ETW).

- `0` = off
- `1` = on

Default: `0`

`REG_DWORD`| @@ -77,9 +77,9 @@ These keys are part of the **Governance** feature set. They appear in the Govern |**Verbose mirror license metadata**|`ApplyVerboseLicenseMetadata`|When on, Author mirror license JWTs include identity claims (`idp_username`, `idp_machine_name`, `idp_machine_id`). Does not set `AccessToken`/`AccessKey`.

- `0` = omit claims
- `1` = include claims

Default: `0`

`REG_DWORD`| |**Verbose firewall policy metadata**|`ApplyVerboseFirewallMetadata`|When on, HTTPS firewall policy JWTs include verbose identity claims (`idp_*`) plus npm/pnpm/yarn profile/config when available.

- `0` = omit extra claims
- `1` = include claims

Default: `0`

`REG_DWORD`| |**Skip lockfile for module firewall**|`FirewallSkipLockfile`|When on, module firewall uses `package.json` only (ignores lockfiles for local matching and HTTPS POST bodies).

- `0` = use lockfile when present (default)
- `1` = skip lockfile

`REG_DWORD`| -|**npm module minimum age**|`NpmModuleMinimumAge`|Minimum package publish age (cooldown), in minutes, for package manager installs (shim mode). Auto-converts for npm/pnpm/yarn.

Default: Community `0` (disabled). Certified Builds `2880` (2 days) when the key is unset. `nvm config` and CLI `--min-release-age` still override the Certified default. When HKLM Policies sets this key, the value is forced and the shim strips `--min-release-age`, `--minimum-release-age`, `--config.min-release-age`, `--no-time-gate`, and `--bypass-age-policy` (arguments after `--` stay). DWORD `0` forces the gate off.

`REG_DWORD`| -|**Allowed Node.js versions**|`VersionAllowList`|Allow list for `nvm install`, `nvm use`, and the Certified shim. Community ACL is a no-op at install and at use/shim. Invalid entries fail enforcement. Allow wins over block. Also feeds Author-mirror JWT version claims (magic tokens such as `EOL`, `ALPHA`, `MAINTENANCE`, `ALL`).

Supports exact semver, wildcards (e.g. `20.x`), aliases, and `NOT`/`!` negation (one rule per line).

`REG_SZ`| -|**Blocked Node.js versions**|`VersionBlockList`|Block list for `nvm install`, `nvm use`, and the Certified shim. Same rule formats as `VersionAllowList`.

`REG_SZ`| +|**npm module minimum age**|`NpmModuleMinimumAge`|Minimum package publish age (cooldown), in minutes, for package manager installs (shim mode). Auto-converts for npm/npx/pnpm/yarn. bun/bunx/corepack/vlt are not covered.

Default: Community `0` (disabled) — same as stock npm/npx with no version manager. Certified Builds `2880` (2 days) when the key is unset, including npx. `nvm config` and CLI `--min-release-age` still override the Certified default. When HKLM Policies sets this key, the value is forced and the shim strips `--min-release-age`, `--minimum-release-age`, `--config.min-release-age`, `--no-time-gate`, and `--bypass-age-policy` (arguments after `--` stay). DWORD `0` forces the gate off.

`REG_DWORD`| +|**Allowed Node.js versions**|`VersionAllowList`|Allow list for `nvm install`, `nvm use`, and the Certified shim. Community ACL is a no-op at install and at use/shim. Invalid entries fail enforcement. Allow wins over block when both lists come from the same source. The Certified shim loads allow and block as a pair from the first source that has either key (HKLM Policies, then remaining sources). A user HKCU allow list cannot override an HKLM Policies block list. CLI `nvm install` / `nvm use` on Certified Builds read **HKLM Policies only**. Unmanaged Certified still honors `nvm config` lists at shim launch when no GPO lists exist. Also feeds Author-mirror JWT version claims (magic tokens such as `EOL`, `ALPHA`, `MAINTENANCE`, `ALL`). Those magic tokens are ignored locally at install, use, and shim launch.

Supports exact semver, wildcards (e.g. `20.x`), aliases, and `NOT`/`!` negation (one rule per line).

`REG_SZ`| +|**Blocked Node.js versions**|`VersionBlockList`|Block list for `nvm install`, `nvm use`, and the Certified shim. Same rule formats and same-source pairing as `VersionAllowList`.

`REG_SZ`| :::info[License secrets] `AccessToken`, `AccessKey`, and `JwksCose` are **not** ADMX policies. Deploy with portal scripts (`Set-NvmWindowsAccessToken.ps1` on stock certified build; `Set-NvmWindowsLicensing.ps1` for governance builds, which also sets `AccessKey` for Author mirrors) or `nvm license`. diff --git a/docs/command/package-manager-shims.md b/docs/command/package-manager-shims.md index ac5b190..4ee9b0a 100644 --- a/docs/command/package-manager-shims.md +++ b/docs/command/package-manager-shims.md @@ -21,7 +21,7 @@ Global CLIs installed with those managers (for example `tsc`) use the same `prox 4. For `bun` / `bunx`, find the installed bun binary, run malware checks on package-manager commands, spawn bun, and stop. For other names, resolve Node.js (preference / detection / `--nvm-use`) and optionally auto-install. 5. Check the version directory is safe (not a reparse point, not cross-user writable) — failure → **NVM4305**. 6. Locate the delegated command under the Node install (`.exe`, then `.cmd`, then `.bat`). -7. Enforce package-manager constraints when policy applies (npm / npx / pnpm / yarn). HKLM `BlockPackageManagerLifecycleScripts` forces `--ignore-scripts` or `YARN_ENABLE_SCRIPTS=false`. Certified Builds with Advanced Logging write **NVM4412** for install-class commands only. +7. Enforce package-manager constraints when policy applies (npm / npx / pnpm / yarn). `NpmModuleMinimumAge` maps to each manager's native cooldown, including npx (`npm_config_min_release_age`). Community default is off (`0`). Certified default is 2880 minutes (2 days) when the key is unset. HKLM `BlockPackageManagerLifecycleScripts` forces `--ignore-scripts` or `YARN_ENABLE_SCRIPTS=false`. Certified Builds with Advanced Logging write **NVM4412** for install-class commands only. 8. When `EnforcePermissionModel`, `FreezeV8GlobalObjects`, or `DisableEvalAndStringExecution` is on, merge those Node flags into `npm_config_node_options` for npm/npx/pnpm so lifecycle scripts inherit them. Default off: no env write. Does not set `NODE_OPTIONS`. Yarn, bun, corepack, and vlt are skipped. npm-cli.js itself is not launched under `--permission`. 9. Verify trust of `node.exe` and the delegated target (below). 10. Spawn the real tool (for npm/npx/corepack: often `node.exe` + `*-cli.js`; otherwise the `.exe` / `.cmd`). diff --git a/docs/features/author-mirror.md b/docs/features/author-mirror.md index b323fca..197b87c 100644 --- a/docs/features/author-mirror.md +++ b/docs/features/author-mirror.md @@ -67,7 +67,7 @@ There are two (combinable) ways to enforce dynamic policies on the Author mirror | Policy entry | Local client | Author mirror (`mirror.author.io`) | Public mirror (`nodejs.org`) | |:-|:-|:-|:-| | `16.x` on block list | Denied before download | Not reached | Not reached | -| `EOL` on block list | Allowed locally (alias ignored) | Denied if version is end-of-life | No Author JWT — not enforced | +| `EOL` on block list | Allowed locally (alias ignored at install, `nvm use`, and shim launch) | Denied if version is end-of-life | No Author JWT — not enforced | | Allow `20.x` only (no magic) | Non-20 denied locally | — | — | @@ -80,7 +80,7 @@ VersionAllowList=20.x What this does: -1. **Locally:** `20.x` / `22.x` match the allow list. `EOL` is not expanded, so an end-of-life release is **not** stopped on the client by that alias alone. Because a dynamic alias is present, the allow list is also **not** treated as exclusive: other versions can still pass the local check. +1. **Locally:** `20.x` / `22.x` match the allow list. `EOL` is not expanded, so an end-of-life release is **not** stopped on the client by that alias alone — including `nvm use` and Certified shim launch of an already-installed copy. Because a dynamic alias is present, the allow list is also **not** treated as exclusive: other versions can still pass the local check. 1. **On `mirror.author.io`:** the client sends a license claim derived from these lists (including `NOT EOL`). The mirror rejects end-of-life archives. 1. **On `nodejs.org` (or any non-Author mirror):** no Author JWT — `EOL` does nothing. Put Author first in [`node_mirror`](../cfg/core#downloads-and-mirrors), or add static blocks (for example `16.x`) if you must enforce without the Author mirror. diff --git a/docs/features/modes.md b/docs/features/modes.md index 50f5cc7..b2e03e6 100644 --- a/docs/features/modes.md +++ b/docs/features/modes.md @@ -55,7 +55,7 @@ Shim mode features: - Lockdown Node.js/V8 permissions. (Optional) _Requires Certified Builds with the Governance add-on._ - Publisher trust: Verifies node.exe publisher to prevent untrusted node.exe swaps. - Native event logging. -- Unified/configurable cooldown periods across all major package managers (npm/yarn/pnpm). _Requires the Governance add-on, available September 2026._ +- Unified/configurable cooldown periods across all major package managers (npm/npx/yarn/pnpm). _Requires the Governance add-on, available September 2026._ :::tip[Certified Builds] Shim **V8 / permission lockdown** (`EnforcePermissionModel`, `FreezeV8GlobalObjects`, `DisableEvalAndStringExecution`) and package-manager **cooldown** are Governance features. See [registry policy](../cfg/registry) and [Choosing an Edition](../guide/builds/). diff --git a/docs/guide/builds/index.md b/docs/guide/builds/index.md index ae0d0da..869e8c9 100644 --- a/docs/guide/builds/index.md +++ b/docs/guide/builds/index.md @@ -40,7 +40,7 @@ Additional capabilties are available as add-ons: |:-|:-| |**Advanced Logging**|Structured logging for SIEM integration.| |**Trust Artifacts**|SBOM, provenance, and VEX reports.| -|**Governance**|Central policy management (ADMX/ADML + GPO/Entra scripts), advanced proxy support (IWA, WPAD/PAC), Node.js mirror (mirror.author.io), version firewall, shim-enforced Node.js permissions, unified package manager cooldown (npm/pnpm/yarn), and air-gap/local installations.| +|**Governance**|Central policy management (ADMX/ADML + GPO/Entra scripts), advanced proxy support (IWA, WPAD/PAC), Node.js mirror (mirror.author.io), version firewall, shim-enforced Node.js permissions, unified package manager cooldown (npm/npx/pnpm/yarn), and air-gap/local installations.| ### Code Signing Authority @@ -70,7 +70,7 @@ The Governance package for certified builds introduce policy management. With th - Utilize corporate proxies (IWA, PAC/WPAD). - Block unapproved Node.js Versions (i.e. EOL, vulnerable, or unstable versions). -- Require custom npm/yarn/pnpm cooldown periods. +- Require custom npm/npx/yarn/pnpm cooldown periods. - Enforce Node.js permission model (`--permission` / `--experimental-permission`) so shimmed `node` starts default-deny; npm/npx/pnpm lifecycle scripts inherit the same flags via `npm_config_node_options` when the policy is on. Apps must pass `--allow-*` at runtime. - Freeze V8 intrinsics (`--frozen-intrinsics`) to prevent prototype pollution of built-ins (also applied to npm/npx/pnpm scripts when the policy is on). - Disallow `eval()` / `new Function()` (`--disallow-code-generation-from-strings`) (also applied to npm/npx/pnpm scripts when the policy is on). diff --git a/docs/guide/security.md b/docs/guide/security.md index 53e45e7..46a03aa 100644 --- a/docs/guide/security.md +++ b/docs/guide/security.md @@ -168,7 +168,7 @@ sequenceDiagram ## 3. Package managers and modules -Through `proxy.exe`, NVM can apply **Governance** package-manager controls such as [`NpmModuleMinimumAge`](../cfg/registry#governance-keys) (cooldown / minimum publish age for npm, pnpm, and yarn). Community defaults to off. Certified Builds default to 2 days (2880 minutes) when the key is unset. HKLM Policies forces the value and strips CLI age-override flags. +Through `proxy.exe`, NVM can apply **Governance** package-manager controls such as [`NpmModuleMinimumAge`](../cfg/registry#governance-keys) (cooldown / minimum publish age for npm, npx, pnpm, and yarn). Community defaults to off (`0`), matching stock npm/npx with no version manager. Certified Builds default to 2 days (2880 minutes) when the key is unset, including npx. HKLM Policies forces the value and strips CLI age-override flags. Certified Builds also enforce the **[NVM Firewall](firewall)** module allow lists (`ApprovedModules` / `ApprovedGlobalModules`) on shimmed installs, and both editions support the **trust firewall** (`TrustedModules`) so approved self-updating global CLIs can auto-reshim after they rewrite their entrypoints. diff --git a/docs/guide/siem.md b/docs/guide/siem.md index 37e749b..a546f51 100644 --- a/docs/guide/siem.md +++ b/docs/guide/siem.md @@ -43,6 +43,7 @@ There is a full list of [Error Codes](../troubleshooting/error-codes) (and expla | Structured info, warning, or error | Event ID **120**, **121**, or **122** | | An NVM code | `Code` (number only) | | A named lifecycle or audit event | `EventName`, then parse `Payload` as JSON | +| Each `node.exe` launch | Event ID **120** `nodejs.executed` when `log_executions` is on. Event **200** unused. | |Field|Detail| |:-|:-| @@ -65,12 +66,12 @@ Collectors flatten EventData in different ways. Use the names your platform crea ### Node.js versions in use -Event ID **200** records each shim launch when `log_executions` is on. -This Event ID does not need Advanced Logging. +Event ID **120** `nodejs.executed` records each shim launch when `log_executions` is on. +`Payload.NodeVersion` is the version. Event ID **200** is unused. -With Advanced Logging, the structured form is `nodejs.executed` on Event ID **120**. +Host count for the same event: @@ -143,12 +144,12 @@ It is not the NVM number. | 120 | structured info | `Source`, `EventName`, `Payload`, `Code` | | 121 | structured warning | `Source`, `EventName`, `Payload`, `Code` | | 122 | structured error | `Source`, `EventName`, `Payload`, `Code` | -| 200 | shim execution | `RequestedCommand`, `ResolvedPath`, `NodeVersion`, `Arguments`, `WorkingDirectory` | +| 200 | unused | Manifest leftover. Launch logging is Event ID **120** `nodejs.executed`. | | 210 | shim info | `Source`, `Message`, `Code` | | 211 | shim warning | `Source`, `Message`, `Code` | | 212 | shim error | `Source`, `Message`, `Code` | -Event ID **200** has no `Code` field. +Event ID **200** is unused. Launch logging uses Event ID **120**. Security events from the shims include `user`, `sid`, `hostname`, `parent_process`, `parent_pid`, `project_name`, and `project_path` when the process can resolve them. An empty value is `unknown`. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cfg/core.md b/i18n/ru/docusaurus-plugin-content-docs/current/cfg/core.md index a7a8179..e614836 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cfg/core.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cfg/core.md @@ -28,7 +28,7 @@ nvm config docs | Параметр | По умолчанию | Значения | Описание | |--------|---------|--------|-------------| | `mode` | `shim` | `shim`, `link` | Определяет, как управляются команды и версии Node.js: через маршрутизацию shim или прямые junction/symlink. То же, что `nvm use shim`/`nvm use link`. См. [Режимы работы](../features/modes). | -| `root` | `%LOCALAPPDATA%\Author Software\nvm\installs` | Путь к каталогу | Корневой каталог установки версий Node.js. Изменение не переносит существующие установки — перенесите файлы вручную или переустановите версии. Windows, Program Files, папки профиля, папка программы NVM и родители этих путей отклоняются (**NVM4313**). | +| `root` | `%LOCALAPPDATA%\Author Software\nvm\installs` | Путь к каталогу | Корневой каталог установки версий Node.js. Путь по умолчанию доступен для записи устанавливающему пользователю. Другие пользователи писать не могут (**NVM4305**). Задайте `InstallRoot` в заблокированный каталог, если версии должны быть неизменяемыми. Изменение не переносит существующие установки — перенесите файлы вручную или переустановите версии. Windows, Program Files, папки профиля, папка программы NVM и родители этих путей отклоняются (**NVM4313**). | ## Загрузки и зеркала \{#downloads-and-mirrors} diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/cfg/enterprise/registry.md b/i18n/ru/docusaurus-plugin-content-docs/current/cfg/enterprise/registry.md index 2ccf91c..63214de 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/cfg/enterprise/registry.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/cfg/enterprise/registry.md @@ -55,7 +55,7 @@ certified: |**Disable version management**|`Enabled`|**Overridable** (`nvm on`/`nvm off`). Принудительно включает или отключает управление версиями. При выкл. NVM не управляет и не перенаправляет команды Node.js.

- `0` = выкл. (`nvm off`)
- `1` = вкл.

По умолчанию: `1`

`REG_DWORD`| |**Enforce permission model**|`EnforcePermissionModel`|**Overridable** (`enforce_permission_model`). Node shim добавляет флаг permission model Node при запуске `node` (только shim). При `1` proxy также вписывает тот же флаг и `DefaultPermissionGrants` в `npm_config_node_options` для lifecycle-скриптов npm/npx/pnpm. npm-cli.js сам не запускается под `--permission`. Yarn, bun, corepack и vlt не покрыты. `NODE_OPTIONS` не задаётся. Запрет FS/сети по умолчанию, если процесс не передаёт `--allow-*` во время выполнения. NVM не добавляет grants `--allow-*`, кроме `DefaultPermissionGrants`. NVM никогда не внедряет `--permission-audit` (Node 25.8+, только отчёт). Политики не форсируют `--permission-audit`.

- Node 23+: `--permission`
- Node 20–22: `--experimental-permission`
- Node <20: без флага (не поддерживается)

- HKLM Policies `1`: удаляет `--permission-audit` у вызывающего (и из `npm_config_node_options`) и внедряет `--permission` / `--experimental-permission`. Фильтрует `--allow-*`, даже если вызывающий уже передал `--permission`.
- Только Preferences `1`: `--permission-audit` — отладочное исключение для `node` (без внедрения). Proxy всё равно вписывает `--permission` в `npm_config_node_options` без удаления существующих токенов.

- `0` = выкл. (без записи env)
- `1` = вкл.

По умолчанию: `0`

`REG_DWORD`| |**Freeze V8 global objects**|`FreezeV8GlobalObjects`|**Overridable** (`freeze_v8_global_objects`). Node shim добавляет `--frozen-intrinsics`, чтобы встроенные прототипы нельзя было изменять (только shim; Node.js 12+). При `1` proxy также вписывает этот флаг в `npm_config_node_options` для lifecycle-скриптов npm/npx/pnpm. Yarn, bun, corepack и vlt не покрыты. `NODE_OPTIONS` не задаётся. Увеличивает время запуска.

- `0` = выкл. (без записи env)
- `1` = вкл.

По умолчанию: `0`

`REG_DWORD`| -|**Install root**|`InstallRoot`|**Overridable** (`root`). Каталог хранения версий Node.js. Переопределяет настройки машины и пользователя.

По умолчанию: `%LOCALAPPDATA%\Author Software\nvm\installs`

`REG_SZ`| +|**Install root**|`InstallRoot`|**Overridable** (`root`). Каталог хранения версий Node.js. Переопределяет настройки машины и пользователя.

По умолчанию: `%LOCALAPPDATA%\Author Software\nvm\installs`. Этот каталог доступен для записи устанавливающему пользователю. Другие пользователи писать не могут (**NVM4305**). Задайте этот ключ в заблокированный каталог, если версии должны быть неизменяемыми (Governance).

`REG_SZ`| |**Local install source**|`LocalInstallDir`|**Overridable** (`local_dir`). Альтернативный локальный каталог архивов Node.js (air-gapped зеркала). Переопределяет кэш.

`REG_SZ`| |**Local install only**|`LocalInstallOnly`|**Overridable** (`local_install_only`). Ограничить установки только `LocalInstallDir`.

- `0` = выкл.
- `1` = вкл.

По умолчанию: `0`

`REG_DWORD`| |**Audit logging**|`LogExecutions`|**Overridable** (`log_executions`). Журналировать каждый вызов Node.js в журнал событий Windows (только shim). Наиболее полезно на **Audit+** (структурированный ETW).

- `0` = выкл.
- `1` = вкл.

По умолчанию: `0`

`REG_DWORD`| @@ -76,9 +76,9 @@ certified: |**Verbose mirror license metadata**|`ApplyVerboseLicenseMetadata`|Если включено, JWT лицензии зеркала Author включают identity claims (`idp_username`, `idp_machine_name`, `idp_machine_id`). Не задаёт `AccessToken`/`AccessKey`.

- `0` = без claims
- `1` = с claims

По умолчанию: `0`

`REG_DWORD`| |**Verbose firewall policy metadata**|`ApplyVerboseFirewallMetadata`|Если включено, JWT HTTPS firewall policy включают verbose identity claims (`idp_*`) плюс npm/pnpm/yarn profile/config при наличии.

- `0` = без доп. claims
- `1` = с claims

По умолчанию: `0`

`REG_DWORD`| |**Skip lockfile for module firewall**|`FirewallSkipLockfile`|Если включено, module firewall использует только `package.json` (игнорирует lockfile для локальной проверки и HTTPS POST).

- `0` = использовать lockfile при наличии (по умолчанию)
- `1` = пропустить lockfile

`REG_DWORD`| -|**npm module minimum age**|`NpmModuleMinimumAge`|Минимальный возраст публикации пакета (cooldown) в минутах для установок через менеджеры пакетов (режим shim). Автоконвертация для npm/pnpm/yarn.

По умолчанию: Community `0` (отключено). Certified Builds `2880` (2 дня), если ключ не задан. `nvm config` и CLI `--min-release-age` всё ещё перекрывают значение по умолчанию Certified. Когда HKLM Policies задаёт ключ, значение принудительно, и shim удаляет `--min-release-age`, `--minimum-release-age`, `--config.min-release-age`, `--no-time-gate` и `--bypass-age-policy` (аргументы после `--` сохраняются). DWORD `0` принудительно отключает gate.

`REG_DWORD`| -|**Allowed Node.js versions**|`VersionAllowList`|Allow list для `nvm install`, `nvm use` и Certified shim. Community ACL — no-op при install и при use/shim. Недопустимые записи ломают enforcement. Allow побеждает block. Также питает version claims JWT Author mirror (magic tokens вроде `EOL`, `ALPHA`, `MAINTENANCE`, `ALL`).

Поддерживает exact semver, wildcards (например, `20.x`), псевдонимы и negation `NOT`/`!` (одно правило на строку).

`REG_SZ`| -|**Blocked Node.js versions**|`VersionBlockList`|Block list для `nvm install`, `nvm use` и Certified shim. Те же форматы правил, что у `VersionAllowList`.

`REG_SZ`| +|**npm module minimum age**|`NpmModuleMinimumAge`|Минимальный возраст публикации пакета (cooldown) в минутах для установок через менеджеры пакетов (режим shim). Автоконвертация для npm/npx/pnpm/yarn. bun/bunx/corepack/vlt не покрыты.

По умолчанию: Community `0` (отключено) — как stock npm/npx без version manager. Certified Builds `2880` (2 дня), если ключ не задан, включая npx. `nvm config` и CLI `--min-release-age` всё ещё перекрывают значение по умолчанию Certified. Когда HKLM Policies задаёт ключ, значение принудительно, и shim удаляет `--min-release-age`, `--minimum-release-age`, `--config.min-release-age`, `--no-time-gate` и `--bypass-age-policy` (аргументы после `--` сохраняются). DWORD `0` принудительно отключает gate.

`REG_DWORD`| +|**Allowed Node.js versions**|`VersionAllowList`|Allow list для `nvm install`, `nvm use` и Certified shim. Community ACL — no-op при install и при use/shim. Недопустимые записи ломают enforcement. Allow побеждает block, когда оба списка из одного источника. Certified shim загружает allow и block парой из первого источника, где есть любой из ключей (сначала HKLM Policies). Пользовательский HKCU allow list не перекрывает HKLM Policies block list. CLI `nvm install` / `nvm use` на Certified Builds читает **только HKLM Policies**. Unmanaged Certified всё ещё чтит списки `nvm config` при запуске shim, если списков GPO нет. Также питает version claims JWT Author mirror (magic tokens вроде `EOL`, `ALPHA`, `MAINTENANCE`, `ALL`). Эти magic tokens локально игнорируются при install, use и запуске shim.

Поддерживает exact semver, wildcards (например, `20.x`), псевдонимы и negation `NOT`/`!` (одно правило на строку).

`REG_SZ`| +|**Blocked Node.js versions**|`VersionBlockList`|Block list для `nvm install`, `nvm use` и Certified shim. Те же форматы правил и та же парная загрузка, что у `VersionAllowList`.

`REG_SZ`| :::info[License secrets] `AccessToken`, `AccessKey` и `JwksCose` **не** являются политиками ADMX. Развёртывайте скриптами портала (`Set-NvmWindowsAccessToken.ps1` на stock certified build; `Set-NvmWindowsLicensing.ps1` для governance builds, также задаёт `AccessKey` для зеркал Author) или `nvm license`. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/command/package-manager-shims.md b/i18n/ru/docusaurus-plugin-content-docs/current/command/package-manager-shims.md index 33c6038..d82d0f9 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/command/package-manager-shims.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/command/package-manager-shims.md @@ -21,7 +21,7 @@ Proxy разрешает активную версию Node.js (те же пра 4. Разрешает Node.js (preference / detection / `--nvm-use`) и при необходимости автоустанавливает. 5. Проверяет, что каталог версии безопасен (не reparse point, не writable другими пользователями) — отказ → **NVM4305**. 6. Находит делегированную команду в установке Node (`.exe`, затем `.cmd`, затем `.bat`). -7. Применяет ограничения package manager, если действует политика (npm / npx / pnpm / yarn). HKLM `BlockPackageManagerLifecycleScripts` принудительно ставит `--ignore-scripts` или `YARN_ENABLE_SCRIPTS=false`. Certified Builds с Advanced Logging пишут **NVM4412** только для install-команд. +7. Применяет ограничения package manager, если действует политика (npm / npx / pnpm / yarn). `NpmModuleMinimumAge` мапится на нативный cooldown каждого менеджера, включая npx (`npm_config_min_release_age`). Community по умолчанию выкл. (`0`). Certified по умолчанию 2880 минут (2 дня), если ключ не задан. HKLM `BlockPackageManagerLifecycleScripts` принудительно ставит `--ignore-scripts` или `YARN_ENABLE_SCRIPTS=false`. Certified Builds с Advanced Logging пишут **NVM4412** только для install-команд. 8. Если включены `EnforcePermissionModel`, `FreezeV8GlobalObjects` или `DisableEvalAndStringExecution`, вписывает эти флаги Node в `npm_config_node_options` для npm/npx/pnpm, чтобы lifecycle-скрипты их наследовали. По умолчанию выкл.: env не пишется. `NODE_OPTIONS` не задаётся. Yarn, bun, corepack и vlt пропускаются. npm-cli.js сам не запускается под `--permission`. 9. Проверяет доверие к `node.exe` и делегированной цели (ниже). 10. Запускает реальный инструмент (для npm/npx/corepack часто `node.exe` + `*-cli.js`; иначе `.exe` / `.cmd`). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/features/author-mirror.md b/i18n/ru/docusaurus-plugin-content-docs/current/features/author-mirror.md index d285bcf..0121576 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/features/author-mirror.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/features/author-mirror.md @@ -67,7 +67,7 @@ import DocImage from '@site/docs/_components/DocImage'; | Запись политики | Локальный клиент | Author mirror (`mirror.author.io`) | Публичное зеркало (`nodejs.org`) | |:-|:-|:-|:-| | `16.x` в block list | Запрещено до загрузки | Не достигается | Не достигается | -| `EOL` в block list | Разрешено локально (псевдоним игнорируется) | Запрещено, если версия end-of-life | Нет Author JWT — не применяется | +| `EOL` в block list | Разрешено локально (псевдоним игнорируется при install, `nvm use` и запуске shim) | Запрещено, если версия end-of-life | Нет Author JWT — не применяется | | Только allow `20.x` (без magic) | Не-20 запрещены локально | — | — | @@ -80,7 +80,7 @@ VersionAllowList=20.x Что это даёт: -1. **Локально:** `20.x` / `22.x` совпадают с allow list. `EOL` не раскрывается, поэтому end-of-life релиз **не** останавливается на клиенте одним этим псевдонимом. Поскольку есть динамический псевдоним, allow list также **не** считается эксклюзивным: другие версии всё ещё проходят локальную проверку. +1. **Локально:** `20.x` / `22.x` совпадают с allow list. `EOL` не раскрывается, поэтому end-of-life релиз **не** останавливается на клиенте одним этим псевдонимом — включая `nvm use` и запуск Certified shim уже установленной копии. Поскольку есть динамический псевдоним, allow list также **не** считается эксклюзивным: другие версии всё ещё проходят локальную проверку. 1. **На `mirror.author.io`:** клиент отправляет license claim из этих списков (включая `NOT EOL`). Зеркало отклоняет end-of-life архивы. 1. **На `nodejs.org` (или любом не-Author зеркале):** нет Author JWT — `EOL` ничего не делает. Ставьте Author первым в [`node_mirror`](../cfg/core#downloads-and-mirrors) или добавьте статические блокировки (например, `16.x`), если нужно принуждение без зеркала Author. diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/features/modes.md b/i18n/ru/docusaurus-plugin-content-docs/current/features/modes.md index 970f4e8..4456877 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/features/modes.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/features/modes.md @@ -55,7 +55,7 @@ NVM for Windows v2 не пытается повысить права (то ес - Ограничение прав Node.js/V8. (Опционально) _Требует Certified Builds с дополнением Governance._ - Доверие издателю: проверка издателя node.exe, чтобы предотвратить подмену недоверенным node.exe. - Нативное журналирование событий. -- Единые/настраиваемые периоды cooldown для всех основных менеджеров пакетов (npm/yarn/pnpm). _Требует дополнение Governance, доступно с сентября 2026._ +- Единые/настраиваемые периоды cooldown для всех основных менеджеров пакетов (npm/npx/yarn/pnpm). _Требует дополнение Governance, доступно с сентября 2026._ :::tip[Certified Builds] **Ограничение прав V8 / permission lockdown** в shim (`EnforcePermissionModel`, `FreezeV8GlobalObjects`, `DisableEvalAndStringExecution`) и **cooldown** менеджеров пакетов — функции Governance. См. [политику реестра](../cfg/registry) и [Выбор редакции](../guide/builds/). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guide/builds/index.md b/i18n/ru/docusaurus-plugin-content-docs/current/guide/builds/index.md index 190fea2..31372f6 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guide/builds/index.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guide/builds/index.md @@ -35,7 +35,7 @@ Certified-сборки рассчитаны на команды и органи |:-|:-| |**Advanced Logging**|Структурированное журналирование для интеграции с SIEM.| |**Trust Artifacts**|SBOM, provenance и отчёты VEX.| -|**Governance**|Централизованное управление политиками (ADMX/ADML + GPO/Entra-скрипты), расширенная поддержка прокси (IWA, WPAD/PAC), зеркало Node.js (mirror.author.io), version firewall, принудительные права Node.js через shim, единый cooldown для менеджеров пакетов (npm/pnpm/yarn) и air-gap/локальные установки.| +|**Governance**|Централизованное управление политиками (ADMX/ADML + GPO/Entra-скрипты), расширенная поддержка прокси (IWA, WPAD/PAC), зеркало Node.js (mirror.author.io), version firewall, принудительные права Node.js через shim, единый cooldown для менеджеров пакетов (npm/npx/pnpm/yarn) и air-gap/локальные установки.| ### Центр сертификации подписи кода @@ -65,7 +65,7 @@ NVM for Windows распространяется компанией Author Softw - Использовать корпоративные прокси (IWA, PAC/WPAD). - Блокировать неутверждённые версии Node.js (EOL, уязвимые или нестабильные). -- Задавать пользовательские cooldown для npm/yarn/pnpm. +- Задавать пользовательские cooldown для npm/npx/yarn/pnpm. - Применять модель прав Node.js (`--permission` / `--experimental-permission`), чтобы shim-`node` стартовал с default-deny; lifecycle-скрипты npm/npx/pnpm наследуют те же флаги через `npm_config_node_options`, когда политика включена. Приложениям нужно передавать `--allow-*` при запуске. - Замораживать intrinsics V8 (`--frozen-intrinsics`), чтобы предотвратить загрязнение прототипов встроенных объектов (также для скриптов npm/npx/pnpm при включённой политике). - Запрещать `eval()` / `new Function()` (`--disallow-code-generation-from-strings`) (также для скриптов npm/npx/pnpm при включённой политике). diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guide/security.md b/i18n/ru/docusaurus-plugin-content-docs/current/guide/security.md index 5a7ed95..bc2c2cf 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guide/security.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guide/security.md @@ -114,7 +114,7 @@ sequenceDiagram ## 3. Пакетные менеджеры и модули \{#package-managers-and-modules} -Через `proxy.exe` NVM может применять **Governance**-контроли пакетных менеджеров, например [`NpmModuleMinimumAge`](../cfg/registry#governance-keys) (cooldown / минимальный возраст публикации для npm, pnpm и yarn). Community по умолчанию выключен. Certified Builds по умолчанию 2 дня (2880 минут), если ключ не задан. HKLM Policies фиксирует значение и удаляет CLI-флаги обхода возраста. +Через `proxy.exe` NVM может применять **Governance**-контроли пакетных менеджеров, например [`NpmModuleMinimumAge`](../cfg/registry#governance-keys) (cooldown / минимальный возраст публикации для npm, npx, pnpm и yarn). Community по умолчанию выключен (`0`) — как stock npm/npx без version manager. Certified Builds по умолчанию 2 дня (2880 минут), если ключ не задан, включая npx. HKLM Policies фиксирует значение и удаляет CLI-флаги обхода возраста. NVM **сейчас не** применяет allow/deny list **пакетов** npm для вложенных зависимостей. Supply-chain риск внутри `node_modules` остаётся проблемой upstream-реестра; более долгосрочная работа Author Software Runtime закрывает это отдельно. Что NVM *действительно* ограничивает сегодня: diff --git a/i18n/ru/docusaurus-plugin-content-docs/current/guide/siem.md b/i18n/ru/docusaurus-plugin-content-docs/current/guide/siem.md index c611d32..85b5026 100644 --- a/i18n/ru/docusaurus-plugin-content-docs/current/guide/siem.md +++ b/i18n/ru/docusaurus-plugin-content-docs/current/guide/siem.md @@ -48,7 +48,7 @@ Certified MSI регистрирует этот provider и включает к | Структурированный info, warning или error | Event ID **120**, **121** или **122** | | Код NVM | `Code` (только число) | | Именованное событие жизненного цикла или аудита | `EventName`, затем разберите `Payload` как JSON | -| Каждый запуск `node.exe` | Event ID **200**, когда включён `log_executions`. Структурированная форма — `nodejs.executed` на Event ID **120** | +| Каждый запуск `node.exe` | Event ID **120** `nodejs.executed`, когда включён `log_executions`. Event **200** не используется | `Payload` — строка JSON. `Code` — отдельный `UInt32`. @@ -70,12 +70,12 @@ Certified MSI регистрирует этот provider и включает к ## Версии Node.js в работе \{#nodejs-versions-in-use\} -Event ID **200** пишет каждый запуск shim, когда включён `log_executions`. -Этот Event ID не требует Advanced Logging. +Event ID **120** `nodejs.executed` пишет каждый запуск shim, когда включён `log_executions`. +`Payload.NodeVersion` — версия. Event ID **200** не используется. -С Advanced Logging структурированная форма — `nodejs.executed` на Event ID **120**. +Число узлов для того же события: @@ -148,12 +148,12 @@ Windows Event ID — шаблон. | 120 | структурированный info | `Source`, `EventName`, `Payload`, `Code` | | 121 | структурированный warning | `Source`, `EventName`, `Payload`, `Code` | | 122 | структурированный error | `Source`, `EventName`, `Payload`, `Code` | -| 200 | запуск shim | `RequestedCommand`, `ResolvedPath`, `NodeVersion`, `Arguments`, `WorkingDirectory` | +| 200 | не используется | Остаток манифеста. Журнал запусков — Event ID **120** `nodejs.executed`. | | 210 | shim info | `Source`, `Message`, `Code` | | 211 | shim warning | `Source`, `Message`, `Code` | | 212 | shim error | `Source`, `Message`, `Code` | -У Event ID **200** нет поля `Code`. +Event ID **200** не используется. Журнал запусков — Event ID **120**. События безопасности от shim содержат `user`, `sid`, `hostname`, `parent_process`, `parent_pid`, `project_name` и `project_path`, когда процесс может их получить. Пустое значение — `unknown`.