Preemptive · Precise · Automatic

Prevent attacks the signatures have not seen yet.

xorappsec is a machine-learning reverse-proxy WAF written in Rust. It uses ML (not a remote “AI” API) to decode every request, score attack families, and decide in the context of this application — locally, without sending traffic to a cloud inspector.

xorappsec sitting in the request path as a local reverse-proxy inspection plane

Principles

The same three claims a serious ML WAF has to earn.

Preemptive

OWASP Top-10 and zero-day class payloads (Log4Shell, Spring4Shell, Text4Shell) are decoded then scored. No CVE pack required for those families.

Precise

Per-asset unsupervised learning, trusted sources, and detect-learn → prevent-learn so you do not live in exception YAML.

Automatic

Declarative policy, Helm, systemd, SIGHUP reload, doctor. Configuration is data, not a console ritual.

Features

The inspection crate runs complementary engines beside the contextual scorer.

ML threat prevention

Three-phase engine: decode, attack-family indicators, contextual fusion. No signature wait for JNDI / Spring / Text4Shell class attacks.

API security

Same path on JSON and forms. Optional OpenAPI 3 path, method, and required-parameter checks.

Anti-bot

JS challenge cookie on configured URIs. Issued tokens expire; the engine never trusts a static header.

IPS

Built-in web CVE patterns plus Snort-style content: files so a named CVE can still appear in the log.

File security

Extension, magic bytes (MZ/ELF), polyglot / script-as-image, path elements in filenames.

Rate limiting

Per source identity (IP, header, cookie, JWT claim) with longest-URI match.

Crowd denylist

Local CrowdSec-style IP file. No phone-home; you control the list.

DLP & error leak

Response scan for PANs (Luhn), keys, PEM; strips or blocks 5xx pages that leak traces.

Policy as data

GitOps YAML. Modes, practices, exceptions, trusted sources, custom block pages. Hot-reload.

Zero-day class, without a signature update

These are decode + indicator + floor problems. The shipped basic model already treats them as critical.

Log4Shell

${jndi:ldap://…} and nested ${::-j} lookups expand in Phase 1. The JNDI family then cannot be talked down by a Kindergarten baseline.

Spring4Shell

Bind attacks hide in parameter names (class.module.classLoader…). The decoder scans names, not just values.

Text4Shell

${url:…} / ${script:…} interpolation is a lookup family, same expander as Log4Shell.

JSON-wrapped SQLi

Bodies are flattened. {"q":"1' OR 1=1--"} is still a SQL-family feature after explode.

Available for the platforms you already run

First-class: Linux binary, Docker, Kubernetes/Helm, systemd. The data plane is a reverse proxy — sit it in front of the origin, or one hop behind NGINX, Kong, Envoy, or Istio.

Platform notes and topologies →

How machine learning is used

Not a cloud model API. Two models plus fusion, on the box.

Three-phase inspection: decode, indicators, context
Phase 1 decode → Phase 2 family scores → Phase 3 supervised + unsupervised + reputation.

Supervised

32-d logistic over family scores, entropy, decode depth. Public basic weights ship in-tree; advanced files load at runtime.

Unsupervised

Per-asset URL baselines and an Isolation Forest on benign traffic. Kindergarten → PhD tells you when to prevent.

Fusion

Weighted mix with floors so a young model cannot allow decoded JNDI. Details on the tech page.

From playground to production

Try it in one command

cargo build --release -p xorappsec
./target/release/xorappsec demo

Proxy :8080 · dashboard :9090 · origin :18080