You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* docs: correct workflow publishing security-review claim, add catalog vetting notes
workflows/PUBLISHING.md described the workflow submission check as a
security review of shell step content and called listed workflows
"reviewed" for that purpose. Maintainers only check submission form and
completeness, matching the language already used for extensions,
presets, and bundles.
Preset and bundle catalog docs demonstrated install_allowed without the
vetting guidance extensions.md already gives, so a project-supplied
catalog could look implicitly trusted. Add the same "vet before marking
install_allowed" note to docs/reference/presets.md and
docs/reference/bundles.md (covering both bundle sources and the
component catalogs a bundle can pull in).
* docs: reconcile shell-step review language in PUBLISHING.md
The prior commit's new Verification Process wording ("maintainers do
not review... at all") contradicted the untouched Authors bullet under
Security, which said maintainers reject submissions whose shell steps
can't be justified at review time. Reword both, plus the parallel
sentence in the Security section, so all three consistently say
maintainers may reject an obviously dangerous submission during the
form/completeness pass, but this is never a security audit.
Assisted-by: Claude Sonnet 5 (model: claude-sonnet-5, autonomous)
* docs: extend catalog vetting guidance to step catalogs and workflow reference docs
Address review feedback on #4736: the bundle catalog trust warning
omitted step catalogs and their inspection command, and the new
catalog-vetting guidance only lived in the author-facing publishing
guide, not in the user-facing workflow reference docs (workflow run/add,
.specify/workflow-catalogs.yml). Adds an equivalent warning to
docs/reference/workflows.md and extends the regression test to assert
the step-catalog inspection command explicitly.
Copy file name to clipboardExpand all lines: docs/reference/bundles.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -174,6 +174,8 @@ from; `discovery-only` sources appear in `search` and `info` but refuse
174
174
installation. Inspect the active stack before installing a bundle from a
175
175
non-default source.
176
176
177
+
> **Vet both the bundle source and its component catalogs.** A project can supply its own bundle catalog and `install-allowed` component catalogs (extension, preset, workflow, and step) under `.specify/`; that project configuration existing is not evidence anything in it was reviewed. Before installing a bundle from an unfamiliar project, run `specify bundle catalog list` — and the equivalent `extension`/`preset`/`workflow catalog list` and `specify workflow step catalog list` commands for the components it pulls in — and treat any source you didn't add yourself as unvetted until you've reviewed it.
Copy file name to clipboardExpand all lines: docs/reference/presets.md
+3-1Lines changed: 3 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -138,6 +138,8 @@ Changes the resolution priority of an installed preset. Lower numbers take prece
138
138
139
139
Preset catalogs control where `search` and `add` look for presets. Catalogs are checked in priority order (lower number = higher precedence).
140
140
141
+
> **A project's `.specify/preset-catalogs.yml` can point `add` and `search` at a catalog you didn't choose.** Before installing a preset in an unfamiliar project, run `specify preset catalog list` and inspect any catalog marked install-allowed — a project supplying that config, or marking a catalog install-allowed, is not evidence its presets were reviewed. Only mark a catalog `install_allowed` for one you authored or have vetted yourself; leave unfamiliar and community catalogs discovery-only.
|`--install-allowed / --no-install-allowed`| Whether presets can be installed from this catalog (default: discovery only) |
161
+
|`--install-allowed / --no-install-allowed`| Whether presets can be installed from this catalog (default: discovery only). Only enable for a catalog you own and vet; never enable it for an unvetted public catalog.|
160
162
|`--description <text>`| Optional description |
161
163
162
164
Adds a catalog to the project's `.specify/preset-catalogs.yml`.
Copy file name to clipboardExpand all lines: docs/reference/workflows.md
+2Lines changed: 2 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -386,6 +386,8 @@ Shows detailed information about a workflow, including its steps, inputs, and re
386
386
387
387
Workflow catalogs control where `search` and `add` look for workflows. Catalogs are checked in priority order.
388
388
389
+
> **A project's `.specify/workflow-catalogs.yml` can point `add` and `search` at a catalog you didn't choose.** Before running a workflow from an unfamiliar project, run `specify workflow catalog list` (and `specify workflow step catalog list` for the step catalogs its steps can pull in) — a project supplying that config is not evidence its workflows or steps were vetted. Maintainers do not audit `run` fields; read a workflow's shell steps yourself before running it (see [Who maintains workflows?](#who-maintains-workflows)).
2. **Step correctness** — all step types used correctly, no dangling references
235
235
3. **Input design** — clear prompts, sensible defaults and enums
236
-
4. **Security** — no malicious shell commands, safe operations
237
-
5. **Documentation** — clear README explaining what the workflow does and when to use it
236
+
4. **Documentation** — clear README explaining what the workflow does and when to use it
238
237
239
-
Once verified, the workflow appears in `specify workflow search`.
238
+
This is a check of the submission's **form and completeness**, not a security review — maintainers may reject a submission if its `shell` step content looks obviously dangerous during this pass, but they do not systematically audit, endorse, or support the workflow's code. Treat every workflow, including catalog-listed ones, as untrusted until you've read its `run` fields yourself (see [Security: shell steps execute arbitrary code](#security-shell-steps-execute-arbitrary-code)).
239
+
240
+
Once these checks pass, the workflow appears in `specify workflow search`.
240
241
241
242
---
242
243
@@ -277,13 +278,13 @@ When releasing a new version:
277
278
278
279
Workflow `shell` steps execute their `run` field through `/bin/sh` (POSIX) or the platform shell. There is no sandbox between the step and the user's machine: a malicious or buggy `run` block can read environment variables, modify files outside the project, exfiltrate data, or escalate privileges.
279
280
280
-
Catalog-listed workflows are reviewed at submission time (see [Verification Process](#verification-process)), but you should still treat every install as code-execution from an untrusted source until you have read the `workflow.yml`:
281
+
Catalog-listed workflows are checked for form and completeness at submission time (see [Verification Process](#verification-process)); maintainers may reject an obviously dangerous submission they happen to notice, but this is not a security audit — you should treat every install as code-execution from an untrusted source until you have read the `workflow.yml`:
281
282
282
283
- **Before installing a workflow**, fetch the raw YAML and audit every `shell` step's `run` field directly. `specify workflow info <name>` only shows metadata (name, version, inputs, step IDs/types) — not the shell content that would actually execute.
283
284
- **Constrain interpolated values, don't just quote them** in `run` blocks: expressions are spliced in as raw text with no automatic escaping, and there is no shell-escaping filter, so quoting is not a security boundary. Restrict `{{ inputs.something }}` substitutions to a fixed set with `enum`/an allowlist so a malicious input can't inject shell syntax; treat quoting only as correctness handling for already-constrained values.
284
285
- **Treat prior-step output as untrusted too** — `{{ steps.*.output.* }}` from a `prompt` step is AI-generated text that upstream content can influence. Don't interpolate agent output into a `run` field at all when you can't constrain it; branch on it with `if`/`switch` or act on it in a non-shell step instead.
285
286
- **Limit privilege**: shell steps inherit the user's environment. Workflows that need elevated access (sudo, secrets, GitHub tokens) should call them out explicitly in the README so reviewers can spot the requirement.
286
-
- **Authors**: if your workflow has shell steps that look risky out of context (deletions, network calls, credential reads), document the rationale in your README. Maintainers will reject submissions whose shell steps can't be justified at review time.
287
+
- **Authors**: if your workflow has shell steps that look risky out of context (deletions, network calls, credential reads), document the rationale in your README. Maintainers may reject a submission whose shell steps look obviously dangerous and unjustified, but this spot-check is not a security audit — don't rely on catalog acceptance as a safety signal.
0 commit comments