Skip to content

docs: a security policy — needs private vulnerability reporting enabled before merge - #780

Merged
tannevaled merged 1 commit into
mainfrom
wave62-security-policy
Oct 9, 2026
Merged

tannevaled merged 1 commit into
mainfrom
wave62-security-policy

Conversation

@tannevaled

Copy link
Copy Markdown
Contributor

There is no SECURITY.md in this repository, and none in go-embedded-ruby/.github either (both verified, 404). So a researcher who finds something has nowhere to send it except the public issue tracker.

That mattered less yesterday. The audit in #768 has just filed nine findings in the open, which is a standing invitation for the next person to do the same with something worse.

⚠️ Do not merge this until one setting is turned on

The policy tells people to report through GitHub's private vulnerability reporting, which is currently disabled on this repository:

$ gh api repos/go-embedded-ruby/ruby/private-vulnerability-reporting --jq .enabled
false

It needs enabling at Settings → Code security → Private vulnerability reporting, or gh api -X PUT repos/go-embedded-ruby/ruby/private-vulnerability-reporting. Until then the policy names a channel that does not exist, which is worse than having no policy — so this is yours to flip, and I have deliberately not tried to do it for you.

I chose that channel over an email address because it does not publish anyone's personal address on a public repository. If you would rather use an address, or a different channel entirely, say so and I will rewrite the Reporting section instead.

While you are on that page, three other defensive settings are also off and are free: secret scanning, push protection, and Dependabot security updates. Each is reversible with one click and none of them creates an obligation the way an inbox does.

What the policy actually says

Two sections carry the content; the rest is short on purpose.

In scope is written from what this audit found, not from a template:

Not a vulnerability is the part that keeps the inbox usable:

Run is not a sandbox, and that is documented, not accidental. […] So a report that system("...") executes a command is working as intended. A report that a documented restriction does not hold is not.

And, by the same reasoning, faithfully reproducing something that is dangerous in MRI — Marshal.load on attacker-controlled bytes — is conformance here rather than a defect. The policy still invites a report if the documentation fails to warn about it, which is the honest line to draw for a conformance project.

It is also deliberately modest about response time. There is no security team, and a timeline nobody is on call for is worth less than saying so plainly. What it does promise is that a report gets read, gets a plain answer about scope, and gets credit.

Finally it lists the six already-filed classes, so a duplicate costs the reporter nothing to avoid.

Merge order

The link to Run is not a sandbox resolves once #770 merges — that PR adds the heading. Verified: the string is not on main today. So #770 first, then this.

🤖 Generated with Claude Code

… now public

There is no SECURITY.md in this repository and none in the organisation's
.github repository, so a researcher who finds something has nowhere to send it
except the public issue tracker. That mattered less before today; the security
audit in #768 has just filed nine findings in the open, which is an invitation
for the next person to do the same with something worse.

The policy is deliberately modest about response: this is a small project with
no security team, and promising a timeline nobody is on call for would be worth
less than saying so.

Two parts carry the actual content.

What is IN scope is written from what the audit actually found, not from a
template: the host process dying or hanging without bound on Ruby input (because
`Run` returns an error, and an embedder cannot defend against a `fatal error:`
from outside); failing to raise where MRI raises when a program relies on the
raise to stay safe -- the fail-open class, which is invisible to the caller;
reaching past the documented capability set; and the CI/release path.

What is NOT a vulnerability is the part that keeps the inbox usable. `Run` is
not a sandbox, and that is documented rather than accidental, so "system()
executes a command" is working as intended. By the same reasoning, faithfully
reproducing a behaviour that is dangerous in MRI -- Marshal.load on hostile
bytes -- is conformance here, though it is still worth hearing if the
documentation fails to warn about it.

It also lists the six already-filed classes, so a duplicate costs the reporter
nothing to avoid.

The channel is GitHub's private vulnerability reporting, which is currently
DISABLED on this repository and has to be turned on for the policy to be
truthful -- see the pull request. It was chosen over an email address because it
does not publish anyone's personal address on a public repository.

The link to the README's "Run is not a sandbox" section resolves once #770
merges, which is what adds that heading.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@tannevaled

Copy link
Copy Markdown
Contributor Author

The condition this was held on is now met

$ gh api repos/go-embedded-ruby/ruby/private-vulnerability-reporting --jq .enabled
true

Private vulnerability reporting is enabled, so the channel this policy names
now exists and a report sent through it reaches someone. That was the whole of
the hold, and it was written as a measurable condition precisely so it could be
re-checked rather than remembered.

Checks are 9/9 green and the branch is CLEAN MERGEABLE. Merging.

Measured alongside it, and not part of this PR — two of the sibling
repositories still have it off, and both were tagged today:

repository private reporting secret scanning push protection
go-embedded-ruby/ruby ✅ ✅ ❌
go-ruby-parser/parser ✅ ✅ ❌
go-ruby-yaml/yaml ❌ ❌ ❌
go-fleettools/fleettools ❌ ❌ ❌

🤖 Generated with Claude Code

@tannevaled
tannevaled merged commit 9cb2fd7 into main Oct 9, 2026
9 checks passed
@tannevaled
tannevaled deleted the wave62-security-policy branch October 9, 2026 13:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant