Skip to content

docs(asvs): correct a published attestation that was not true, and declare the scope boundary Rule 1 depends on - #157

Merged
wshallwshall merged 2 commits into
mainfrom
asvs-attestation-fix
Aug 3, 2026
Merged

docs(asvs): correct a published attestation that was not true, and declare the scope boundary Rule 1 depends on#157
wshallwshall merged 2 commits into
mainfrom
asvs-attestation-fix

Conversation

@wshallwshall

Copy link
Copy Markdown
Collaborator

Split out of #156 at the owner''s direction so the urgent correction lands without waiting on review of a bundled feat commit. Two cherry-picked commits, docs only, no code.

The problem, live on main right now

docs/Secure_Development_Standards.md:367 publishes:

…tested per NIST SP 800-115, verified against OWASP ASVS 5.0 Level 3, …

The ASVS survey is at 124/345 examined (35.9%), 221 cells unverified. "Verified against ASVS 5.0 Level 3" is not supportable, and it is a published security attestation in a public repository — the only item in this thread with an audience outside the repo.

The fix

The live sentence becomes "assessed against OWASP ASVS 5.0 using Level 3 as the target — an assessment in progress, not a completed verification."

The old wording is quoted, not erased, in a dated note that records why it was unsupportable: the survey is incomplete; open requirements exist including at Level 2, so narrowing the level would not have rescued it; and at least one Level 3 requirement is scoped out as a hosting-platform property, which under ASVS 5.0 does not preserve a Level 3 claim. Correcting a published claim by silently editing it would itself be a defect.

Why the scope boundary rides along

The rubric''s Rule 1 is "Does the requirement apply to this product on the declared scope (§2)?" — it delegates applicability to §2. main''s §2 declares no platform-substrate boundary, so Rule 1 could not produce na for a CPU/firmware property. These commits add that boundary (§2 substrate text, §2.1 what an out-of-scope cell does not buy, §2.2 a count movement is not a posture movement), and update the 11.7.1 row to na under Rule 1 accordingly — matching the owner''s ruling.

Declare the boundary, then apply the rule. Landing the verdict without the boundary would leave the public rubric justifying fail while the register says na.

Verification

Not included

The feat gate (scorecard.py +61, tests +83) and the ADR 0152 / PHI.md / CONFIGURATION.md edits remain in #156, unreviewed and unarmed.

🤖 Generated with Claude Code

… attestation that was not true

Two public documents, one cause: the assessment method never wrote down where the
software ends and the substrate begins, so a platform-property requirement had no
principled home and churned between verdicts -- and separately, a published
attestation claimed more than the record supports.

ASVS-ASSESSMENT-METHOD.md
  * Section 2 now states the boundary the "assessed as source" phrase already implied:
    the subject is three SOFTWARE ARTIFACTS, not the host, hypervisor, CPU, firmware
    or network. Where a requirement's VERB names a property of that substrate, rule 1
    applies. This is ASVS's own principle and is now quoted verbatim from 0x03 at the
    v5.0.0 tag rather than paraphrased -- "excludes requirements ... where
    configuration is outside the application's responsibility", with the DNS example.
  * Two guards, because a scope clause grows to swallow inconvenient cells: reporting
    on a platform property is not providing it AND is not disqualifying either -- ask
    what the verb requires, and of what.
  * Explicitly declines the fork route. 0x03 does say organizations are "strongly
    encouraged" to fork, but its omission examples are technology-not-used
    (GraphQL/WebSockets/SOAP) and forking changes what you claim conformance TO.
    Rule 1 against a declared scope is narrower and leaves the target unchanged.
  * New section 2.1: what an out-of-scope cell does NOT buy. 4.0's "may still claim
    full ASVS compliance" clause was DROPPED in 5.0, and OWASP retains normative
    authority over which requirements sit at which level -- so an L3 claim omitting an
    L3 requirement is non-conformant on OWASP's own terms.
  * 11.7.1 moves from the worked example of a rule-3 fail to the worked example of a
    rule-1 na, with the objection it has to answer stated rather than omitted.

Secure_Development_Standards.md
  * "verified against OWASP ASVS 5.0 Level 3" -> "assessed against ASVS 5.0 using
    Level 3 as the target -- an assessment IN PROGRESS". The old wording was
    unsupportable three ways: the survey is incomplete and unread cells are explicitly
    not passes; open requirements exist including at L2; and an L3 requirement is
    scoped out, which under 5.0 does not preserve an L3 claim.
  * The correction is stated in the document rather than made quietly, because the
    claim was PUBLISHED. No figure is restated here, deliberately, so this page cannot
    go stale against the record.
  * Notes that no accredited L3 pathway exists to appeal to: OWASP certifies nobody,
    and the one ASVS-based scheme accredits testing FIRMS at L1-L2.
…the four causes

When 11.7.1 was scoped out under rule 1, the fail count went 3 -> 2 with ZERO lines
of engine code changed. A reader comparing only the totals across those two days
concludes a defect was fixed. Nothing was. The rationale sits on the cell and the
boundary sits in section 2, but neither is visible to someone reading a number.

New section 2.2 names the four causes a bucket total moves, of which exactly one is
an improvement: a control shipped on by default (real); a cell read for the first
time (the survey advanced -- unverified -> pass is a DISCOVERY, not a fix); a scope
boundary stated (identical code, smaller denominator); a rule applied more carefully
(more accurate, and these move DOWN too).

Two obligations, both cheap: never report a total as a trend without naming which
cause moved it, and when a count improves, state what would have had to happen for it
to MEAN improvement and whether that happened -- the negative-control discipline
applied to a metric.

Written down because it cuts AGAINST us more often than for us. The survey is
incomplete, so most future movement is cause 2, and the aggregate will get worse
before it gets better as unverified cells resolve into real verdicts. That is the
survey working, and it should be reported as such rather than defended against.

Sits directly under 2.1 (an out-of-scope cell buys no Level 3 claim), because the two
failure modes are the same one seen from opposite ends: 2.1 stops a scoped-out cell
becoming a conformance claim, 2.2 stops it becoming a trend line.

Prompted by the ASVS-11.7.1-summary session, whose objection -- that the rule-3
observations about the code stay literally true even after the verdict moves -- is
what made the gap visible.
@wshallwshall
wshallwshall enabled auto-merge (squash) August 3, 2026 00:37
@wshallwshall
wshallwshall merged commit 5ad42ac into main Aug 3, 2026
31 checks passed
@wshallwshall
wshallwshall deleted the asvs-attestation-fix branch August 3, 2026 00:38
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