mirror of
https://github.com/Comfy-Org/ComfyUI-Manager.git
synced 2026-07-26 10:07:38 +08:00
feat(security): dedicated install flags decoupled from security_level (#2991)
Python Linting / Run Ruff (push) Waiting to run
Python Linting / Run Ruff (push) Waiting to run
* feat(security): add dedicated install flags decoupled from security_level Gate 'install via git URL' and 'install via pip' with dedicated opt-in boolean flags (allow_git_url_install / allow_pip_install) in config.ini [default], fully replacing the security_level term on those surfaces (REPLACE, not AND — a strict level no longer denies when the flag is on; a weak level no longer allows when the flag is off). - glob/manager_server.py: pure predicate is_dedicated_install_allowed (flag AND loopback, request-time args.listen); REPLACE gates at /customnode/install/git_url and /customnode/install/pip; batch unknown-URL arm routes through the same full predicate at the risky position (loopback term is load-bearing — the middle entry gate has no network-position term; the entry gate itself stays in force); unknown-pip in batch stays unconditionally blocked; new SECURITY_MESSAGE_FLAG_* denial constants name the responsible flag; security_403_response gains flag_token (comfyui_outdated keeps precedence) - glob/manager_core.py: register both keys (read via get_bool default-false, write list, exception fallback); "true"-only truthy; restart-only activation - js/common.js: 403 dialog copy names the responsible flag at the two install call sites - README.md: security-policy docs for both flags (per-surface scope incl. the batch entry-gate qualifier, REPLACE decoupling, loopback bound, opt-in config snippet, default-deny + migration note); stale tier lists corrected against the actual gates - CHANGELOG.md: opt-in migration note + accepted residual risk (flags bypass the forced-strong outdated-ComfyUI hardening on loopback, opt-in only), decoupling claim qualified for the batch entry gate Tests: unit suite (predicate truth table, REPLACE litmus both directions, AST binding-proofs against live handlers, subprocess-isolated config contract) plus a real-server E2E suite that mounts the Manager-under-test via git worktree (exact-SHA pin, detached) against a real ComfyUI and exercises both flag surfaces and both arms — deny arms (403 + flag-naming body/log + no install artifact), git-URL allow arm (real clone), pip allow arm as a two-phase reservation oracle — with zero-residual self-clean. Module skips without E2E_COMFYUI_ROOT; unit suite unaffected. The manager-v4 branch ships the identical policy (shared invariants + config contract); this tree uses the degraded predicate 'flag AND loopback' (no personal_cloud-equivalent mode here). * bump version to v3.41
This commit is contained in:
@@ -384,19 +384,79 @@ When you run the `scan.sh` script:
|
||||
* all feature is available
|
||||
|
||||
* `high` level risky features
|
||||
* `Install via git url`, `pip install`
|
||||
* Installation of custom nodes registered not in the `default channel`.
|
||||
* Fix custom nodes
|
||||
* Downloading models that are not in `.safetensors` format and not
|
||||
registered in the `default channel` model list
|
||||
* NOTE: `Install via git url`, `pip install`, and installation of custom nodes
|
||||
not registered in the `default channel` are **no longer governed by
|
||||
`security_level`** — they are governed by the dedicated install flags
|
||||
described below.
|
||||
|
||||
* `middle` level risky features
|
||||
* Uninstall/Update
|
||||
* Installation of custom nodes registered in the `default channel`.
|
||||
* Fix custom nodes
|
||||
* Restore/Remove Snapshot
|
||||
* Restart
|
||||
|
||||
* `low` level risky features
|
||||
* Update ComfyUI
|
||||
|
||||
### Dedicated install flags: `allow_git_url_install` / `allow_pip_install`
|
||||
|
||||
The two arbitrary-install surfaces are governed by dedicated boolean keys in
|
||||
`config.ini` (`[default]` section), fully **decoupled** from `security_level`:
|
||||
|
||||
* `allow_git_url_install`
|
||||
* governs `Install via Git URL` (`POST /customnode/install/git_url`) **and**
|
||||
the unknown-git-URL arm of the batch install queue
|
||||
(`POST /manager/queue/install`, including reinstall delegation) — i.e.
|
||||
installing any custom node from a git URL that is not registered in the
|
||||
`default channel` catalog
|
||||
* on the **batch queue path**, the flag is **necessary but not
|
||||
sufficient**: the queue's normal `security_level` entry gate (`middle`)
|
||||
must ALSO pass — at `security_level = strong`, batch unknown-URL
|
||||
installs stay denied even with the flag set to `true` (only the direct
|
||||
`Install via Git URL` endpoint is fully independent of `security_level`)
|
||||
* covers the **entire install transaction** it starts, including the
|
||||
pack's transitive dependency pip installs
|
||||
* `allow_pip_install`
|
||||
* governs **only** the standalone `pip install` feature
|
||||
(`POST /customnode/install/pip`)
|
||||
|
||||
Key properties:
|
||||
|
||||
* **Decoupled from `security_level` (replace, not and)** — on the two
|
||||
**direct endpoints** (`Install via Git URL` and `pip install`),
|
||||
`security_level` no longer has any effect in either direction: a strict
|
||||
level cannot deny them when the flag is `true`, and a weak level cannot
|
||||
allow them when the flag is `false`. (The batch queue path keeps its
|
||||
`security_level` entry gate in ADDITION to the flag — see the scope bullet
|
||||
above.) Every other gated feature remains governed by `security_level` as
|
||||
described above.
|
||||
* **Loopback only** — the flags take effect **only** when the server listens
|
||||
on a loopback address (e.g. `--listen 127.0.0.1`). On a non-loopback
|
||||
listener these surfaces stay denied regardless of the flags; the flags
|
||||
never widen the exposure of a public deployment.
|
||||
* **Default deny / explicit opt-in** — both flags default to `false`. Only
|
||||
the case-insensitive string `true` enables a flag; a missing or malformed
|
||||
key reads as `false`.
|
||||
|
||||
To opt in, edit `config.ini`:
|
||||
|
||||
```ini
|
||||
[default]
|
||||
allow_git_url_install = true
|
||||
allow_pip_install = true
|
||||
```
|
||||
|
||||
Changes take effect after a **restart** (no hot reload).
|
||||
|
||||
> **Migration note**: there is no automatic migration from `security_level`.
|
||||
> If you previously relied on `security_level = weak` (or `normal-`) to use
|
||||
> install-via-git-URL / pip install, you must opt in explicitly with the flags
|
||||
> above. See `CHANGELOG.md` for details, including a behavior note for
|
||||
> outdated ComfyUI deployments.
|
||||
|
||||
|
||||
# Disclaimer
|
||||
|
||||
|
||||
Reference in New Issue
Block a user