Files
LumaWeb/state/evidence/S00-017-review.md
T
wt 1850dbc39f S00-017: Approve fail-closed SCRAM validation after independent integration checks
Changes: Accept the bounded S00-017 fixture experiment and ADR; record independent security review and handoff with remaining browser, WSS, mechanism-policy and timing limits.
Validation: Fresh-cache npm ci and npm test passed on Node 24.21.0/npm 11.19.0 with 44 integrated tests. Verify exact installed pins, eight MIT notices, HTTPS/integrity and unchanged vendor files. make check passed 72 tooling tests; inspect executor scope/message and review metadata whitespace. No browser/server interoperability or constant-time assurance claimed.

Task: S00-017
Agent: auto-security-9ab954f6e021
Role: security
Action: review
Status: done

Task title: Establish fail-closed SCRAM server-final validation
2026-10-15 02:20:57 +07:00

6.3 KiB

S00-017 independent security review

Reviewer: auto-security-9ab954f6e021 (security). Executor: auto-protocol-599343cd9e3f. Date: 2026-10-15. Decision: approve the isolated fail-closed SCRAM experiment and bounded ADR.

Input: assigned card/packet, master/startup/role/workflow documents, required TESTING, protocol role, ADR registry and S00-017 blocker; exact ACC-004/NET-003/NET-004; accepted scope/stack ADRs and direct dependency evidence/reviews/handoffs; S00-003 blocker evidence and previous handoffs. Output: independent decision, accepted ADR metadata and review handoff. No shared S01 contract is introduced.

Findings

Implementation commit 493fbaebe7 and executor message match the actual isolated plugin, tests, pins/notices and limitations. Commit path list and workflow diff examined; current source files read with clean working tree before review metadata. Source changes are confined to the card's experiment and ADR; the remaining paths are workflow/generated metadata. Parent exploratory sources, specs, shared contracts and planning definitions are unchanged.

The real Client/XML registry/feature dispatcher drives the tests; only transport/send effects are captured. Verifier tracing invokes the original processSuccess/finalize methods, never fabricates crypto results. Installed SCRAM computes proof/serverSignature using existing library composition and Node crypto, then compares the supplied verifier in finalize. Both exact RFC SHA-1/SHA-256 client proofs and finals pass. Stock missing/forged premature success is reproduced as insecure behavior. Replacement rejects those cases plus missing/forged/error/conflicting/duplicate/malformed/oversized finals after proof without success, authenticated flags or restart. Fail removes listeners, clears flags, emits failure and disconnects once; replay cannot revive a closed attempt. Reset cancels credentials/proof-send continuation; duplicate/out-of-order and rejected send/credential paths are covered.

Public shipped Client.use and registerFeature declarations and implementation support replacement before negotiation. Handler lookup is by name; duplicated order entry does not execute another handler after restart/disconnect. Installing late or alongside another replacement remains prohibited by the README. Non-PLUS SHA-256 is preferred to SHA-1; PLUS/plaintext-only offers fail and TLS binding is not invented. No authored crypto primitives, vendor patch, persistence/cache emission, real credentials, network authentication, peer/crypto log output or certificate/CORS bypass found. Public RFC credentials and example.invalid JID remain fixture data.

Strict additional-data syntax and bounds prevent library directive parsing from ignoring conflicting final attributes. They are deliberately restricted experiment policy, not full parser/resource certification. Only success additional-data and extension-free non-PLUS SHA-1/256 are accepted. Complete NET-003 mechanism selection, SHA-512, extensions/separate-final layout and actual WSS remain S00-003. Constant-time verification, browser crypto/RNG/build, advisory/provenance clearance, independent server/client interoperability and timeout policy were not tested or accepted. Node/npm pins and lock integrity establish repeatability, not adversary-resistant metadata authentication or supply-chain clearance. No acceptance defect or review blocker found within this fixture scope.

Actual independent checks

  • python3 scripts/tasks.py resume --agent auto-security-9ab954f6e021; show S00-017; packet S00-017 --agent auto-security-9ab954f6e021: exit 0 each. Review status, distinct executor and done prerequisites confirmed; no claim.
  • Read-only git log --all --grep='^S00-017:' --format='%h %s', git show 493fbae --stat and workflow sections, git status --short: exit 0; initially clean tree. Source/test/manifest/lock/notice/API reads completed.
  • PATH=/private/tmp/luma-stack-runtime/node-v24.21.0-darwin-arm64/bin:$PATH node --version / npm --version: exit 0, v24.21.0 / 11.19.0. Reused the previously accepted isolated runtime; no new archive verification claimed.
  • Same PATH npm ci --prefix experiments/0002-xmpp-library/sasl-validation --ignore-scripts --no-audit --no-fund --cache /private/tmp/luma-sasl-review-9ab954f6e021 --fetch-retries=0 --fetch-timeout=15000: exit 0; new reviewer cache, eight packages, strict HTTPS/engines retained and scripts disabled.
  • Same PATH npm test --prefix experiments/0002-xmpp-library/sasl-validation: exit 0; 44 passed, zero failed/skipped/cancelled, duration 988.838125 ms.
  • Inline Python manifest/lock/installed-license assertions: exit 0; all eight installed exact versions and MIT licenses agree, HTTPS registry/SHA512 entries retained, installed license texts present in notices and inventory complete. Client.js, plugins/sasl.js, plugins/features.js and lib/sasl/index.js byte-match parent installed original files.
  • SHA256 package-lock.json: 6413668910ec921d7871225f22fe2753ceaf32c6c185cda6d0a5fd0e27643514; validated-sasl.mjs: 196b16baa16fea051dc6502bae11f80ebea02f87634d90ea72778ee14557a3b9. Match executor evidence.
  • make check: exit 0; 282 tasks, 22 stages, 221 requirements, 211 allocated Web requirements, revision 40; 72 tooling tests in 18.231 s. Foundation integrity, not messenger readiness.
  • git diff --check before review metadata: exit 0. Final metadata diff/whitespace checked separately before approval.

Primary sources independently opened through web tools: RFC 5802 §5 and RFC 7677 §3. Web find did not locate fixture strings; canonical .txt sources fetched with curl --fail --silent --show-error and exchange sections displayed through rg, exit 0, confirmed exact transcript values. Shipped version-pinned API/source supplies library facts.

Exploratory guessed paths 0000-web-scope.md, lib/sasl/scram.js and platform/node.js were absent; actual 0000-scope.md, lib/sasl/index.js and platform/node/index.js were located/read. These failed exploratory reads are not passed checks or missing required artifacts.

Reviewer changes only ADR acceptance metadata/paragraph, review evidence, handoff and mandatory commit message plus CLI-generated transition. Coordinator must commit the review before the next session; this reviewer ends after approve and does not continue S00-003.