Enigmatic Red — research-lab beta

It scans your estate,
and proves what it did.

Reconnaissance, enumeration and non-destructive verification against infrastructure you can prove you own. Every action clears scope, a signed authorisation, the action guard and a hash-chained audit log first. Every refusal is logged as well.

Run the beta locally See five real runs

About us — what we do

An independent lab, and the one tool it builds

Enigmatic Red is an independent research project, run by one person. It is not a company: there is no registered company number and no entity behind it. Nothing is for sale, there is no account to open and no plan to cancel.

Our work is deliberately narrow: one self-hosted assessment agent (reconnaissance, enumeration and non-destructive verification against infrastructure you can prove you own), and the research that comes out of building it. One rule covers a feature and a finding alike: reproduce it, keep the reproduction, and state plainly where the tool stops. A capability with no adapter behind it is reported as not tested, never as absent. A lead is never promoted to a finding without the bytes that prove it. A discipline this beta does not cover is written down on the coverage page, not left to be discovered.

The beta runs on your own machine, needs no key of ours and costs nothing: no accounts, no billing. The one address that reaches a person is info@enigmaticred.com. Research questions, security reports and takedowns all go there.

How it works

Six narrow phases

Every domain pack works the same six phases, so plans stay comparable across packs. All six are open in the beta. What stops a run is the scope, the approval gate and the guard, never an entitlement.

Infrastructure

Open services and versions, misconfigurations, weak TLS and exposed admin planes. Default credentials are never brute forced.

Web application

Content discovery, auth and session logic, injection classes, access control and IDOR, headers, CORS.

Cloud security

Public buckets, over-permissive policy documents, exposed managed services and logging gaps. Read-only: it never mutates cloud state.

AI security

Prompt injection and jailbreaks, system-prompt and tool-definition extraction, insecure output handling, excessive agency, retrieval leakage.

Real runs, not mockups

5 runs from one session

5 runs from one session against a lab host on this machine, under a scope signed for the demo. Each one shows the request in plain words, the command the tool was actually asked to run, and the log entry it produced. The lab host is one asset of ours, listening on 8000 and 8080 and all; the session’s own output is what is quoted here, and nothing above was typed up afterwards. 4 of the 5 captures were refused, and that is deliberate: a scan that cannot refuse is not one you can hand to a client. The natural-language line is the operator request each run was made for.

Reconnaissance that runs

allowed

You askScan the web host we have in scope and tell me what is exposed.

portstateserviceproduct
8000/tcpopenhttp-altlab-asset/1.0
8080/tcpopenhttp-proxylab-asset/1.0

1 host up, 2 open services, 2.57 s of scanner time; 6,270 bytes of XML parsed into that table, 2,772 ms wall clock for the process.

Active enumeration with scope, a dated attestation and an audit entry written before the process started.

the command it was asked to run
tool callreturncode 0
$ nmap -Pn -sV -oX - -p 8000,8080 --max-rate 200 127.0.0.1
the log lines — 2 entries, quoted verbatim
audit trail2 entries
seq 1  tool.requested  decision=allowed  action_class=active
seq 2  tool.completed  decision=ok  action_class=active  returncode=0
{"action":"nmap -Pn -sV -oX - -p 8000,8080 --max-rate 200 127.0.0.1","action_class":"active","actor":"planner","decision":"allowed","detail":{"matched_rules":[],"scan_id":"demo-scan-0001"},"entry_hash":"6759ddbca507875260e1ecea7102096bf06c228d9ba9bf9563b0639fe972fbe6","event":"tool.requested","org":"Enigmatic Red Demo","prev_hash":"0000000000000000000000000000000000000000000000000000000000000000","seq":1,"target":"127.0.0.1","timestamp":"2026-10-19T14:37:45.086953+00:00"}
{"action":"nmap -Pn -sV -oX - -p 8000,8080 --max-rate 200 127.0.0.1","action_class":"active","actor":"planner","decision":"ok","detail":{"duration_ms":2771.6,"elapsed_s":2.57,"hosts":1,"open_services":2,"parse_error":"","returncode":0,"scan_id":"demo-scan-0001","sensitive_services":[],"stderr_bytes":0,"stdout_bytes":6270,"timed_out":false,"tool":"nmap","truncated":false,"up_hosts":1},"entry_hash":"1f4f2c444b06f727545e0e585027083660b8921df3613c96c43c8cbbcffbf32c","event":"tool.completed","org":"Enigmatic Red Demo","prev_hash":"6759ddbca507875260e1ecea7102096bf06c228d9ba9bf9563b0639fe972fbe6","seq":2,"target":"127.0.0.1","timestamp":"2026-10-19T14:37:47.893477+00:00"}

A scan that gets refused

refused

