[1.1.1] — 2026-05-DD
Security patch release. Closes 10 findings from a comprehensive scan
(bandit, snyk-code, gitleaks, pip-audit, trivy, manual review) plus
a 5-round adversarial review of the implementation plan.
Security
- SSRF intra-hop DNS-rebind:
safe_fetchnow resolves the
hostname once, validates the IP against an allowlist, and passes
the validated IP through tosocket.create_connectionvia a
customHTTPSConnection. Defeats attacks that return a public IP
to a validator and a private IP (e.g.,169.254.169.254) to the
connector.ProxyHandler({})explicitly suppresses
HTTP_PROXY/HTTPS_PROXYenv vars that would otherwise route
traffic past the validator. - IP allowlist: switched from a four-flag denylist
(is_private | is_reserved | is_loopback | is_link_local) to an
allowlist (is_global and not is_multicast and not is_unspecified).
Breaking for users on multicast / CGNAT / IETF-reserved
networks fetching same-network resources; pre-fetch withcurl
and pass--from-fileas a workaround. - Frontmatter override-key validation: keys must now match
^[A-Za-z_][A-Za-z0-9_-]*$. Defends against newline-injection in
TOML basic-string keys that produced split YAML lines.
Breaking for TOML configs with quoted keys containing
whitespace or punctuation. - URL credentials and sensitive query parameters in
userinfo
and matching(?i)(token|api[_-]?key|access[_-]?token|bearer|signature|sig|password|secret|aws[_-]?session[_-]?token)$
are scrubbed before any logging, persistence, or filename
derivation. IPv6 host brackets preserved across the scrub. - Docling image saves use
O_EXCL|O_NOFOLLOWto refuse symlink
TOCTOU. atomic_write_texttightens the symlink-check window via
os.lstatimmediately beforeos.replace. Parent-dir hardening
deferred to v1.2 per the operator-trusted threat model.- Stderr/stdout sanitizer extended with Unicode bidi
(U+202A–E, U+2066–9), zero-width chars (U+200B–F, U+FEFF), and
the BOM. Newany2md._loggingmodule;_sanitize_log_text
re-exported fromany2md.converters.docxfor one release. publish.ymlworkflow: top-levelpermissions: contents: read;
both publish jobs flip toattestations: truefor PEP 740 sigstore
provenance.
Fixed
wikipedia.orgheuristic host check no longer matches
evilwikipedia.org. Pure correctness fix; impact was incorrect
text formatting only, not a security boundary._USER_AGENTno longer hardcoded toany2md/1.0.6; derives from
__version__.
Changed
requirements.txtis now a generated artifact; canonical source
is.devcontainer/requirements.lockwith hashes
(--require-hashesenforced in.devcontainer/devcontainer.json).
SeeCONTRIBUTING.mdfor the dep-update workflow.load_toml()now warns to stderr on parse error rather than
silently returning{}..devcontainer/is now tracked in git (was previously ignored)
so the security-critical Codespace bootstrap config is
version-controlled.