Skip to content

v1.27.23 — Medicate

Choose a tag to compare

@markfietje markfietje released this 18 Aug 10:34
· 33 commits to main since this release

[1.27.23] — 2026-08-18

Server-only release (server Cargo.toml/lock 1.27.221.27.23; client +
plugin unchanged). "Medicate" — the three security findings the adversarial
pass surfaced as still-open, delivered as small, behavior-gated hardening: no
new schema, no new endpoints, no wire change, no telemetry. Two landed here
(health surface reduction + fail-closed embed errors); the third (the bounded
outbound client) was already shipped in v1.27.21 (M9: 5 s connect / 15 s total
egress bound) and is re-verified, not re-built.

Security fixes

  • Public /health is now the minimal probe shape (A-02). The load-balancer
    probe (status + version) stays public; every deployment-fingerprinting
    field — model, otel.endpoint, pool, backup, webhook, hardening,
    compliance.dpo_contact, integrity — moved behind the existing Read gate on
    /health/db. An unauthenticated network probe can no longer fingerprint a
    regulated BPO deployment. Intentional surface reduction (same class as the
    v1.20.2 F2 carve-out): an operator monitor reading the detailed fields must
    switch to the gated /health/db.
  • Dependency hardening: h2 0.4.15 → 0.4.16 (RUSTSEC-2026-0258). The HTTP/2
    dependency (reached via the reqwest/hyper client) was bumped to clear the
    "unbounded empty DATA frames" advisory. cargo audit returns exit 0 on both
    the server and client trees; the two remaining findings are unmaintained
    warnings (paste, number_prefix) deep in the HF tokenizers/model2vec stack —
    not vulnerabilities, and not clearable without a major bump.

Bug fixes

  • Embed failures are no longer silent (A-03). The feature-gated neural
    embedders (bge-m3 / gte-base-en-v1.5) logged nothing when the model
    failed, returning an empty vector the callers silently skipped. Every failure
    branch now emits a warn! (the D-1 "never certify silence" invariant the repo
    enforces on the audit settle, quarantine flag, and purge residues). Behavior
    is otherwise unchanged: callers already skip the row on an empty vector, so no
    corrupt zero-length embedding was ever written — this closes only the missing
    signal, not the guard.