Skip to content

Chameleon

v2.38.8 Security

This release includes 2 security fixes for security teams reviewing exposed deployments.

✓ No known CVEs patched
Read the diff → Tool health → What is this tool? →
This release patches 2 known CVEs

Topics

ai-coding-assistant archetype ast-analysis claude-code claude-plugin code-conventions
+12 more
code-review code-style developer-tools javascript linter mcp mcp-server prompt-engineering python ruby rails typescript

Affected surfaces

auth rce_ssrf

Summary

AI summary

Fixed bypass of PreToolUse deny gates that allowed malicious content through Write/MultiEdit and hardened three fail-open edges.

Full changelog

Hardening and effectiveness pass on the PreToolUse hot path and per-edit
injection — the most important surface — across Edit / Write / NotebookEdit.

Fixed

  • A Write/MultiEdit could bypass all three PreToolUse deny gates via a
    decoy field. The proposed-content binding was new_string or content, so a
    Write (whose real field is content) carrying a clean decoy new_string
    shadowed a malicious content, and a MultiEdit (payload nested in
    edits[].new_string) presented empty content — the credential / eval /
    banned-import scans saw nothing and the violation reached disk. Content is now
    bound to the exact field each tool writes (Edit→new_string, Write→content,
    NotebookEdit→new_source, MultiEdit→edits[].new_string) via a shared helper
    used by both deny-gate sites; an unknown tool scans every candidate field
    concatenated. Tool-name and notebook cell_type matching are case-insensitive,
    so a non-canonical casing (notebookedit, a "Code" cell) can never route a
    credential or eval() past a gate.
  • Three fail-open edges hardened (all previously fail-safe, now also
    correct): the per-edit archetype-facts directive screens each rendered
    conventions.json value through the injection-prose scan + fence-break every
    other render path applies (a poisoned value can no longer render as a chameleon
    directive); _emit no longer raises on a fully-closed stdout
    (sys.stdout is None); and a torn config.json on a repo with no git remote
    now surfaces the "repair the JSON" degraded banner instead of a misleading
    "untrusted / re-trust" prompt (a torn config resets such a repo's identity).

Changed

  • Empty-idioms scaffold is no longer injected into the per-edit block or the
    turn-end idiom judge. Most repos never run /chameleon-teach, so their
    idioms.md is just the bootstrap scaffold (## active + _(no idioms yet …)_);
    that placeholder was injected as content to imitate, and is now suppressed.
    Real idioms — active, deprecated, or hand-edited prose (including markdown
    italics) — still flow.
  • The Tier-2 (first-in-archetype) block now leads with archetype-scoped
    facts
    : the class contract the archetype's files implement — base class,
    required methods, DSL macros, and decorators (e.g. a Rails ActiveInteraction
    service extends ActiveInteraction::Base, define execute, or a NestJS
    @Controller) — and the symbols it already exports ("reuse these before
    creating a new one"). A compact chameleon directive scoped to the edited
    archetype, injection-screened and bounded with +N more tails, additive over
    the repo-wide convention block injected once at SessionStart. Default-on, kill
    switch CHAMELEON_ARCHETYPE_FACTS=0.

Security Fixes

  • Fixed bypass in Write/MultiEdit that allowed malicious content to evade PreToolUse deny gates by shadowing fields.
  • Hardened three fail-open edges: archetype-facts directive now screened, _emit handles fully-closed stdout without error, torn config.json shows repair banner instead of misleading prompt.

Weekly OSS security release digest.

The CVE patches and breaking changes that affected production tools this week. One email, every Sunday.

No spam, unsubscribe anytime.

Share this release

Track Chameleon

Get notified when new releases ship.

Sign up free

About Chameleon

All releases →

Related context

Earlier breaking changes

  • v3.0.0 MCP surface folded from 48 tools to 19; remaining 32 operator tools become actions on three dispatchers.

Beta — feedback welcome: [email protected]