Strategic Finding
Type: adoption-blocker
Horizon: near-term
Spindle is the first piece of network-facing, multi-tenant server software the organization has shipped, and there is no working private channel through which an outsider can report a vulnerability in it.
The org policy at tuna-os/.github/SECURITY.md gives two routes. Both are closed:
- "Open Security → Report a vulnerability" — private vulnerability reporting is disabled. Verified 2026-09-02:
GET /repos/tuna-os/spindle/private-vulnerability-reporting returns {"enabled": false}. The same call returns false for tuna-os/tunaos and tuna-os/.github, so this is org-wide, not a spindle oversight.
- "contact the maintainers privately via a GitHub Security Advisory in
tuna-os/tunaos" — drafting a security advisory requires write or admin permission on the repository. An external reporter does not have it. This fallback is only usable by people who did not need it.
There is no email address, no GPG key, and no SECURITY.md in this repository. The net effect is that a stranger who finds a room-authorization bypass in Spindle has exactly one available action: open a public issue — the thing the policy's first line forbids.
The vulnerability taxonomy is also written for a different product. SECURITY.md's "What to report" section lists RCE in installer/migration tooling, credential handling in CI, supply-chain issues, and image trust-model violations. Every entry describes a build or image artifact. Nothing covers the classes Spindle actually produces: authorization bypass on a room read, federation request forgery, event-signature verification failure, resource exhaustion by an unauthenticated peer.
That taxonomy gap is not hypothetical here. This repository's own README states that two authorization holes shipped and were found by reading, not by tests — nine read endpoints served any room's contents to any account (#257, #258) — and #268 is open precisely because "the finding rate was 'however much someone happened to look'". Spindle has already produced two instances of a vulnerability class the intake policy does not name, through a reporting channel that does not exist, in a codebase whose README invites people to point Element at it.
Rationale
The cost of this is asymmetric and it lands at exactly the moment the project succeeds. Today the audience is one star and the exposure is nil. The remedy for #268 and the discoverability fixes this project needs both work in the same direction — more eyes on the authorization surface — and each additional reader raises the probability that the first person to find hole number three is a stranger with no way to tell anyone quietly.
For every other repo in the org, a mishandled disclosure is embarrassing. For a homeserver, the blast radius is other people's private messages on somebody else's deployment, and the reputational claim Spindle is built on — an unusually honest README that publishes its own losses and retractions — is precisely the asset a botched disclosure destroys.
This is also a gate on the project's own stated trajectory. A homeserver cannot credibly move from "an experiment under construction" to anything an operator would deploy while its coordinated-disclosure path is a policy document describing two buttons that are not there.
Proposed Next Step
- Enable private vulnerability reporting on
tuna-os/spindle — one setting, and it makes the org policy's primary route true for this repository. Then do the same across the org, tunaos first.
- Add a
SECURITY.md to this repository that inherits the org policy and adds the server-software classes it lacks: authorization bypass (room, media, admin), federation request forgery and signature-verification defects, cross-account data disclosure, and unauthenticated resource exhaustion. Amend tuna-os/.github/SECURITY.md in the same pass so the org taxonomy covers server software generally rather than images and installers only.
- State a disclosure window and a supported-version line. Neither exists today, and with zero tagged releases (see the release-contract finding filed alongside this one) there is currently no such thing as "a fixed version" to disclose against.
- Link
#268's systematic authorization audit to this as its intake counterpart. Finding the holes and receiving reports of them are the two halves of the same problem, and only one of them has an owner.
Filed by strategist agent (ACMM L6 — full mode)
— hive: agent=strategist backend=claude model=claude-opus-5 claude=2.1.226
Strategic Finding
Type: adoption-blocker
Horizon: near-term
Spindle is the first piece of network-facing, multi-tenant server software the organization has shipped, and there is no working private channel through which an outsider can report a vulnerability in it.
The org policy at
tuna-os/.github/SECURITY.mdgives two routes. Both are closed:GET /repos/tuna-os/spindle/private-vulnerability-reportingreturns{"enabled": false}. The same call returnsfalsefortuna-os/tunaosandtuna-os/.github, so this is org-wide, not a spindle oversight.tuna-os/tunaos" — drafting a security advisory requires write or admin permission on the repository. An external reporter does not have it. This fallback is only usable by people who did not need it.There is no email address, no GPG key, and no
SECURITY.mdin this repository. The net effect is that a stranger who finds a room-authorization bypass in Spindle has exactly one available action: open a public issue — the thing the policy's first line forbids.The vulnerability taxonomy is also written for a different product.
SECURITY.md's "What to report" section lists RCE in installer/migration tooling, credential handling in CI, supply-chain issues, and image trust-model violations. Every entry describes a build or image artifact. Nothing covers the classes Spindle actually produces: authorization bypass on a room read, federation request forgery, event-signature verification failure, resource exhaustion by an unauthenticated peer.That taxonomy gap is not hypothetical here. This repository's own README states that two authorization holes shipped and were found by reading, not by tests — nine read endpoints served any room's contents to any account (
#257,#258) — and#268is open precisely because "the finding rate was 'however much someone happened to look'". Spindle has already produced two instances of a vulnerability class the intake policy does not name, through a reporting channel that does not exist, in a codebase whose README invites people to point Element at it.Rationale
The cost of this is asymmetric and it lands at exactly the moment the project succeeds. Today the audience is one star and the exposure is nil. The remedy for
#268and the discoverability fixes this project needs both work in the same direction — more eyes on the authorization surface — and each additional reader raises the probability that the first person to find hole number three is a stranger with no way to tell anyone quietly.For every other repo in the org, a mishandled disclosure is embarrassing. For a homeserver, the blast radius is other people's private messages on somebody else's deployment, and the reputational claim Spindle is built on — an unusually honest README that publishes its own losses and retractions — is precisely the asset a botched disclosure destroys.
This is also a gate on the project's own stated trajectory. A homeserver cannot credibly move from "an experiment under construction" to anything an operator would deploy while its coordinated-disclosure path is a policy document describing two buttons that are not there.
Proposed Next Step
tuna-os/spindle— one setting, and it makes the org policy's primary route true for this repository. Then do the same across the org,tunaosfirst.SECURITY.mdto this repository that inherits the org policy and adds the server-software classes it lacks: authorization bypass (room, media, admin), federation request forgery and signature-verification defects, cross-account data disclosure, and unauthenticated resource exhaustion. Amendtuna-os/.github/SECURITY.mdin the same pass so the org taxonomy covers server software generally rather than images and installers only.#268's systematic authorization audit to this as its intake counterpart. Finding the holes and receiving reports of them are the two halves of the same problem, and only one of them has an owner.Filed by strategist agent (ACMM L6 — full mode)
— hive: agent=strategist backend=claude model=claude-opus-5 claude=2.1.226