v2.1.2
Security: output-injection sweep
A dedicated sweep of every render path for the class the 2.1.1 render_error fix
revealed: attacker-influenceable strings (CT issuer/subject, federation brand
name, autodiscover domains, per-source error text) reaching the terminal or
markdown without escaping or control-stripping. Most paths were already safe (the
merger scrubs the primary fields and the panel renders via markup-safe
Text.append); four siblings were fixed, each with a regression test:
render_warningnow escapes and control-strips the domain and the per-source
error reasons (aconsole.printmarkup sink carrying server-influenced text).render_conflict_annotation(verbose) control-strips the raw candidate values
it renders, for example a tenant-controlled federation brand name, under
--explain --verbose.- The
deltacommand's two error sinks now use the sanitizedrender_errorpath
like every other lookup error. - The markdown report escapes
default_domainandtenant_domains(autodiscover
values that are control-stripped but not charset-restricted upstream).
The SSRF/network, ReDoS, resource/path/deserialization, and MCP reviews from 2.1.1
stand; no new high or medium issues outside this class.
Gate: full pytest, ruff, pyright (0 errors), validate_fingerprint (841).