fix: reconcile the four untracked findings in the security audit#40
Merged
Conversation
…gister Follow-up pass, same-day as the last update (2026-07-20). Every claim below was independently verified against a fresh clone of traverse-framework/traverse at current main (9c2806c) before writing it — not taken on trust from the request that prompted this. - Bearer-impersonation finding (http_api.rs) now points at #782 instead of "Not filed": confirmed the same root cause (dev-mode arbitrary-bearer-as-subject_id, http_api.rs:1168-1211) and corrected the stale half of the original claim — the loopback+ --allow-unauthenticated path (:1214-1219) returns a hardcoded, non-admin "local" identity, not an attacker-controlled one. - Data-store finding gets new ticket #788: verified MemoryDataStore is #[cfg(test)]-only, and the real gap is that the one production adapter, LocalFileDataStore, has zero call sites anywhere in the workspace outside its own tests. - Trace-store finding gets new ticket #789: confirmed TraceStore (trace/store.rs:8-11) is a plain in-memory HashMap, distinct from the already-fixed event-broker durability gap (#593). - Spec-022 governance finding is marked Resolved with no ticket: confirmed spec 022 is formally Superseded (decision-log Decision 25, 2026-07-18), specs 057/058/059 are Approved with real implementations (traverse-embedder, runtime/workflows.rs, cli/http_api.rs command dispatch), and MCP is no longer referenced in any CI workflow. "Not filed" count in the register drops from 4 to 0. Added a "Resolved" status (green, same as Closed) alongside the existing Open/Closed states, and fixed the Ticket-cell fallback so a resolved row with no ticket reads "No ticket needed" instead of the now-wrong "Not filed". Updated the section note above the table to describe the reconciliation instead of the stale four-untracked-findings claim. Sanity-checked the six 2026-07-20 findings against live issue state: #781 already correctly showed Closed (a follow-on fix, #787, merged after that pass), #782-786 remain Open — no changes needed there. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.
Summary
Follow-up to #39, same day. All four rows previously marked "Not filed" are now either ticketed or explicitly resolved.
Every factual claim in the request that prompted this was independently verified against a fresh clone of
traverse-framework/traverseat currentmain(9c2806c) before being written into a public audit page — none of it was taken on trust. Specifics below.1. Bearer-token impersonation → redirected to #782 (Open)
Read
http_api.rs'ssubject_from_requestdirectly. Confirmed:subject_idpath is exactly:1168-1211as claimed, and is the same root cause as #782 (is_admingranted when the token equals the literal"system_admin").--allow-unauthenticatedpath at:1214-1219returns a hardcoded, non-admin"local"identity, not attacker-controlled input.2. Data-store durability → new ticket #788 (Open)
Confirmed
MemoryDataStoresits inside#[cfg(test)] mod tests(verified the module boundary, not just a keyword match). Grepped everyLocalFileDataStorereference in the workspace — all of them are its own definition or inside that same test module. Zero production call sites, zero integrity-hash code in the file.3. Trace-store durability → new ticket #789 (Open)
Read
trace/store.rs—TraceStoreis exactly aHashMap<String, ...>at the claimed lines, structurally distinct from the event-broker fix already closed in #593.4. Spec 022 governance drift → Resolved, no ticket
Read spec 022's own file:
**Status**: Superseded (2026-07-18 — see decision-log.md Decision 25...), word-for-word matching the claim. Confirmed Decision 25 exists at that date, specs 057/058/059 are allApprovedinapproved-specs.json, their claimed implementation files exist (traverse-embedder,runtime/workflows.rs,cli/http_api.rs), and grepped every.github/workflows/*.ymlfor "mcp" — zero matches, confirming the old "CI-required" claim no longer holds.Also
Resolvedstatus (green, same visual treatment as Closed) alongside Open/Closed.Test plan
npm run buildclean#782correctly linked from both its original row and the reconciled row, status pills render correctly in both themes🤖 Generated with Claude Code