GHSA-XC9G-J69Q-37XW

Vulnerability from github – Published: 2026-08-25 18:35 – Updated: 2026-08-25 18:35
VLAI
Summary
consciousness-explorer / sublinear-time-solver MCP export_state has an arbitrary file write
Details

Impact

An 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.

The same sink class was present in the main solver MCP server (saveVectorToFile / loadVectorFromFile).

Affected versions

  • consciousness-explorer < 1.1.2
  • sublinear-time-solver < 1.6.0
  • sublinear (crates.io) < 0.2.0

Patches

  • consciousness-explorer@1.1.2
  • sublinear-time-solver@1.6.0
  • sublinear@0.2.0

State/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.

Breaking change: callers must now pass a basename, not an absolute path.

Workarounds

Do 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.

Show details on source website

{
  "affected": [
    {
      "package": {
        "ecosystem": "npm",
        "name": "consciousness-explorer"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "1.1.2"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    },
    {
      "package": {
        "ecosystem": "npm",
        "name": "sublinear-time-solver"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "1.6.0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2026-55609"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-73"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2026-08-25T18:35:32Z",
    "nvd_published_at": null,
    "severity": "HIGH"
  },
  "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.",
  "id": "GHSA-xc9g-j69q-37xw",
  "modified": "2026-08-25T18:35:32Z",
  "published": "2026-08-25T18:35:32Z",
  "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"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:H",
      "type": "CVSS_V3"
    }
  ],
  "summary": "consciousness-explorer / sublinear-time-solver MCP export_state has an arbitrary file write"
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.

Loading…

Detection rules are retrieved from Rulezet.

Loading…

Loading…

Loading…