You askSame scan, but crank the probe rate to 5000 so it finishes faster.

refused: this action is in a permanently forbidden class and cannot be approved (nmap -Pn -sV -oX - -p 8000 --min-rate 5000 127.0.0.1): forbidden[dos_flags]: flood or high-rate flags intended to exhaust the target

Flood-class flags are a hard deny: no approval can enable them, and the refusal is recorded like any other decision.

the command it was asked to run
tool callnever reached the runner
$ nmap -Pn -sV -oX - -p 8000 --min-rate 5000 127.0.0.1
the log lines — 1 entry, quoted verbatim
audit trail1 entry
seq 3  tool.refused  decision=refused  action_class=forbidden  matched_rules=['dos_flags']
{"action":"nmap -Pn -sV -oX - -p 8000 --min-rate 5000 127.0.0.1","action_class":"forbidden","actor":"planner","decision":"refused","detail":{"matched_rules":["dos_flags"],"reason":"refused: this action is in a permanently forbidden class and cannot be approved (nmap -Pn -sV -oX - -p 8000 --min-rate 5000 127.0.0.1): forbidden[dos_flags]: flood or high-rate flags intended to exhaust the target","scan_id":"demo-scan-0001"},"entry_hash":"24e7db1011145d5196b7d3feaa438f5f103e76961671ea3926710b9911f00483","event":"tool.refused","org":"Enigmatic Red Demo","prev_hash":"1f4f2c444b06f727545e0e585027083660b8921df3613c96c43c8cbbcffbf32c","seq":3,"target":"127.0.0.1","timestamp":"2026-10-19T14:37:47.895480+00:00"}

An intrusive check that waits for a human

approval required

You askCheck the app for Log4Shell and confirm whether it is reachable.

human approval required before running an intrusive action (nuclei -target 127.0.0.1 -jsonl -silent -nc -no-interactsh -disable-update-check -t http/cves/2021/CVE-2021-44228.yaml -rate-limit 50 -concurrency 10 -timeout 10): tool class intrusive for 'nuclei'

Intrusive tooling runs only against an approval for that exact command line, and the request is logged even while it is held.

the command it was asked to run
tool callnever reached the runner
$ nuclei -target 127.0.0.1 -jsonl -silent -nc -no-interactsh -disable-update-check -t http/cves/2021/CVE-2021-44228.yaml -rate-limit 50 -concurrency 10 -timeout 10
the log lines — 1 entry, quoted verbatim
audit trail1 entry
seq 4  tool.refused  decision=approval_required  action_class=intrusive
{"action":"nuclei -target 127.0.0.1 -jsonl -silent -nc -no-interactsh -disable-update-check -t http/cves/2021/CVE-2021-44228.yaml -rate-limit 50 -concurrency 10 -timeout 10","action_class":"intrusive","actor":"planner","decision":"approval_required","detail":{"matched_rules":[],"reason":"human approval required before running an intrusive action (nuclei -target 127.0.0.1 -jsonl -silent -nc -no-interactsh -disable-update-check -t http/cves/2021/CVE-2021-44228.yaml -rate-limit 50 -concurrency 10 -timeout 10): tool class intrusive for 'nuclei'","scan_id":"demo-scan-0002"},"entry_hash":"cec57ef38964f054a1af78ba34521b8201888ae93545463e8c1583150fae9bf0","event":"tool.refused","org":"Enigmatic Red Demo","prev_hash":"24e7db1011145d5196b7d3feaa438f5f103e76961671ea3926710b9911f00483","seq":4,"target":"127.0.0.1","timestamp":"2026-10-19T14:37:47.897478+00:00"}

The same check, after an approval

ran · rc 1

You askApproved: go ahead with the Log4Shell template only.

nuclei exited with rc 1 and produced no findings, so the run could not be interpreted; nuclei reports no templates provisioned and this adapter never fetches templates mid-scan (provision them out of band)

The run really did happen and really did fail: this machine has no nuclei template set installed. The layer reports the configuration error instead of reading it as "no findings", and the run is audited at both ends regardless.

the command it was asked to run
tool callreturncode 1
$ nuclei -target 127.0.0.1 -jsonl -silent -nc -no-interactsh -disable-update-check -t http/cves/2021/CVE-2021-44228.yaml -rate-limit 50 -concurrency 10 -timeout 10
what the process did
process2468.7 ms
returncode 1   stdout 0 B   stderr 60 B
the log lines — 2 entries, quoted verbatim
audit trail2 entries
seq 5  tool.requested  decision=allowed  action_class=intrusive
seq 6  tool.completed  decision=error  action_class=intrusive  returncode=1  parse_error=<set>
{"action":"nuclei -target 127.0.0.1 -jsonl -silent -nc -no-interactsh -disable-update-check -t http/cves/2021/CVE-2021-44228.yaml -rate-limit 50 -concurrency 10 -timeout 10","action_class":"intrusive","actor":"planner","decision":"allowed","detail":{"matched_rules":[],"scan_id":"demo-scan-0002"},"entry_hash":"4ffd148781fec684cb63ec9d99ff5e1746509a02e7efc34275019922bbe1c923","event":"tool.requested","org":"Enigmatic Red Demo","prev_hash":"cec57ef38964f054a1af78ba34521b8201888ae93545463e8c1583150fae9bf0","seq":5,"target":"127.0.0.1","timestamp":"2026-10-19T14:37:47.899484+00:00"}
{"action":"nuclei -target 127.0.0.1 -jsonl -silent -nc -no-interactsh -disable-update-check -t http/cves/2021/CVE-2021-44228.yaml -rate-limit 50 -concurrency 10 -timeout 10","action_class":"intrusive","actor":"planner","decision":"error","detail":{"duration_ms":2468.7,"parse_error":"nuclei exited with rc 1 and produced no findings, so the run could not be interpreted; nuclei reports no templates provisioned and this adapter never fetches templates mid-scan (provision them out of band)","returncode":1,"scan_id":"demo-scan-0002","stderr_bytes":60,"stdout_bytes":0,"timed_out":false,"tool":"nuclei","truncated":false},"entry_hash":"5e0ff7a6827db81b78f8edec83bea4b9ad9ebe035be022705f5f9a3f02b187a8","event":"tool.completed","org":"Enigmatic Red Demo","prev_hash":"4ffd148781fec684cb63ec9d99ff5e1746509a02e7efc34275019922bbe1c923","seq":6,"target":"127.0.0.1","timestamp":"2026-10-19T14:37:50.404116+00:00"}

A target we were never authorised to touch

refused

You askWhile you are there, scan 8.8.8.8 as well.

refusing nmap: '8.8.8.8' is out of scope: no allow rule matches '8.8.8.8' (scope 'demo-lab' grants 1 host(s), 0 cidr(s))

The guard is not the only gate: a target has to be inside the signed scope, re-checked before any packet leaves this machine.

the command it was asked to run
tool callnever reached the runner
$ nmap -Pn -sV -oX - -p 80,443 8.8.8.8
the log lines — 1 entry, quoted verbatim
audit trail1 entry
seq 7  scope.refused  decision=refused
{"action":"nmap","action_class":null,"actor":"planner","decision":"refused","detail":{"matched_rule":"","reason":"no allow rule matches '8.8.8.8' (scope 'demo-lab' grants 1 host(s), 0 cidr(s))","scan_id":"demo-scan-0003"},"entry_hash":"369fbcd93a379e2932ee795a336bad248fb055d11028f1dfefa1a0aa9115c0bd","event":"scope.refused","org":"Enigmatic Red Demo","prev_hash":"5e0ff7a6827db81b78f8edec83bea4b9ad9ebe035be022705f5f9a3f02b187a8","seq":7,"target":"8.8.8.8","timestamp":"2026-10-19T14:37:50.406120+00:00"}

Captured 2026-10-19T14:37:50+00:00 on this machine, and the audit chain verified intact across all 7 entries afterwards. Every argument, exit code, byte count, timing, refusal and log hash above is what the run produced: none of it is hand-written, and the page is checked against the session’s own record every time it is rebuilt.

Published research — the write-ups

What we found, and how each one was proved

The lab writes up each finding for the reader who will check it: the symptom, the reproduction against the code as published, the root cause, the smallest patch that restores the intended behaviour, and the test that fails before it and passes after. Nothing is written up before it is reproduced, and nothing is claimed that the reproduction does not show.

Two libraries that broke a guarantee

Epsilon-calibrated noise that silently collapsed to zero in IBM's diffprivlib, and a corrupted archive that surfaced as a raw codec exception in CPython's tarfile instead of the one error type it documents. Both were found by comparing code paths that should have behaved alike. Both fixes reuse a pattern the codebase already had.

Read the write-up

Where the collection lives

One folder per piece, in the repository and mirrored folder for folder to GitHub, with a page each here. A piece joins the index only once its reproduction is recorded. What is published is therefore the part of the work that survived being checked, including the parts that stay unfixed.

All write-ups

Research-lab beta — runs on your machine

Free to run, nothing to buy

A research project with one hosted convenience: no sign-up, no account, no key of ours and nothing to buy. The chat lives on beta.enigmaticred.com and is bring your own key: it answers questions, and it cannot touch anything. Everything that can act runs locally, against infrastructure you can prove you own, and you read the audit log yourself. If it becomes a product, the Enigmatic Red Subscription is sold here; pricing, Stripe and checkout stay archived until then.

