Parallax Deception
Orchestration and decision layer for cyber deception

Design the reality your adversary will believe.

Parallax Deception coordinates network decoys, simulated identities, honeytokens and canarytokens under a single operation object, with a deterministic rules engine that closes the observe → decide → deploy → adjust loop.

observer a observer b real asset apparent plane what the adversary believes
Parallax: the same object occupies two apparent positions depending on where you look from. A deception operation does exactly that — and this tool decides, deploys and measures the shift.
1,950 automated tests 7 methodology steps implemented 1:1 6 registered capability types MITRE ATT&CK · MITRE Engage · STIX 2.1 Python 3.10+ · Flask AGPLv3 + commercial license
What it is

The category matters: start by ruling out the three things it gets confused with.

The layer open source cyber deception is missing.

Running deception today with free tools means manual, disconnected decisions: nobody says what to deploy or when, nobody compares the plan against what actually happened, and each tool lives in its own interface with its own data model.

Not another honeypot

A honeypot covers one surface. An operation needs several, coordinated with each other and sharing common state.

Not another honeytoken generator

The decoy is the means. Deciding where to place it, with what story and for how long, is the real work.

Not a detection platform

Detection is the outcome. Here you design, deploy and measure what makes it happen.

It is the layer above: deception tools that today each live in their own interface, unified under one operation object with an adversary profile, rules of engagement, scenarios, telemetry and a closing report.

Methodology

The 7 steps are a real sequence, not a list: each one consumes what the previous one produced.

Built from the framework, not mapped onto it afterwards.

The data model implements 1:1 the seven steps of the published CTI to cyber deception methodology (Pacheco & Staino). This is not a tool that had a framework bolted on later: every step is part of the model, persisted, editable and audited.

Observe Decide Deploy Adjust
01

Adversary profile and TTPs

A curated MITRE ATT&CK catalog with selection by tactic, preloading from known APT groups, and ingestion of CTI reports in .txt/.pdf — deterministic extraction presented as a suggestion, never applied on its own.

02

Rules of engagement and strategic decisions

What is allowed and what is forbidden, environment, legal constraints, escalation contact, strategic objectives, roles and resources. Plus the closure criteria, including event conditions that end the operation on their own.

03

Scenarios

Each scenario with its deception level and its linked TTPs: the unit that later connects intent with the concrete capabilities that materialize it.

04

Capabilities and expected effect

The See – Think – Do triple from MITRE Engage per deployed capability, with a visual activity matrix (Goals × Approaches × Activities) and suggestions derived from the expected TTPs and the strategic objective, labeled by origin.

05

Narrative

The story that holds the fiction together and its intended psychological impact: fictional employees, infrastructure and documents telling the same story, not a set of unrelated decoys.

06

CTI feedback

Expected against observed, with an ATT&CK Navigator-style TTP heatmap, typed IoCs, a report in Markdown, JSON and PDF, and STIX 2.1 export ready for a SIEM/SOAR.

07

Re-operate

A new operation preloaded with what the closed one taught: the observed TTPs that were not in the original profile go back to step 1, and the cycle starts again with more information.

The engine

Deterministic and auditable. Deliberately against the grain, with a security argument behind it.

Condition → action rules. No LLM decides what to deploy.

Rules are editable YAML, evaluated in real time against the event bus, and every firing is recorded. The reason is not purism: treating untrusted content produced by an attacker as the input to an automated decision is an attack surface, not a convenience. Model-based generation does exist in the tool, but only for the content of the fiction — never for the decision.

# Every firing is kept in the operation's persisted history.
rules:
  - name: "Scan on the edge decoy: deploy the internal lure and activate"
    when:
      event_type: interaction
      plugin_id: dolost-edge-1
      payload:
        kind: scan
    then:
      - action: deploy
        plugin_id: honeytoken-finance-1
      - action: transition
        to: active

An editor with syntax highlighting and inline validation against the real parser — not a JavaScript reimplementation — plus a visual builder for those who do not write YAML.

Execution guard

Rules of engagement actually stop things

Before executing any action, the engine checks that operation's RoE. If the action is forbidden it is not executed, it does not fail silently, and it is recorded as rejected with a reason. Plus a configurable cap on actions per event chain, as a defense against cascades.

Traceability

Manual work is written down too

Every operator action — deploy, rotate, retire — is attributed to an identity and persisted in a SHA-256 chained history that points at the exact entry if someone altered the file. The engine keeps its own separate history.

What it does

The full path: design, validate before touching infrastructure, execute, observe, close.

From a hypothesis about the adversary to a report that feeds your CTI.

Operation design

  • A template catalog so you start from a skeleton operation instead of a blank form.
  • A three-step creation wizard, with a final review before confirming.
  • An asset inventory with criticality, importable from CSV, and declared asset → capability coverage.
  • A visual operation tree: scenarios, capabilities, Engage activities and concrete resources, with real state per node.
  • Breadcrumbs as a first-class relationship: declare that one capability leads to another, and see that path drawn.

Validation before operating

  • Dry run: a deterministic walk over the design that finds structural gaps — TTPs no capability could observe, scenarios with no entry point, broken breadcrumbs, isolated capabilities. Without deploying anything.
  • Fiction coherence: narrative, employees, infrastructure and decoy documents in a single view, so you can judge whether they tell the same story.
  • A preparation view crossing the eight strategic Engage activities against the operation's real data.

Execution

  • A full lifecycle per capability: deploy, rotate, retire, with live state and real feedback from Docker or WinRM.
  • Deploy the whole campaign in one click, with an explicit summary of what was deployed, what was already up, what was skipped and what failed.
  • Real-time WebSocket notifications during a run.
  • Live status cards in the listing: what is running right now, without opening each operation.

