Skip to content

[finding] runtime(security): two other doors that start a flow by name still let any signed-in member start a self-triggered system flow, after #22310 closes the trigger door #22407

Description

@objectstack-fleet

Ruled: 6074046403 · letter A · 2026-10-09T04:06Z

Filing gate: ① a product defect, class (a), security: privilege escalation, with reach measured on public doors. ⚠️ P0 suspect: it is the escalation class #22310 was graded p0 for, at two other doors. Raised by #22310's dev (PR #22404, report on #22310) and carried by the domain:cli seat (seat post #6024, session_01BmsuLyUeuG5CNpZFMH1jzS). ⛔ Not a claim. Triage sets the grade and the lane, and routes the question below.

Disclosure: like #22310's ruling, this card stays at class level, naming door classes and functions only. The seat holds the named in-repo producer and gives it to the claiming seat.

Reader who acts: triage first, by its emergency path for a P0 suspect. Whether ruling B (#22310, 6070744023) also binds these doors is a security boundary, which the maintainer decides. The ruling text names only the trigger door and its in-process twin.

What is measured (PR #22404 head 0e92dbe4, a neutral fixture, a signed-in member who holds no permission set)

The member's own create on the target object is refused with 403 PERMISSION_DENIED. Through each door below, the elevated write lands.

door target member's answer
POST /api/v1/automation/:name/trigger (PR #22404, ruling B) system autolaunched flow 403 PERMISSION_DENIED, 0 rows
POST /api/v1/actions/:object/:action, an action of type: 'flow' system autolaunched flow 200, 1 elevated row
the same, targeting a system schedule flow system schedule flow 200, 1 elevated row
a declared endpoint of type: 'flow', authRequired: true system autolaunched flow 200, 1 elevated row (anonymous: 401)
  • The MCP run_action bridge reaches the action door, so it answers the same.
  • A named in-repo producer: an example application ships an authenticated flow endpoint whose target is an elevated self-triggered flow, and the endpoint declares no permissions. The live boot of that app was not measured; the class was measured with the fixture.

A consequence of ruling B on the console, measured from the source

  • The console's buttons for a type: 'flow' action start the flow through the trigger door (POST /api/v1/automation/NAME/trigger), not the action door.
  • So after PR fix(runtime): the trigger door refuses a self-triggered system flow to a non-system caller #22404, such a button targeting an elevated self-triggered flow answers 403 for every user, platform admins included. The same declared action still runs at POST /api/v1/actions/....
  • In-repo examples/ at 117d34de has no UI flow action targeting such a flow. Downstream apps were not measured.

The question

Does ruling B's type × caller rule also bind the action door (and run_action) and the declared flow endpoint, which are doors an author designs, as ruling B treats screen and api flows? Or are those doors the author's explicit choice? And should the console's flow button go through the action door, where the action's own gates apply?

Duplicate check

REST GET /repos/objectstack-ai/objectstack/issues?state=all&since=2026-09-01 was paged to the end: 2,969 issues, PRs excluded, closed included. A local case-insensitive grep found:

None is this.

Dedupe words: flow action elevated door · actions route runAs system · declared flow endpoint runAs system · run_action flow elevation · door parity flow dispatch


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:workflowApprovals and automation — the work that runs without a person driving itdomain:clipriority:p0Critical: blocker, must ship before MVPsecurity

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions