{"id":"GHSA-xc9g-j69q-37xw","summary":"consciousness-explorer / sublinear-time-solver MCP export_state has an arbitrary file write","details":"### Impact\nAn arbitrary file write vulnerability (CWE-73, External Control of File Name or Path) exists in the `consciousness-explorer` component of `sublinear-time-solver`. The MCP `export_state` (and `import_state`) tool accepted a user-supplied `filepath` argument and passed it directly to `fs.writeFileSync` / `fs.readFileSync` without constraining the destination or rejecting path traversal. An attacker able to invoke the MCP tool could write or overwrite any file accessible to the server process (e.g. `~/.ssh/authorized_keys`, application files), leading to integrity loss and potential service disruption.\n\nThe same sink class was present in the main solver MCP server (`saveVectorToFile` / `loadVectorFromFile`).\n\n### Affected versions\n- `consciousness-explorer` \u003c 1.1.2\n- `sublinear-time-solver` \u003c 1.6.0\n- `sublinear` (crates.io) \u003c 0.2.0\n\n### Patches\n- `consciousness-explorer@1.1.2`\n- `sublinear-time-solver@1.6.0`\n- `sublinear@0.2.0`\n\nState/vector files are now confined to a dedicated directory (overridable via `$CONSCIOUSNESS_EXPLORER_STATE_DIR` / `$SUBLINEAR_SOLVER_VECTOR_DIR`), a basename-only contract is enforced (rejecting separators, `..`, NUL/control chars, hidden files, and Windows reserved names), and files are opened with `O_NOFOLLOW | O_CLOEXEC` mode `0o600`. Covered by 14 regression tests in `tests/consciousness/safe-path.test.mjs`.\n\n**Breaking change:** callers must now pass a basename, not an absolute path.\n\n### Workarounds\nDo not expose the MCP server to untrusted clients; restrict `export_state` to trusted local users; run the server under a low-privilege account with a restricted working directory.","aliases":["CVE-2026-55609"],"modified":"2026-08-26T00:55:48.151532960Z","published":"2026-08-25T18:35:32Z","database_specific":{"severity":"HIGH","github_reviewed":true,"github_reviewed_at":"2026-08-25T18:35:32Z","nvd_published_at":null,"cwe_ids":["CWE-73"]},"references":[{"type":"WEB","url":"https://github.com/ruvnet/sublinear-time-solver/security/advisories/GHSA-xc9g-j69q-37xw"},{"type":"WEB","url":"https://github.com/BruceJqs/public_exp/issues/32"},{"type":"WEB","url":"https://github.com/ruvnet/sublinear-time-solver/issues/19"},{"type":"WEB","url":"https://github.com/ruvnet/sublinear-time-solver/pull/20"},{"type":"WEB","url":"https://github.com/ruvnet/sublinear-time-solver/commit/a701296e363192be863e79d788fa268095e3d229"},{"type":"WEB","url":"https://github.com/ruvnet/sublinear-time-solver/commit/ea9a212b69e4449ec443fe088a7aec7546f70b4a"},{"type":"PACKAGE","url":"https://github.com/ruvnet/sublinear-time-solver"},{"type":"WEB","url":"https://github.com/ruvnet/sublinear-time-solver/releases/tag/v1.6.0"}],"affected":[{"package":{"name":"consciousness-explorer","ecosystem":"npm","purl":"pkg:npm/consciousness-explorer"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"1.1.2"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/08/GHSA-xc9g-j69q-37xw/GHSA-xc9g-j69q-37xw.json"}},{"package":{"name":"sublinear-time-solver","ecosystem":"npm","purl":"pkg:npm/sublinear-time-solver"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"1.6.0"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/08/GHSA-xc9g-j69q-37xw/GHSA-xc9g-j69q-37xw.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H"}]}