Observation and analysis

  • Normalized telemetry — events, typed IoCs, observed TTPs — in a store that can be correlated across operations.
  • Incidents: manually group related events to study them together; TLP classification that travels to the STIX export.
  • Optional IoC enrichment against VirusTotal, always on explicit request.
  • A living adversary profile: incorporate observed and unexpected TTPs while the operation is still running.
  • An aggregated portfolio: TTP and Engage activity coverage across every operation, with source, period and scope declared.

Closing the loop

  • A post-operation report in Markdown, JSON and PDF.
  • STIX 2.1 export validated against the OASIS reference implementation, with real ATT&CK references and manual webhook delivery to a SIEM/SOAR.
  • A GraphML graph of the whole operation, to open in Gephi.
  • A workshop kit for stakeholders: meant to be filled in by hand, not one more report.

Practice environment

  • Playground mode: brings up a real Docker lab per operation, with an attacker view and a defender view.
  • A live comparison of what was planned against what is observed, while the run happens.
  • And the honest note about which expected TTPs the lab's fixed scenario cannot produce, instead of simulating full coverage.
Surfaces

Five real surfaces, a reference mock for development, and a bridge that only ingests telemetry from what you already run.

A three-method plugin contract.

A third party integrates their own tool by declaring an entry point in their own package, without touching a line of the core. The capabilities that ship with the tool register in exactly the same way, with no special treatment.

Network and host decoys Docker

High-interaction decoys with live container state, deployable individually or as a campaign.

Simulated identity and behavior WinRM

Fictional employees with real activity on the machines of the fiction. Model-based generation produces content, never decisions.

File honeytokens Native

Fictional credentials on disk, with no external dependencies, with access detection and content rotation that does not relocate the file.

Canarytokens Thinkst · self-hosted

Cloud, documents with beacons, DNS, QR, email. A direct fit with the breadcrumb model: a canarytoken is a breadcrumb.

OpenCanary Thinkst · self-hosted

Lightweight multi-service tripwires (SSH, FTP, HTTP, Telnet, MySQL) that record what was typed on the other side.

Generic telemetry bridge Ingest only

Ingests events from an external stack with declarative field mapping, without deploying or controlling it, and correlates them against the expected TTPs.

Continuous use

Built to sustain the methodology over time, not just for a demo.

What you need once the operation stops being a demo.

Identity

Its own login, or corporate SSO

With no users, the instance stays open for a local walkthrough; as soon as you create the first one, the application requires sign-in on every route. Hashed passwords, or OIDC sign-in against your provider — where the provider authenticates and the tool authorizes: a subject that was not provisioned does not get in.

Isolation

Roles and teams

Read, operation and administration over a central allowlist: a new unclassified route is denied by default, even to administration. Another team's operations return 404, not a half-filtered list.

Secrets

Encrypted at rest, with the limit stated

API keys, tokens and credentials are encrypted on disk. That protects a copy, a backup or a forwarded JSON; it does not protect against someone with access to the host, and the module says so instead of implying more.

Deployment

A documented production install

Gunicorn, nginx with TLS and a systemd unit, with unattended creation of the first user and an explicit warning about granting access to the Docker socket.

Declared limits

We would rather you read this here than find it out halfway through an operation.

What it does not do, said by us.

The tool is built on one rule: it assists, it never decides for you. Both its strengths and these limits come from there — they are intentional scope, not hidden gaps.

×
It does not manufacture an effectiveness score

A capability's outcome is recorded as free text, with a date and an operator. A synthetic percentage on top of that would be made up, and you will not find one on any screen.

×
Rules of engagement govern automation, not your hands

They exist to bound what the engine does on its own. An operator deploying by hand does not go through that guard — the action is audited, not blocked.

×
CTI extraction is deterministic matching, not comprehension

It recognizes identifiers, technique names and group aliases against the curated catalog. It can produce real false positives and negatives; that is why it is presented as a suggestion and never applied on its own.

×
It does not clone infrastructure or build digital twins

That is a scope decision. It coordinates and measures the deception deployed by the tools you already use, instead of replicating your environment.

×
The included lab scenario is fixed

It is not infinitely configurable, and the interface marks that scenario by scenario instead of pretending everything expected will be observed.

Installation

No sibling checkouts, no separate services, no container orchestration for the tool itself.

One command to install. One to run.

Everything lives in a single Flask process: the core, the native capabilities and the interface. Docker is only needed for container decoys and the lab, not for the application.

# install
python3 -m venv venv && source venv/bin/activate
pip install -e ".[dev]"

# seed three complete, real example operations
python examples/seed_demo.py

# run
python -m apate.web        # http://127.0.0.1:5000

The example operations arrive with telemetry, incidents, TLP classification, an asset inventory and one already-closed operation — so you can see the report and the heatmap with real data from the first minute. Running it again does not duplicate anything.

License

A dual model: the same functionality, two ways to license it.

Genuinely free, with a commercial alternative for those who need it.

Free edition

AGPLv3

Today it includes everything: the operations model, the deterministic engine and its guards, deception capabilities, telemetry, reports, the ATT&CK and Engage catalogs, the web interface, the lab, identity, roles, auditing and extension points. The commitment is explicit: none of that moves behind a paywall later.

Commercial license

The same functionality, different terms

For organizations that cannot take on the AGPLv3 obligations when integrating, modifying or offering it as a service. There is no open core: no separate commercial code, directory or capability exists. What is monetized is a licensing authorization, not the absence of features.

Deception stops being intuition.

Design the operation, validate the design before touching infrastructure, let the engine decide according to rules you wrote yourself, and close with a report your CTI program can ingest.