Releases: bjcorder/SessionScope
Releases · bjcorder/SessionScope
Release list
SessionScope 0.2.0
Added
- Added
docs/COVERAGE_MATRIX.mdas the per-check source of truth for supported, review-required, and intentionally not-covered SessionScope evidence patterns across languages, frameworks, libraries, lifecycle stages, finding categories, and SARIF rule IDs. - Added v0.2 P1 cookie hardening coverage for
__Host-/__Secure-prefix rules,Partitionedcookie review, broad non-session Domain review, and same-handler conflicting cookie writes across existing JS/TS/Python cookie detectors. - Added v0.2 P2 JWT crypto-trust coverage for
alg:none, HMAC/asymmetric algorithm-confusion signals,jku/x5u/embedded-JWK header trust review, missingnbfvalidation, broad clock-skew review, and unvalidatedkidheader review across existingjsonwebtoken,jose, and PyJWT detector surfaces. - Added v0.2 P3 OAuth/OIDC flow integrity coverage for PKCE,
state, OIDCnonce, broad redirect URI review, and client storage hygiene checks for localStorage, sessionStorage, URL path/fragment token exposure, and browser-path client secrets. - Added
jwt_denylist_absent_on_logout_reviewlifecycle coverage for access-JWT logout flows that lack linked denylist, blocklist, or token revocation-store evidence. - Added
refresh_family_revocation_absent_on_logout_reviewlifecycle coverage for refresh-token logout flows that lack linked family/user-scoped revocation evidence. - Added
sliding_expiry_without_rotation_reviewlifecycle coverage for rolling/sliding session expiry that lacks linked session or refresh-token rotation evidence. - Added
password_change_global_revocation_absent_reviewlifecycle coverage for password-change handlers that lack linked global session invalidation, refresh-family revocation, or token-version bump evidence. - Added clean-baseline false-positive fixtures across Express, Next.js, FastAPI, Django, generic JS/TS, and generic Python to guard every v0.2 P1-P4 check ID.
- Added hand-rolled JSON report snapshot tests for representative Express, Next.js, FastAPI, Django, generic JS, generic TS, and generic Python fixtures.
- Added Rust integration-test coverage for the documented CLI advisory/enforce exit-code policy matrix.
- Documented the consolidated v0.2 category audit decision: all P1-P4 checks map to existing finding categories, with no schema or SARIF rule change.
- Completed the v0.2 edge-case hardening documentation pass across the changelog, README status, roadmap, and coverage matrix.
- Extended report redaction for OAuth/OIDC
state,nonce,code_verifier, andcode_challengevalues in assignments, object keys, and URL parameters.
Pre-release remediation (v0.1.0 readiness)
Critical fixes
- F-01 Single-pass bounded file read in
sessionscope-core::source—
closes a TOCTOU window and bounds allocation at read time so a growing
target file cannot exhaust scanner memory. - F-02 Worker-thread panics are caught and reported as
SkippedReason::ReadError("detector panic")instead of aborting the
scan.ScanSummary.worker_panic_countsurfaces the count.
High-severity fixes
- F-03 Discovery refuses symbolic links and verifies each entry stays
under the canonical scan root (defense-in-depth against hostile target
repositories that point in-tree links at host secrets). - F-04
scripts/github-action.shrejects..segments in the action
pathinput and resolves the path inside$GITHUB_WORKSPACE. - F-05 Stable-ID FNV separator changed from
0(no-op) to0xFFso
("ab","c")and("a","bc")produce distinct hashes. All stable
artifact, evidence, finding, lifecycle-path, and baseline fingerprint
IDs change pre-release — no v0.1.0 contract has been published yet. - F-06
SanitizedExcerptis now non-constructible from rawString;
every detector excerpt must flow throughsafe_excerpt,
safe_excerpt_at_location, orsanitize_excerpt. Twocompile_fail
doctests enforce the boundary. - F-07 Baseline fingerprints use the new serde-stable
stable_name()
helpers onFindingCategory,Severity,Confidence, and
LifecycleStageinstead offormat!("{:?}", …), so future rustc
Debug-format tweaks cannot silently invalidate every saved baseline. - F-08
zmij 1.0.21(transitive ofserde_json 1.0.149) reviewed
and accepted: legitimate dtolnay-authored Schubfach/Żmij float-to-string
port. Audit recorded indocs/DEPENDENCY_REVIEW.md.
Medium-severity fixes
- F-09 Excerpt redaction is context-aware: under
RedactionContext::Cookies,Jwt,Bearer, orApiKeyany string
literal ≥16 chars is stripped even when the variable name is not in
the sensitive allowlist. - F-10 Per-file CPU and memory budgets — default
max_file_size_byteslowered to 512 KB, worker count clamped to
min(available_parallelism(), 4), per-file wall-clock budget defaults
to 2 s, minified files get half the budget. NewSkippedReason::Timeout
variant. - F-11 Action
baselineinput now passed via--baseline -- "$baseline"
so smuggled flags cannot disable policy enforcement. - F-12
sessionscope evaluatenow honourssessionscope.tomlpolicy
config the same wayscandoes, via the sharedcommands::policy
helper. Closes a CI-bypass where TOML-configured enforce mode silently
degraded to advisory on the evaluate command. - F-13
ScanSummary.skipped_by_reason: BTreeMap<SkippedReasonKind, u32>
andScanReport::has_critical_failures()expose per-reason skip counts
so CI integrations can detect crippled scans. - F-14
ProjectConfig::load_default()distinguishesNotFound(use
empty config) fromPermissionDenied(surface error) when reading
sessionscope.toml. - F-15
SkippedReason::ReadErrorstrings carry only the
io::ErrorKindlabel (e.g."permission denied"); raw OS error
strings that can leak absolute paths and operator usernames no longer
reach reports.
Low-severity polish
- F-16
WalkBuilder::parents(false)— scanner never reads
.gitignore/.ignorefiles above the scan root. - F-17 Directories and files that do not strip-prefix cleanly
against the scan root are skipped withSkippedReason::Excludedand a
basename-only display, never under their absolute filesystem path. - F-18 SARIF emits
originalUriBaseIds.SRCROOTwith percent-encoded
relativeartifactLocation.urivalues per SARIF 2.1.0 §3.4.4. Output
round-trips throughserde-sarif. - F-19 All CLI report paths use
println!for consistent trailing
newlines; renderers strip embedded trailing newlines via a shared
helper. - F-20
ScanError::source()is implemented so error chains surface
the underlyingio::Error. - F-21
CommandResulttype alias is documented as intentional at
the CLI boundary. - F-22
sanitize_evidenceshort-circuits when the excerpt is
already canonical, halving regex work on common second-pass paths. - F-23 Canonical FNV hash lives in
sessionscope_model::stable_hash;
baseline.rs::stable_fingerprintdelegates so the two sites cannot
drift. - F-24 GitHub Action wrapper writes the rewritten SARIF to
<path>.tmpthenos.replace, so a crash mid-rewrite cannot leave a
zero-byte SARIF.
Informational / supply chain
- F-25 Dependabot watches
slsa-framework/slsa-github-generator;
trust decision (pin-by-tag for the reusable workflow) documented in
RELEASING.md. - F-26 Release workflow includes a cold/warm reproducibility check
assertingsha256sumequality across two builds. - F-27 Release workflow generates a CycloneDX SBOM
(sessionscope-<version>.cdx.json) and attaches it to GitHub Releases. - F-28
cargo auditadvisory database cached across CI runs via
actions/cache@<sha>. - F-29 SARIF rule-ID stability commitment documented in
docs/SARIF_RULES.md. - F-30 Independent versioning policy (crate, report schema,
baseline/diff schema) documented indocs/SCHEMA.mdand
docs/RELEASES.md.