Adversarial assessment of Sanmarcsoft/headroom run 2026-07-25 by six parallel red-team agents across six disjoint attack surfaces (CI supply chain, proxy network surface, credential handling, code-execution surfaces, fork governance, egress and telemetry). Every finding below cites file:line or a live API probe. This epic tracks remediation; it fixes nothing on its own.
The state of the fork, measured
$ git rev-list --count upstream/main..HEAD # commits ahead
0
$ git rev-list --count HEAD..upstream/main # commits behind
9
$ git grep -il sanmarcsoft # SanMarcSoft-specific content
(nothing)
Zero local commits. No charter, no AGENTS.md, no ISA.md. REALIGNMENT/ is upstream's own document, not ours. Upstream ships roughly 20 commits per day.
The one finding that matters most
The mirror is publishing cosign-signed container images of code nobody here has reviewed.
.github/workflows/docker.yml fires on every push to main (line 4), derives the image name from github.repository (line 122), pushes unconditionally (push: true, line 132), and signs the multi-arch index with keyless Sigstore OIDC (lines 354-381). Because syncing upstream means pushing to main, each sync publishes to ghcr.io/sanmarcsoft/headroom under SanMarcSoft's own signing identity.
This already happened. Run 30155106724, Docker, main, push, succeeded in 11m32s on 2026-07-25.
An organisation whose business is content provenance is currently attesting to third-party code it has not read. That is the finding that reframes the rest.
Severity roll-up
| # |
Severity |
Finding |
Surface |
| #1 |
CRITICAL |
Mirror publishes cosign-signed GHCR images of unreviewed code |
CI |
| #2 |
CRITICAL |
RCE via trust_remote_code=True on a request-supplied model string |
code exec |
| #3 |
HIGH |
SSRF via unconditional x-headroom-base-url |
proxy |
| #4 |
HIGH |
Unauthenticated data plane on the default docker-compose bind |
proxy |
| #5 |
HIGH |
headroom wrap Docker path publishes the port on all interfaces |
code exec |
| #6 |
HIGH |
Unpinned, unverified remotely-fetched executables at runtime |
supply chain |
| #7 |
HIGH |
CI actions unpinned, gitleaks unverified, token scopes missing |
CI |
| #8 |
HIGH |
Credential and memory at-rest hardening gaps |
credentials |
| #9 |
HIGH |
Egress and data-sovereignty audit outstanding |
egress |
| #10 |
HIGH |
The fork has no declared purpose |
governance |
| #11 |
HIGH |
Inherited automation runs unattended on the mirror |
governance |
| #12 |
MEDIUM |
GitHub security features are switched off |
platform |
| #13 |
MEDIUM |
No sync cadence, no drift alerting, no branch protection |
governance |
| #14 |
MEDIUM |
Upstream disclosure decision outstanding |
governance |
Convergent findings, reached independently by three or more agents: unverified code fetched from mutable remote references and then executed (#2, #6, #7, and the CDN half of #9), and live automation on an unowned mirror (#1, #11, #13).
Steelman: why holding this fork is defensible
- Zero local commits means every upstream fix is a pure fast-forward, the cheapest state a fork can hold.
- Upstream governance is genuinely strong:
SECURITY.md, gitleaks and gitguardian scanning, cosign-signed images, release-please.
- A fork gives an independent copy if upstream disappears, is acquired, or relicenses.
- The inherited
REALIGNMENT/ documents are upstream's own admission of architecture debt, free due diligence.
- Holding the code locally is what made this assessment possible at all; a dependency pin would not have.
- An LLM proxy in the request path is strategically interesting for a provenance business, worth understanding deeply.
- The security posture found here is above average for self-hosted proxies: loopback guards, strict TLS defaults, opt-in prompt logging.
- Nothing here is broken today, and the cost of holding the option open is close to zero.
Counter-argument: why that is not enough
- A fork nobody has declared a purpose for is a bookmark carrying liabilities, not an asset.
- The option is not free: it publishes signed images and burns CI minutes on every sync.
- Signing unreviewed third-party code with our identity inverts the exact value the business sells.
- "Zero local commits" is a snapshot, not a property; the first patch converts it into permanent merge work.
- Twenty upstream commits a day means the mirror silently drifts out of security parity, not just feature parity.
- The build path violates the standing Nix and Scaleway-registry SOP; nobody has decided whether that is an accepted exception.
- Reading the code required no fork; a shallow clone would have produced this same assessment.
- Every technical finding here is upstream's bug. The only findings that are genuinely ours are the governance ones, and those are unowned.
Remediation checklist
Sequencing
Stop the bleeding first: #1 and #11 are configuration changes that close the active exposure within minutes and cost nothing.
Then decide: #10 is the root cause. Every remaining item is scoped differently depending on whether this fork is kept or retired. If it is retired, #2 through #9 collapse into #14 (tell upstream) plus a dependency pin.
Then fix: #2 through #9 in severity order, but only after #10 says the fork is ours to patch.
What this assessment deliberately did not do
Scaffolding created for this epic
GitHub Issues was disabled on this repository and was enabled to file this work. Labels (epic, security, supply-chain, ci-cd, credentials, egress, governance, fork-sync, priority:*) and the Fork Hardening Wave 1 milestone were created. Org project Headroom Fork (#12) was created as the board. Issue Type could not be set: the session token is refused issueTypes access at the org level, so type is carried as a label instead.
Adversarial assessment of
Sanmarcsoft/headroomrun 2026-07-25 by six parallel red-team agents across six disjoint attack surfaces (CI supply chain, proxy network surface, credential handling, code-execution surfaces, fork governance, egress and telemetry). Every finding below citesfile:lineor a live API probe. This epic tracks remediation; it fixes nothing on its own.The state of the fork, measured
Zero local commits. No charter, no
AGENTS.md, noISA.md.REALIGNMENT/is upstream's own document, not ours. Upstream ships roughly 20 commits per day.The one finding that matters most
The mirror is publishing cosign-signed container images of code nobody here has reviewed.
.github/workflows/docker.ymlfires on every push tomain(line 4), derives the image name fromgithub.repository(line 122), pushes unconditionally (push: true, line 132), and signs the multi-arch index with keyless Sigstore OIDC (lines 354-381). Because syncing upstream means pushing tomain, each sync publishes toghcr.io/sanmarcsoft/headroomunder SanMarcSoft's own signing identity.This already happened. Run
30155106724,Docker,main,push, succeeded in 11m32s on 2026-07-25.An organisation whose business is content provenance is currently attesting to third-party code it has not read. That is the finding that reframes the rest.
Severity roll-up
trust_remote_code=Trueon a request-supplied model stringx-headroom-base-urlheadroom wrapDocker path publishes the port on all interfacesConvergent findings, reached independently by three or more agents: unverified code fetched from mutable remote references and then executed (#2, #6, #7, and the CDN half of #9), and live automation on an unowned mirror (#1, #11, #13).
Steelman: why holding this fork is defensible
SECURITY.md, gitleaks and gitguardian scanning, cosign-signed images, release-please.REALIGNMENT/documents are upstream's own admission of architecture debt, free due diligence.Counter-argument: why that is not enough
Remediation checklist
trust_remote_code=Truex-headroom-base-urlheadroom wrapbinds the port to all interfacesSequencing
Stop the bleeding first: #1 and #11 are configuration changes that close the active exposure within minutes and cost nothing.
Then decide: #10 is the root cause. Every remaining item is scoped differently depending on whether this fork is kept or retired. If it is retired, #2 through #9 collapse into #14 (tell upstream) plus a dependency pin.
Then fix: #2 through #9 in severity order, but only after #10 says the fork is ours to patch.
What this assessment deliberately did not do
headroomlabs-ai/headroom. That decision is tracked in [MEDIUM] Private security notice to upstream: decide yes or no (no PR, per M directive) #14.git status --porcelainwas empty at the close of the run.Scaffolding created for this epic
GitHub Issues was disabled on this repository and was enabled to file this work. Labels (
epic,security,supply-chain,ci-cd,credentials,egress,governance,fork-sync,priority:*) and theFork Hardening Wave 1milestone were created. Org projectHeadroom Fork(#12) was created as the board. Issue Type could not be set: the session token is refusedissueTypesaccess at the org level, so type is carried as a label instead.