v1.2.2 — credential scoping and workspace containment
Security
- Credential leak to lookalike domains.
isChutesHostmatched the asset URL with a barehostname.endsWith("chutes.ai"), so hosts such asevilchutes.aisatisfied it and theAuthorizationheader — carryingCHUTES_API_KEY— was attached to the download. The asset URL comes from the invoked chute's own response and the server lists public chutes by design, so any third-party chute could harvest the key by returning a crafted URL. The check now requires the apex host or a real subdomain. - Arbitrary file read and upload.
maybeEncodeFileresolved every non-text string param against the workspace with no containment, so an absolute path or a../escape (/etc/passwd,../../.ssh/id_rsa) was read, base64-encoded and sent to the third-party model. Params come straight from the model, so the value was never user-controlled. Resolved paths must now stay inside the workspace root. - Both are covered by regression tests in
test/credential-scope.test.ts.
Fixed
- The server announced version
1.2.0in the MCP handshake while the package shipped as1.2.1. The version is now read frompackage.jsoninstead of being duplicated as a literal.
Users of 1.2.1 and earlier should upgrade. If you ran the server against untrusted public chutes, consider rotating CHUTES_API_KEY.
Full Changelog: v1.2.0...v1.2.2