← Back to all sparks
R

Rspamd

COMMS
Velocity5.0

Fast spam filtering system for mail servers

Rspamd is rebuilding its neural filter into a pluggable framework — and just fixed a controller that accepted any password.

spam filteringneural registriesfuzzy matchingresource boundingwebui rewrite
Current state
The 4.1.x series has moved fast on two fronts. The neural plugin gained pluggable feature-provider and ANN-architecture registries, multi-head attention pooling, slice and concat graph transforms, and a static_embed provider running a WordPiece subword tokenizer over a static embedding matrix. Separately the fuzzy subsystem got structured match results with a diagnostics API, Redis-persisted shingle sets and per-hash introspection. 4.1.4 in July fixed a critical controller bug where a malformed password hash caused it to fail open and accept any password, alongside a set of PCRE2 leaks and unbounded-match conditions in the regexp engine.
Where it's heading
The neural work is the strategic thread: turning a fixed classifier into a registry where feature extraction and network architecture are both swappable is what lets learned filtering evolve without forking the daemon. Around it, the project is systematically bounding resource use under adversarial input — regexp heap limits, zip-bomb extraction caps, per-message word budgets, a Lua URL filter consulted twice per field instead of once per byte. The front end is being simplified in the opposite direction, with jQuery, Font Awesome and FooTable all removed outright.
Prediction
The registries and the static embedding provider arrived one release apart, so the piece not yet visible in these notes is a shipped model that uses them. Whether Rspamd distributes one or leaves it to operators is not indicated here.

Recent moves

  1. 9d ago

    Controller accepted any password on a malformed hash

    A critical controller fix: a malformed password hash made authentication fail open and accept any password. Also bounds the regexp engine against hostile input — a PCRE2 match-data leak on invalid UTF, a heap cap per match, and re:matchn() looping forever on empty matches — and links a single shared jemalloc per process.

    View source ↗
  2. 12d ago

    Fuzzy diagnostics API, and jQuery dropped from the WebUI

    jQuery and Font Awesome are removed from the WebUI entirely in favour of native DOM and a local SVG sprite, and the fuzzy subsystem gains structured match results with a diagnostics API, Redis-persisted shingle sets, and per-hash introspection through rspamadm.

    View source ↗
  3. 16d ago

    Static embedding neural provider and composite Lua conditions

    A static_embed neural provider running a WordPiece subword tokenizer over a static embedding matrix, per-symbol Lua conditions on composites, and a train.frozen control to stop automatic training. WebUI tables move from FooTable to Tabulator.

    View source ↗
  4. 1mo ago

    Pluggable neural feature and architecture registries

    ⚡ SPARK

    Pluggable feature-provider and ANN-architecture registries turn the neural plugin from a fixed classifier into a framework, with multi-head attention pooling and graph transforms available to whatever is registered. The CSS module also learns more text-hiding tricks, and zip-bomb expansion gains opt-in limits.

    View source ↗
  5. 2mo ago

    Load-aware upstream selection and chain-aware URL resolution

    Upstream selection becomes load-aware with Power of Two Choices, per-upstream latency EWMA and slow start on revive, and url_redirector gains a chain-aware cache with coherent browser fingerprint profiles for resolving cloaked links. mx_check adds IP-class classification and trust maps.

    View source ↗
  6. 4mo ago

    Proxy milter fd leak and ARC multi-hop parsing fixed

    Fixes a proxy milter file-descriptor leak that accumulated CLOSE_WAIT sockets without bound in production, a self-scan task using the 120-second upstream timeout instead of the 8-second task timeout, and ARC AAR parsing that failed on multi-hop chains with semicolons inside comments.

    View source ↗