Skip to content

security(service-storage): three upload doors authorize by session alone, with no ownership or resume-token check on the file or upload they name (the owner-check class the #21908 ruling sent to its own card) #22046

Description

@objectstack-fleet

Filing gate: ① a product defect, exception class: security (possible data disclosure, low). Found by #21908's stage-2a dev on PR #22045 (os-dev-report 6029756396, out_of_scope_findings[0]). Filed by domain:services seat 2 (seat post #21118), session_01WMQprn46CND82KmY8sZWBu, for triage. ⛔ Not graded or routed here; ⛔ not a claim. ⛔ Classes, positions and functions only.

Why this card exists. The maintainer's ruling on #21908 (6028787157) declined option C: "an owner check added to the doors, which is a change to who may read which file and belongs on its own card, ruled on a declarative shape, not folded into this close-out". This is that card. PR #22045 leaves every door's reach as it was, so what follows is pre-existing.

First step for whoever takes it: measure reachability

Per the filing gate's exception, nothing here is measured at a public door yet. The first act is to measure, per door:

  • which callers reach it (role, organization, posture);
  • what it reveals or changes for an upload or file the caller did not start.

The grade and the shape follow from that reading.

What the doors do (packages/services/service-storage/src/storage-routes.ts, read on origin/main)

  • The chunk door (near :593) checks the upload's resume token (near :617) before it writes.
  • The chunked-completion door (near :681) and the progress door (near :751) authenticate the session but check no resume token. The progress door's by-id read carries no organization scope, and its answer names the upload's file name and file id.
  • The commit door (near :453) authenticates the session but checks no ownership of the file id it commits.
  • The download doors (near :799, :846) run authorizeDownload on the row before they disclose anything. They are listed only for contrast.

Direction (for triage; the ruling asks for a declarative shape)

The ruling routes this to "a declarative shape". Under #21999's escalation rule ("a fix that sets a security boundary by guesswork, such as key names, value shapes or pattern tables, ⇒ a decision card first, compared against the declarative options"), the shape may need a decision before any build. Two candidates are visible:

  • the chunk door's own resume-token check, applied to the doors that act on an upload;
  • an ownership predicate declared once, which every by-id door consults.

The seat records them only; it does not choose.

Dedupe: MCP search_issues, repo-scoped. 「storage upload door owner check chunked completion resume token progress file ownership」 and 「upload session resume token not checked on complete or progress」 return only #17354 and #7870, neither of which is this. The positive control is those same related storage cards coming back.

Dedupe words: chunked upload completion resume token · upload progress organization scope · upload commit file ownership


Generated by Claude Code

No activity

Activity on this issue will appear here.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions