Research

Reachability is not confidentiality: the 2.3.1 exposure change

Why ShakerScan 2.3.1 stopped promoting a reachable file to a verified confidential finding, what still counts as a proven exposure, and what the change cost on the Juice Shop benchmark.

PublishedSeptember 12, 2026
UpdatedOctober 16, 2026
AuthorShakerScan maintainers
Reading time3 min

Environment Open-source repository at tag v2.3.1 (tagged 2026-09-11). Quotes are from the 2.3.1 release notes, the Juice Shop fixture, and the agent operating policy at that tag.

release-engineeringprooffindings

Summary

Earlier releases treated reaching a file as proof that its contents were sensitive. If a scan found a document through a browsable directory listing, the report carried a verified confidential-exposure finding. 2.3.1 changes that: reaching a file is now a listed_file observation, and only content-specific proof contracts promote it. Server-state exposures that are deterministic, such as a browsable directory index or a served /metrics endpoint, are still proven. The change lowered the Juice Shop benchmark's enforced recall from 0.44 to 0.33, and the maintainers chose to record that as a visible declared gap rather than hide it.

Problem

The 2.3.1 release notes describe the correction: "Reaching a file — including through a browsable directory listing or a well-known location such as RFC 9116 /.well-known/security.txt — is recorded as a listed_file observation, not a verified confidential finding. A filename, a path, or a directory entry is not proof the content is sensitive."

That matters for a product whose findings carry a proof state. A verified finding is supposed to mean deterministic evidence was collected, so an over-promoted exposure is not a cosmetic severity problem. It is a proof-contract violation that a downstream consumer, a CI gate, or a customer review would have relied on.

How it works

Observation by default. Any reachable file, whether from a directory listing, a well-known location, or content discovery, becomes a listed_file observation.

Promotion only through content contracts. The release notes list what promotes a file to a proven exposure: "the secret-material classes (private key, cloud credential, environment secret), a recovered version-control store, or a backup/source artifact recognized by shape."

Server state is still proven. "Exposures that are themselves deterministic server state are still proven: a browsable directory index and a served /metrics endpoint report at high, verbose error disclosure at medium." Framework-fingerprint and API-specification observations report at informational severity, and actuator detection "now keys on the Spring vendor media type instead of generic _links/status shapes." The notes close the section with: "Location alone never establishes sensitivity, on any target."

The narrow secret set is a contract. AGENTS.md describes the unauthenticated data_exposure proof as recognising "only a narrow, entropy-screened set of self-evident secret formats. JWTs, bearer tokens, SSNs, card numbers, and Google API keys are excluded because public endpoints may legitimately issue them or documentation samples match. A public value outside that set is an observation, not a verified exposure; widening the set is a proof-contract change, never a per-target tuning."

Benchmark consequence

The Juice Shop answer key includes exposed-confidential, a specific document reachable under /ftp. Under the corrected policy its confidentiality is not deterministically provable, so the fixture at v2.3.1 moves it to a declared gap:

  • min_expected_recall drops from 0.44 (4 of 9) to 0.33 (3 of 9): sqli-search plus the two deterministic exposures, the /metrics endpoint and the /ftp listing.
  • min_verified_high_critical drops from 6 at v2.3.0 to 3, with the comment "per-file confidentiality is no longer force-verified".
  • max_known_expectation_gaps grows from 5 to 6.

The fixture's own words: "This is a characterized change to what the benchmark measures, not a blanket threshold cut: the answer key is unchanged, the new gap names its reason, and a NEW miss, a recall drop below the reconciled level, or a seventh gap still fails."

Boundaries

  • The release notes state "No change to the deterministic proof boundary." The correction narrows what the exposure engine claims; it does not add a proof path.
  • The other changes in 2.3.1 are unrelated to detection: non-destructive target archiving, evidence-deletion consistency with ownership receipts, atomic request-collection uploads, and release-hygiene checks that reject incomplete E2E scorecards.
  • 2.3.1 was published on 2026-09-11 and promoted to the stable installer channel (docs/releases/README.md).

Limitations

  • A genuinely confidential document that is merely reachable now surfaces as an observation. Reviewers must open listed files rather than trust a severity label. This trades benchmark recall for precision on purpose.
  • The proof contracts for secret material, version-control stores, and backup artifacts are shape-based. A sensitive file of an unrecognised shape is not promoted.
  • This article quotes the release notes and fixture; it did not re-run the benchmark before and after the change.

Product implications

  • CI consumers that gate on verified high findings get fewer false promotions from directory listings. The trade is visible in the benchmark fixture rather than absorbed silently.

References

Sources are quoted from the open-source repository at the tag named above. When a document and the implementation disagree, the code, schema, and tests at that tag are authoritative. Only test systems you own or are explicitly authorized to assess.