What works today

Scope and authorisation intake, the action guard, human approval for intrusive commands, a hash-chained audit log, evidence with its bytes and hash, and a report that keeps a verified finding apart from a lead. The five blocks above came out of it.

What is not here yet

No accounts, no key of ours and no hosted planner. The one thing this site does for you is answer questions, in the interface on its own page, with the key you bring, and it runs nothing. The beta that acts is a wheel you install and run on your own machine, driven from a command line that goes through the same scope, guard and audit chain the tests pin. Several tool adapters (subfinder, dnsx, gobuster, ffuf, whatweb) are implemented, gated by the same guard and covered by the same suite. CVSS 4.0 scoring, phase-to-phase orchestration and the evidence store are still being written.

What a beta tester needs

A machine, a model on it, and a target you can prove you own. There is no key to go and get. On Windows, EnigmaticRed-Setup.exe is the whole job in one double-click: it installs the agent and, by default, the newest Llama that fits an ordinary laptop (llama3.2:3b, 2 GB, no GPU), then opens the chat. From a checkout, setup_local_model.cmd does the same on Windows, and setup_local_model.sh on macOS and Linux. Either way the model is open-weight and runs on your machine, so nothing leaves your network. A local lab is enough, and is what the captures above used. Expect refusals to outnumber findings: the guard is supposed to refuse, and it logs every time.

Download for Windows — it installs everything Download for macOS Download for Linux Try the chat in your browser

macOS and Linux take the same wheel: this beta is one py3-none-any package, so those two buttons download one identical file, and its name is what the digest below is about. It installs the agent and installs no model — setup_local_model.sh from a checkout is what puts a model behind it, which is the half the Windows installer does on its own.

That one file is the whole install: it checks for Python and installs it where the machine has none, installs the agent, sets up a local model to talk to, points the agent at that model, and opens the chat in the same window. Nothing to type, and nothing leaves your network. Nothing here is code-signed yet, so the number underneath is how you check that the file arrived whole.

Windows warned me about this file — or I would rather not run an .exe

The warning is about the file being unsigned, not about anything found in it: Windows shows it for any program downloaded in a browser that has no code-signing certificate behind it, and this one has none yet. There are two ways round it. The first is to check the file against the sha256 below: that number is on this page and in the repository, so a copy that arrived altered cannot match it. The second is to skip the executable altogether: the wheel below is the same release of the same code, packaged rather than run, and nothing warns about a wheel. When this repository's build does sign the file, the signature is checkable on it with Get-AuthenticodeSignature. Until then the sha256 is the whole of the check, which is why the number is printed rather than promised.

The wheel carries the agent alone and installs no model. From a terminal with Python 3.11 or newer on the machine:

py -3 -m venv "%LOCALAPPDATA%\EnigmaticRed\venv"
"%LOCALAPPDATA%\EnigmaticRed\venv\Scripts\python.exe" -m pip install --upgrade "https://enigmaticred.com/assets/enigmatic_red-0.1.0b1-py3-none-any.whl"
"%LOCALAPPDATA%\EnigmaticRed\venv\Scripts\red.exe" init

A model is then the two steps the installer exists to do for you: setup_local_model from the repository puts Ollama and a 2 GB open-weight model on this machine, or point .env at a model you already run. Nothing above is a second copy of the product: it is the same wheel the installer downloads and checks the digest of itself.

What you downloaded — EnigmaticRed-Setup.exe, 7,703,849 bytes:
sha256 5fdd4aff72f2fbaae37c849d348c4626d4dac8b04ba32efdfa4a7f8db2b935bf
The installer fetches the beta itself from this same folder, and checks it arrived: enigmatic_red-0.1.0b1-py3-none-any.whl, 306,253 bytes:
sha256 6da1d2d88bf2e6a7d84bfb3646da77bb1ecb7808bbc2b4e5cb2ac378aa7c17a9
On macOS or Linux there is no installer: setup_local_model.sh from a checkout sets up the same local model, as setup_local_model.cmd does on Windows — no key and nothing leaving the machine.

Guardrails that apply to every run

  • 25 targets per scan, 60 minutes of wall clock, maximum.
  • 2,000,000 LLM tokens per scan; 40,000,000 per seat per month. Metric spend is bounded on purpose.
  • 17 capability patterns are permanently forbidden — denial of service, credential brute force, persistence, destructive filesystem and SQL operations, reverse shells and command-and-control, bulk exfiltration, SSRF toward cloud metadata. No configuration and no approval can enable them.
  • 13 patterns are intrusive — injection and traversal probes, JNDI lookups, exploit tooling, state-changing verbs, aggressive scans. Each needs a human approval for that exact command line.
  • A binary nobody registered is treated as intrusive, never as active.