R5 · Security and threat model¶
Done 2026-10-26 · 30 findings: 2 blockers, 23 majors, 5 minors · 0 dropped · 8 questions for Thomas
What changed¶
- New review file:
docs/reviews/R5-security.md. It holds:- the 30 findings
SEC-101toSEC-130, ranked by severity, each with its evidence (quoted passages), a risk rating, a proposal andStatus: open; - a findings table with the trust boundary of each finding and the specs it touches;
- 8 questions for Thomas;
- 5 proposed spikes (
sec-single-mode,sec-runner-confinement,sec-redaction-canary,sec-authz-matrix,sec-slurm-identity); - an appendix with the reviewer's outline for a future
docs/specs/security-and-threat-model.md.
- the 30 findings
- No spec was edited. This is a review round (see the review rules in
docs/reviews/README.md). The prompt asked for a draft threat-model spec; the step wrote only the outline in the appendix. Question 8 asks whether APPLY1 should create the spec from it. - The file was committed on
autopilot/integrationinad6bc9b, together with the other W1 review files, the nav entry andmap.md.
Why¶
Spectio runs code on shared clusters as real Unix accounts, accepts events from engines, and lets people, service accounts and AI agents decide gates. Before any code, the design needs a threat model per trust boundary, and the places where tenancy can leak need to be named.
Prompt: next-phase.md · R5. It asks for STRIDE per trust boundary: browser, embeds, service accounts, runners, engine ingest, AI agents on gates, event bridges, plugins, backups, depictio trust, the co-hosting proxy and every sign-in method. It also asks for tenancy leaks through search, SSE, webhooks, exports, logs and the task ledger. The round runs as an autopilot step: decision log, 2026-10-26, autopilot.
Evidence¶
How the round ran (from the round's header in the review file):
| Item | Value |
|---|---|
| Commit read | autopilot/integration at 3b209d3; every line number in the file refers to it |
| Reviewers | security-reviewer, one instance, with the whole design in scope. It returned a full report; none failed. |
| Read | every spec in docs/specs/, the decision log, decision 0001, and the research notes on depictio auth and harmonisation |
| Upstream code | read-only scratch clones: nextflow 114f1fe (secret masking in config, unmasked params in TowerObserver, publishDir default mode), nf-core/rnaseq 95dbcd9 (remote includeConfig), and the Slurm slurm.conf docs (PrivateData, AccountingStoreFlags=job_env) |
| Merge | IDs renumbered in rank order; the reviewer's draft IDs (d1nn) kept in the table's last column. Two sub-points removed as duplicates of R1 SR-002 and SR-024. |
| Merger's check | every quoted passage of every blocker and major was opened at 3b209d3. All reproduced, so 0 findings were dropped. External file:line claims were spot-checked in the clones. |
| Correction during the merge | nextflow's SECRET_KEYS is @deprecated in favour of StringUtils.isSensitiveName. Whether the two patterns match was not compared, and the file marks this [to be validated]. |
| Earlier rounds | R8b (DEP-T-) and R12 (UX-) findings are cited, not repeated. Eight R1 findings are shared and kept, because R5 adds the attacker and the controls; each has a Related line so that both are triaged together. |
Counts, checked against the file's headings:
$ for s in blocker major minor; do printf "%s " $s; grep -c "^### SEC-[0-9]* · $s ·" docs/reviews/R5-security.md; done
blocker 2
major 23
minor 5
$ grep -c '^| SEC-' docs/reviews/R5-security.md
30
These match the summary table in the file (total 30, dropped 0) and the merge summary returned by the step's workers (2 blockers, 23 majors, 5 minors, 0 dropped).
Exit criterion. R5 is done when its review file exists, so that TRIAGE1 can read it:
$ ls docs/reviews/R5-security.md
docs/reviews/R5-security.md
Figures and media¶
None required (review step).
Findings and open questions¶
The five findings that matter most (as ranked in the review file's summary):
- SEC-101 · blocker: a runner's Unix account is not tied to the people who launch on it. On a group environment, any
launcher, or any editor who adds ascript:binding, runs code as a colleague's or an admin's cluster account. Related to R1 SR-014. - SEC-102 · blocker:
singlemode trusts127.0.0.1. On an HPC login node, an MVP target, every other user can drive the owner's runs as the owner, and so can a web page through DNS rebinding. Same core problem as R1 SR-031, rated major there; R5 adds the browser path and rates it a blocker. - SEC-104 · major: there is no endpoint → action → scope → role matrix, so "every endpoint has a principal and a
can()" cannot be built or tested. IDs in request bodies and plugin routes are the likely gaps. - SEC-113 · major: identities are linked by email across IdPs, including depictio, which cannot verify email. Group sync is not namespaced, so an IdP group named
admincan lead to account takeover or admin rights. - SEC-115 · major: a server compromise means code execution on every runner's Unix account, because runners enforce no local policy. The file proposes a runner-side
runner.tomlthat the runner enforces whatever the server says.
Questions for Thomas. The full wording is in the review file. In short:
| # | Topic | Question |
|---|---|---|
| 1 | single mode on login nodes (SEC-102, R1 SR-031) |
Keep it there, with a Unix socket, a local token, a Host allow-list and CSRF, or restrict it to laptops and service nodes? |
| 2 | Group clusters (SEC-101, R1 SR-014) | One runner per user, a service-node runner using slurmrestd with per-user JWTs, or a declared shared account with explicit delegation? Does the EMBL acceptable-use policy forbid shared accounts, and is slurmrestd with per-user JWTs available? [to be validated] |
| 3 | Project visibility (SEC-121, R1 SR-029) | Two values (private / instance), or split instance (signed-in users) from public (guests too)? Does depictio's is_public map to public? |
| 4 | depictio trust (SEC-120) | Should a depictio admin ever become a Spectio admin automatically (proposed: no)? Ask depictio for aud and a JWKS endpoint, or drop the audience test? |
| 5 | Co-hosting default (SEC-109, DEP-T-013) | Separate hosts with IdP SSO, or path co-hosting on one domain, which merges the two applications' trust domains? |
| 6 | Agent approvals (SEC-111) | Are the defaults acceptable: a 15-minute hold before an agent approval takes effect, and a 10 % cap on items an agent may exclude? |
| 7 | Plugins (SEC-124) | Accept that installed server plugins are as trusted as admins, and reword architecture §10 risk 2 to match? |
| 8 | Threat-model spec | Should /apply-findings R5-security create docs/specs/security-and-threat-model.md from the outline in the appendix? |
Next. TRIAGE1 sorts these findings with the triage policy, together with the related R1 findings. It moves the questions it cannot settle to the inbox. APPLY1 then changes the specs and adds the decision-log entries.