docs(security): record the rule-8 guardrail tests as closed (§21) - #270
Merged
Conversation
The §15.3.1 item carried through §16.3a, §18.6, §19.6 and §20.5 is done: rule 8 now has regression coverage in all eleven SDKs. Corrects the count. Every prior section said nine SDKs outstanding; it was eight. PHP already had the test — it is where the pattern was first written — and TypeScript and Python landed in the §16 round. The "nine" figure came from subtracting only those two from eleven and was carried forward without being re-derived. Records that this was not purely a guardrail exercise: the Java Spring filter rejected correctly but never cleared the ambient SecurityContext, so a rejected caller left behind whatever identity was already on the thread. §15.1's hand-verification asked whether each guard rejects, and every guard does; this is the different question of what a guard leaves behind afterwards, which no stated property covered. Also records which SDKs carry the structural shape SEC-085 exploited (Kotlin, C, C# hand the guard a stateful client), what makes the tests non-vacuous (each asserts that a substitution was genuinely available before asserting it was not taken), the falsification results, and that C#/Swift could not be run locally — C# failed CI on exactly that risk, Swift passed first try. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SkTHvZQMV47t3UwkEtmB1D
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.
Docs-only. Closes the §15.3.1 item that had been carried through §16.3a, §18.6, §19.6 and §20.5 — rule 8 now has regression coverage in all eleven SDKs.
Merged: go#29 · rust#43 · kotlin#16 · java#37 · c#15 · cplusplus#13 · csharp#33 · swift#15
A correction to the count
Every prior section said nine SDKs outstanding. It was eight. PHP already had
Sec085GuardCredentialSubstitutionTest— it is where the pattern was first written, as §15.3.1 itself says — and TypeScript and Python landed in the §16 round. The "nine" came from subtracting only those two from eleven, and was repeated forward without being re-derived.It was not only a guardrail
The Java Spring filter rejected correctly (401, chain not invoked) but never cleared the ambient
SecurityContext, so a rejected caller left behind whatever identity was already on the thread — from an earlier filter, or a pooled container thread. That's the servlet analogue of the SEC-085 substitution.§21.2 records why §15.1's hand-verification missed it, which is the part worth keeping: that pass asked whether each guard rejects, and every guard does. This is the different question of what a guard leaves behind after rejecting — a property nobody had stated, so hand-verification could not have caught it. Writing the test did.
What the section adds
dotnetandswiftwere unavailable locally. C# failed CI on exactly that risk (FakeAxiamServerHandlerisprivateand nested, so unreachable); Swift passed first try on 5.9 and 5.10.§20.5's stale bullet is replaced with a pointer to §21.
No code changes.
🤖 Generated with Claude Code
https://claude.ai/code/session_01SkTHvZQMV47t3UwkEtmB1D
Generated by Claude Code