Add two boolean config.ini [default] flags — allow_git_url_install and
allow_pip_install (both default false) — that fully REPLACE the
security_level term on the legacy install surfaces:
- POST /v2/customnode/install/git_url (S-A) and
POST /v2/customnode/install/pip (S-B) are now gated solely by their
dedicated flag AND the retained network-position invariant
(loopback listener OR network_mode=personal_cloud). security_level
no longer affects these two surfaces in either direction.
- The batch unknown-URL branch (S-C) routes through the same predicate;
the unknown-pip branch stays unconditionally blocked; the general
middle+ batch entry gate is unchanged.
- New pure predicate is_dedicated_install_allowed() in
common/manager_security.py (config-import-free; callers pass values
from their own reader). Both config readers (glob + legacy) register
the keys in read/write/fallback paths.
- Denial logs and frontend copy name the responsible flag instead of
the misleading security_level guidance. Public listeners remain
denied regardless of the flags (no exposure widening).
- README security policy updated: config keys documented, git-url/pip
removed from the security_level risky table, and a dedicated-flags
subsection (REPLACE semantics, network rule, batch behavior,
restart-only activation, weak/normal- opt-in migration note).
- Migration: existing weak/normal- users must opt in via the new flags
(CHANGELOG note; deliberate no auto-seed).
Includes the unit/config/guard test suites (88 tests): predicate truth
table, dual-reader config contract (missing/malformed keys read false,
round-trip, cache staleness), security_level-matrix freeze guards, and
suite-order-independent test stubs.
Defense-in-depth over GET→POST alone: reject the three CORS-safelisted
simple-form Content-Types (x-www-form-urlencoded, multipart/form-data,
text/plain) on 16 no-body POST handlers (glob + legacy) to block
<form method=POST> CSRF that bypasses method-only gating. Move
comfyui_switch_version to a JSON body so the preflight requirement applies.
Split db_mode/policy/update/channel_url_list into GET(read) + POST(write).
Tighten do_fix (high → high+) and gate three previously-ungated config
setters at middle. Resynchronize openapi.yaml (27 paths, 30 operations,
ComfyUISwitchVersionParams as a shared $ref component). Add E2E harness
variants, Playwright config, CSRF/secgate suites, 39-endpoint coverage,
and a CHANGELOG.
Breaking: legacy per-op POST routes (install/uninstall/fix/disable/update/
reinstall/abort_current) are removed; callers already use queue/batch.
Legacy /manager/notice (v1) is removed; /v2/manager/notice is retained.
Reported-by: XlabAI Team of Tencent Xuanwu Lab
CVSS: 8.1 (AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:H/A:H)
- Strengthened the default security policy
- Subdivided the risky levels high and middle into high+, high, middle+, and middle
- Added support for personal_cloud network mode
- Updated README.md
fixed: invalid security message
fixed: legacy - crash when security policy violation occurred
modified: default 'use_uv' is now True
* IMPROVED: Instead of updating the entire CNR cache at once, the process now divides it into 30-page queries.
* IMPROVED: Clicking on the titles of nodes that exist only in CNR now opens the GitHub repository link instead of the CNR link, where possible.
* ADDED: Added information about `extra_model_paths.yaml` to the README.md file.
https://github.com/ltdrdata/ComfyUI-Manager/issues/1457