docs(security): argue secure design principles in the assurance case - #767
Merged
Merged
Conversation
The OpenSSF Best Practices silver criterion assurance_case requires four things: a threat model, identified trust boundaries, an argument that secure design principles have been applied, and an argument that common implementation weaknesses have been countered. threat-model.md covered the first, second and fourth. The third was missing, so the criterion could not honestly be claimed. The new section argues four principles from the configuration and code that implement them: deny by default (the catch-all access rule and the anchored public paths, the scope opt-in for API tokens), least privilege (a token cannot exceed its issuing user; the release jobs hold contents:read except the one that creates the release), complete mediation of half-finished logins (2FA in progress, passkey registration requiring a full login), and defence in depth where one control is known to be insufficient. It closes with what the arguments do not cover. .bestpractices.json proposes the resulting answer to the BadgeApp, which reads that file and offers the value in the form. A maintainer still has to open project 11719 and save; the file removes the typing, not the login. Claude-Session: https://claude.ai/code/session_01GTLkVWstQvWJo4wT8pQFxs Signed-off-by: Sebastian Mendel <info@sebastianmendel.de>
|
Member
Author
|
Self-review: bd42dec The bot review this pull request demands is unsatisfiable (Copilot quota wall or repeated bot failures on this head). The diff on this head was reviewed by the PR author; this comment is the on-the-record attestation the merge gate reads back. It stops matching on the next push. |
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.



Merging this lets the OpenSSF silver criterion
assurance_casebe answered Met, and hands the answer to the badge form so nobody has to retype it. Silver currently stands at 98 % with this as the one blocking criterion.Why the criterion could not be claimed before
The criterion requires four things: a description of the threat model, clear identification of trust boundaries, an argument that secure design principles have been applied, and an argument that common implementation security weaknesses have been countered.
threat-model.mdcovers three of them — it has a Trust boundaries section, and its thirteen threats name LDAP injection, SQL injection, CSRF, XSS, privilege escalation in both directions and hostile integration data, each with the control that answers it. The third element had no home in either document:grep -i 'design principle|least privilege|defense in depth'across both returned nothing.What the new section argues
Four principles, each from the configuration or code that implements it rather than as a claim about intent:
security.yamlends on the catch-all^/rule, and the public entries above it are anchored (^/\.well-known/,^/llms\.txt$) so a look-alike path cannot inherit access. For API tokens,RequireScopeSubscriberrefuses a request to any controller that has not declared a scope.ApiTokenAuthenticatorbuilds the token's identity from the owning user's roles and the token's scopes, so a scope can only narrow.release.ymldeclarespermissions: {}and grants per job; inside the reusable, the job that builds and signs holdscontents: readand only the job that creates the release holdscontents: write.^/2farequiresIS_AUTHENTICATED_2FA_IN_PROGRESS, passkey registration requiresIS_AUTHENTICATED_FULLY, so a session resumed from the remember-me cookie cannot mint a permanent credential.It closes by naming what the arguments do not cover: they are reconstructed from the code, and no formal design review precedes a change.
The proposal file
.bestpractices.jsonat the repository root is read by the BadgeApp, which offers its values in the form (spec). It carries onlyassurance_case, because that is the only criterion this commit makes true; everything else stays as recorded. Writing to the badge still needs a logged-in maintainer — the API accepts no token for writes — so a maintainer opens project 11719 and saves. The file removes the typing, not the login.One claim corrected during writing
A first draft said
RequireScopeCoverageTestfails when a controller is added without a scope. It does not: it reads every declared scope by reflection, fails on one outside theApiScopetaxonomy, and keeps a floor count against wholesale removal. The section says that instead.Assisted by claude-code:claude-opus-5-5 — Session