Repository navigation
feat: a weakened security default is a build fact like any other (ADR 0081) - #120
Merged
Merged
Conversation
… 0081)
Twelve GODEBUG names join the allow-list ADR 0050 opened for two, on a
second axis: each gates a security property the toolchain tightened, and
each reaches the binary as a build setting no image, manifest or container
environment states.
Measured on go1.26.7: a main module declaring `go 1.21` gets a
DefaultGODEBUG of 30 names in 502 characters, nine of them holding a
security default at its pre-tightening value. Three further names —
execerrdot, tarinsecurepath, zipinsecurepath — have no version-dependent
default and reach a build only through an explicit //go:debug line, so
carrying them says someone chose the weakening rather than inherited it.
The parse ADR 0050 built is untouched; only the set of names it keeps.
No new read, no new RBAC: the setting is in build info the node scanner
already opens, and the filtering stays on the node.
go test ./... — pass
golden go_build — 836 -> 959 bytes
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeZECJXTDHL6Nts95eKMJA
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Twelve GODEBUG names join the allow-list ADR 0050 opened for two, on a second axis. Each gates a security property the toolchain tightened, and each reaches the binary as a build setting no image, manifest or container environment states — so it is legible only from the binary, which is where the node scanner already looks.
What is kept, and on what test
A name is kept when it is not
Opaquein the toolchain'sinternal/godebugstable, holds0or1, and one of its two values is a documented weakening. That is ADR 0019's test for the list unchanged, applied to a second kind of question.tls10server,tls3des,tlsrsakex,tlssha1,tlsunsafeekm,x509negativeserialrsa1024min,cryptocustomrandhttplaxcontentlength,tarinsecurepath,zipinsecurepath,execerrdotThe parse ADR 0050 built is untouched; only the set of names it keeps.
Measurements
Both on go1.26.7, and both fixed in tests as constants rather than paraphrased.
go 1.21gets aDefaultGODEBUGof 30 names in 502 characters, nine of them holding a security default at its pre-tightening value. Nobody chose those nine — they follow from thegodirective, which is the fact ADR 0050 §2 already identified as deciding GODEBUG defaults.go 1.26module carrying three//go:debuglines emits exactly those three names.execerrdot,tarinsecurepathandzipinsecurepathhave no version-dependent default, so carrying them means the weakening was chosen rather than inherited.Two things the agent deliberately does not do
It does not encode which value is the weak one.
tls10server=1andrsa1024min=0both weaken. A mapping compiled into the collector would be a second place for the toolchain's table to be wrong, and judgement belongs outside the cluster.It does not guess at a name it cannot justify. ADR 0081 §4 states the rule for the first time: a name whose one-line justification cannot be written from the standard library's own documentation does not go on a list whose entries are justified one line each.
urlstrictcolonsis refused on it, alongside theOpaquenames and the ones whose value is a number rather than0/1.Docs
Amends: 0050 §1, with the mirror line on ADR 0050 and the index entry.docs/security.md— fourteen names promised where two were.docs/backend-requirements.md— normative: an absent name is not0; for the three directive-only namesgo_versionsays nothing at all;1may not be read as the weak value.Prose ceilings: the addition was compressed first (the 30-name measurement moved to the ADR, where a measured fact belongs), then
security.md1111 → 1116 andbackend-requirements.md794 → 799, each raise naming its obligation in the table comment.Not changed
No new RBAC, no new read, no new privilege.
DefaultGODEBUGis in build info the node scanner already opens, and the parse runs on the node before the node→controller channel, so nothing outside the list crosses the wire (CLAUDE.md invariant 4).go_buildstays write-once per image digest.Verification
🤖 Generated with Claude Code
https://claude.ai/code/session_01KeZECJXTDHL6Nts95eKMJA