Core concepts
Introduction
A short glossary of the ideas the rest of the documentation builds on.
Canonical Request Model
The single, in-memory representation of a request that every analysis stage reads. It holds the method, version, path, host, headers, framing, detected anomalies, and a flat list of parameters — and it is where all the decoding and normalization lands. Detection never touches raw bytes directly; it reads the canonical model. See Normalization and Internals.
Params and Source
Every input Heimdall can find in a request — a query value, a form field, a JSON
leaf, a header, a cookie, a multipart part, a JWT claim, a GraphQL variable, an
XML/SOAP node — is flattened into a Param: {Source, Name, Raw, Norm}. The
Source tag records where it came from (Query, Form, JSON, Header,
Cookie, JWT, GraphQL, XML, SOAP, WebSocket, …). The set of Params is
the detection surface: engines iterate Params, not the raw request. Raw is
the decoded-but-original bytes; Norm is the canonical form.
Detection engine and Finding
A detection engine is a specialized analyzer for one class of attack. It
implements a fixed contract — Analyze(request, out) — and, crucially, never
blocks. When it sees something, it appends a Finding:
Risk is how dangerous, Confidence is how sure, and Evidence points at the
exact canonical span that triggered it (so the Attack Explorer can highlight it).
Engines are pure and side-effect-free; deciding what to do is someone else's
job. See Detection engines.
Risk and Decision
The risk engine aggregates all findings plus protocol anomalies into one saturating score, weighting each finding by a per-engine weight and its own confidence. The decision engine maps that score to an Action through a threshold ladder:
Allow → Monitor → Throttle → Challenge → Block → Drop
See Risk & decision.
Shadow vs enforce
Two operating modes:
- Shadow (monitor) — the default. Every request is inspected and scored, but
any action stronger than Monitor is clamped down to Monitor, so traffic is
never blocked. The decision still records the action enforcement would have
taken (surfaced as
wouldin telemetry). - Enforce — decisions are applied: Challenge issues a proof-of-work, Block/Drop
returns a graceful
403, Throttle tarpits the connection.
Mode is set per policy, so you can enforce one site while shadowing another.
Anomalies
Framing- and protocol-level problems the HTTP engine detects while parsing the
request head — conflicting Content-Length/Transfer-Encoding, duplicate
headers, obsolete line folding, bare CR, a duplicate Host. These are not
findings from an engine; they are flags on the canonical model, and the risk
engine weights them directly. They are how request smuggling is caught.
Plugins
Out-of-process programs that contribute additional findings and reputation over a gRPC contract. The engine hands each plugin a connection context (IP, TLS fingerprint, header order) once per connection and a request view per request; the plugin returns an Enrichment (findings, reputation, tags) that flows through the same risk → decision → telemetry path as the built-in engines. Plugin findings are reserved to engine IDs ≥ 128 and can never impersonate a core engine. See Intelligence plugins.
Policy and sites
A policy is the JSON contract the control plane writes and the data plane
reads: enforce flag, decision thresholds, which engines are enabled, access
control, custom rules, and edge behavior. A sites file maps Host headers to
per-site origin + policy, so one engine instance protects many sites with
different rules. See Policy & sites.