Historical archive / AdversaryGraph v4 / Updated 2026-06-27

Historical: AdversaryGraph v4 Capability Map

Published · Last updated

MITRE ATT&CK AI CTI IOC enrichment STIX/TAXII/MISP Detection engineering
Historical AdversaryGraph v4 banner

From ThreatMapper To AdversaryGraph

Historical AdversaryGraph v4 banner
Historical AdversaryGraph v4 banner

This release marks an important transition for the project: the tool now has a new canonical name.

The project is now AdversaryGraph.

The rename was necessary because the previous name overlapped with an existing product/company name. Rather than create confusion, I changed the project identity and rebuilt the public references around a clearer name.

AdversaryGraph is a better name for what the platform actually does:

The repository, documentation, release notes, public project hub, article links, and ecosystem pages were updated to use the new name. Legacy public links are preserved where possible through redirects or compatibility pages.

Project: https://github.com/anpa1200/adversarygraph

Documentation: https://1200km.com/adversarygraph-docs/

Project hub: https://1200km.com/adversarygraph/

Use cases: https://1200km.com/adversarygraph/use-cases.html

Table of Contents

What AdversaryGraph Is

AdversaryGraph capability overview
AdversaryGraph capability overview

AdversaryGraph is a self-hosted AI-assisted CTI-to-detection workbench.

It helps analysts:

The platform is designed for practical CTI work, not marketing dashboards.

It is built around one idea:

Raw intelligence becomes useful only when it is reviewed, structured, connected to evidence, and handed off in a form other teams can use.

AdversaryGraph does not perform definitive attribution. Actor similarity, TTP overlap, IOC enrichment, and external feed matches are analytical signals. They help generate hypotheses and prioritize work, but the analyst still validates the evidence.

Installation Guide

Docker architecture in brief
Docker architecture in brief
Docker startup logs
Docker startup logs

For a fresh local deployment, use Docker Compose.

git clone https://github.com/anpa1200/adversarygraph.git
cd adversarygraph
cp .env.example .env

Open .env and configure at least one LLM provider.

For a cloud provider:

ANTHROPIC_API_KEY=your_key_here
MINIMAX_API_KEY=your_key_here
MINIMAX_MODEL=MiniMax-M3
MINIMAX_BASE_URL=https://api.minimax.io/v1

For a local OpenAI-compatible endpoint such as Ollama, LM Studio, LocalAI, or vLLM:

LOCAL_LLM_BASE_URL=http://host.docker.internal:11434/v1
LOCAL_LLM_API_KEY=local
LOCAL_LLM_MODEL=llama3.1:8b

Then configure optional enrichment keys and feeds.

These keys are not required for the basic ATT&CK matrix, actor library, or local report analysis. They are used when you want IOC enrichment, actor-linked observables, source-backed feed sync, or external reputation context.

# abuse.ch ThreatFox IOC sync.
# Used for recent malware and botnet observables.
# If this is set, AdversaryGraph can sync ThreatFox on startup and during dynamic DB refresh.
THREATFOX_AUTH_KEY=your_abuse_ch_auth_key
AUTO_THREATFOX_SYNC_ON_STARTUP=true
AUTO_THREATFOX_SYNC_DAYS=7

# AlienVault OTX pulse enrichment.
# Used to search actor-attributed pulses and import source-backed IOCs.
OTX_API_KEY=your_otx_key

# VirusTotal on-demand enrichment.
# Used when an analyst clicks enrichment/check for an IP, domain, URL, or hash.
# Displays reputation, detections, tags, relationships, malware context, and possible TTP/actor hints.
VIRUSTOTAL_API_KEY=your_virustotal_key

# Daily dynamic DB refresh schedule in UTC.
# Refreshes public reference and configured intelligence sources.
DYNAMIC_DB_SYNC_HOUR=3
DYNAMIC_DB_SYNC_MINUTE=30
DYNAMIC_DB_IOC_SYNC_DAYS=7

Feed behavior:

Keep enrichment keys private. Do not commit a filled .env file. For team deployments, store secrets in your deployment secret manager or inject them through your orchestrator.

Start the platform:

docker compose up -d --build

Open the local interfaces:

Run the selftest:

./scripts/selftest.sh

On first startup, AdversaryGraph downloads and ingests MITRE ATT&CK and MITRE ATLAS reference data. This can take a few minutes. If the matrix is empty immediately after startup, wait for the sync to finish, refresh the page, or open the troubleshooting page from the app.

The detailed installation and operations documentation is here:

https://1200km.com/adversarygraph-docs/getting-started/

What Is New In v4

AdversaryGraph problem and capability map
AdversaryGraph problem and capability map

Version 4 expands AdversaryGraph into a broader AI CTI, malware-analysis, and asset attack-surface workbench.

The earlier versions focused heavily on ATT&CK mapping, actor comparison, AI report analysis, local LLM support, MITRE sync, ATLAS support, DFIR examples, sector intelligence, and actor IOC tabs.

Version 4 keeps the observable and enrichment workspace and adds MalwareGraph-backed malware analysis, isolated dynamic workflow planning, and Asset Attack Surface Mapping for uploaded inventories.

The major additions are:

IOC Library

Feeds and IOC source management
Feeds and IOC source management

The new IOC Library is the central observable workspace.

It allows analysts to search, filter, sort, enrich, and export indicators from multiple sources.

Supported use cases include:

This matters because IOCs usually arrive fragmented.

They may come from:

AdversaryGraph keeps these observables searchable in one place while preserving source labels.

VirusTotal Enrichment

API and enrichment workflow
API and enrichment workflow

Version 2.5 adds a cleaner VirusTotal lookup workflow.

An analyst can check:

The platform displays structured enrichment instead of raw API noise.

The enrichment view can show:

The important part is not just checking if an IOC is malicious.

The useful workflow is:

  1. check the observable;
  2. inspect context;
  3. identify related malware, actor, or behavior;
  4. map useful findings back to ATT&CK;
  5. decide whether the IOC is block, hunt, monitor, or context-only.

STIX, TAXII, MISP, And Custom Feeds

STIX and OpenCTI export flow
STIX and OpenCTI export flow

AdversaryGraph v4 adds more ways to exchange and ingest structured intelligence.

Supported workflows include:

This is important because every CTI team already has different sources.

Some teams use MISP. Some use OpenCTI. Some receive TAXII collections. Some maintain private CSVs. Some have customer-specific IOC lists.

AdversaryGraph does not force all data into one external platform first. It lets the analyst bring those sources into a local self-hosted workflow and review them in context.

YARA, Sigma, And Sandbox Behavior

Detection and behavior context workflow
Detection and behavior context workflow

The release also adds rule-feed and sandbox-behavior context.

YARA and Sigma feeds help answer:

Sandbox behavior feeds help answer:

This moves the platform further away from simple IOC lookup and closer to CTI-to-detection engineering.

AI Report Analysis

AI analysis provider and upload panel
AI analysis provider and upload panel
AI extracted mappings
AI extracted mappings

AdversaryGraph still includes the AI-assisted report analysis workflow.

Analysts can:

Supported provider directions include:

The purpose is not to blindly trust the model.

The purpose is to reduce repetitive extraction work while keeping analyst review central.

ATT&CK And ATLAS Navigator

ATT&CK Navigator matrix
ATT&CK Navigator matrix
Navigator selected layer
Navigator selected layer

AdversaryGraph includes matrix support for:

The Navigator workflow supports:

This makes the matrix a working tool instead of a static image.

Actor And Campaign Comparison

Group comparison graph
Group comparison graph

AdversaryGraph can compare selected TTPs against known actor and campaign profiles.

It uses TTP overlap and Jaccard similarity to rank possible matches.

This is useful for:

But the limitation is explicit:

Similarity is not attribution.

Many actors share common techniques. The analyst still needs corroborating evidence such as targeting, malware, infrastructure, tooling, timing, victimology, language, procedure details, or external reporting.

Sector Intelligence

Actor tactic and platform coverage
Actor tactic and platform coverage

AdversaryGraph includes sector-focused actor relevance workflows.

The analyst can filter by:

This is useful when a client asks a practical question:

Which attackers matter to my sector and environment right now?

Instead of giving a generic threat landscape, the analyst can create a more focused view:

This is especially useful for customer-facing CTI, vCISO-style reporting, SOC planning, and detection roadmap creation.

IOC-To-TTP Mapping

Practical attribution and IOC-to-TTP workflow
Practical attribution and IOC-to-TTP workflow

Version 2.5 improves the ability to connect observables back to behavior.

IOC-to-TTP mapping can come from:

This is important because IOCs alone are fragile.

Domains expire. IPs rotate. Hashes change.

Behavior is more durable.

AdversaryGraph tries to help the analyst move from:

indicator found

to:

behavior understood

to:

detection or hunt created.

DFIR Examples

DFIR examples list
DFIR examples list
DFIR report workflow
DFIR report workflow

The platform also includes DFIR report examples.

These are useful for:

The DFIR Examples workflow is useful because teams often need safe public material for demos and training instead of using private customer reports.

Operations And Pipeline

Stored report comparison and operations
Stored report comparison and operations

AdversaryGraph is not only a single analysis screen.

The platform includes operational workflow concepts:

This helps support repeatable CTI-to-detection operations rather than one-off analysis.

Two-Database Architecture

AdversaryGraph separates rebuildable public reference data from analyst/private data.

The model is:

This is important for Docker deployments.

The application can be rebuilt while private/custom data remains in the external persistent data location when configured correctly.

Selftest And Troubleshooting

Health and terminal checks
Health and terminal checks

The recent releases added clearer operational checks.

The platform includes:

This matters because self-hosted tools should fail clearly.

If ATT&CK data is not loaded, an API key is missing, or a sync route fails, the analyst should not have to guess.

Use Cases

I also created a structured use-case library for the project.

It contains:

Examples include:

The public use-case page is here:

https://1200km.com/adversarygraph/use-cases.html

Licensing Change

The license has changed.

AdversaryGraph is now under the AdversaryGraph Personal Use License.

Personal/private use is free.

Business, commercial, organizational, client-delivery, production, or government use requires prior written approval from Andrey Pautov.

This change is intentional.

The project is still available for personal research, learning, private lab use, and individual analyst workflows. But business or organizational use now requires approval.

What This Release Means

AdversaryGraph v4 is no longer only an ATT&CK mapping tool.

It is becoming a broader self-hosted CTI workbench:

The platform is most useful when the analyst needs to connect:

Who Should Use It

AdversaryGraph full cover visual
AdversaryGraph full cover visual

AdversaryGraph is useful for:

It is especially useful when the analyst wants a private, self-hosted environment instead of sending reports and IOCs into a SaaS tool.

Published Article Visual Asset Gallery

All screenshots and infographics mirrored from the published Medium article are stored locally so the documentation and 1200km mirror do not depend on Medium CDN availability.

Published Medium visual 01-31Nq2VMJ9Mm9lgryHGJRQQ
Published Medium visual 01-31Nq2VMJ9Mm9lgryHGJRQQ
Published Medium visual 02-69nMwI7Xj8eNIWHv_C_KVg
Published Medium visual 02-69nMwI7Xj8eNIWHv_C_KVg
Published Medium visual 03-7jquz_YKO0Odni3r3InzYw
Published Medium visual 03-7jquz_YKO0Odni3r3InzYw
Published Medium visual 04-VAfpLRWhfkB0pwRR5C4Nlw
Published Medium visual 04-VAfpLRWhfkB0pwRR5C4Nlw
Published Medium visual 05-Up-LNxuga22bScwyZiFuHA
Published Medium visual 05-Up-LNxuga22bScwyZiFuHA
Published Medium visual 06-4zLLN71CBFHIMCEPOrTxmw
Published Medium visual 06-4zLLN71CBFHIMCEPOrTxmw
Published Medium visual 07-Dw7KTqHRijCEkYvUrdBMbQ
Published Medium visual 07-Dw7KTqHRijCEkYvUrdBMbQ
Published Medium visual 08-07j05Kn78RJY96S3Ga4IVQ
Published Medium visual 08-07j05Kn78RJY96S3Ga4IVQ
Published Medium visual 09-z711T5SOrORpjITlM2IY9A
Published Medium visual 09-z711T5SOrORpjITlM2IY9A
Published Medium visual 10-a6c9YTdIktlPk1w0FRQHaA
Published Medium visual 10-a6c9YTdIktlPk1w0FRQHaA
Published Medium visual 11-z4L2KcZIixQjdkrcBt8OlA
Published Medium visual 11-z4L2KcZIixQjdkrcBt8OlA
Published Medium visual 12-l_EPylZmZEnAaDF6JjQE4w
Published Medium visual 12-l_EPylZmZEnAaDF6JjQE4w
Published Medium visual 13-CsGSK7APVQvnvTDCLxXKNA
Published Medium visual 13-CsGSK7APVQvnvTDCLxXKNA
Published Medium visual 14-EsC2UAT23n0xRDPv29oEWg
Published Medium visual 14-EsC2UAT23n0xRDPv29oEWg
Published Medium visual 15-89fT-TuOac6OMSNdZ61vag
Published Medium visual 15-89fT-TuOac6OMSNdZ61vag
Published Medium visual 16-FpAXPkiL1j3fiuOkL7tp8A
Published Medium visual 16-FpAXPkiL1j3fiuOkL7tp8A
Published Medium visual 17-aSqu_irokLlGQa1Njwa0fQ
Published Medium visual 17-aSqu_irokLlGQa1Njwa0fQ
Published Medium visual 18-RL5VY8-RMrIQv_SIZpwPQQ
Published Medium visual 18-RL5VY8-RMrIQv_SIZpwPQQ
Published Medium visual 19-T8D25vI8Mt2T7iWmqEJkfA
Published Medium visual 19-T8D25vI8Mt2T7iWmqEJkfA
Published Medium visual 20-q9LHKlOmbS1119qTlPKjIA
Published Medium visual 20-q9LHKlOmbS1119qTlPKjIA
Published Medium visual 21-QkMDTHSy82_j4PA96Q3j6A
Published Medium visual 21-QkMDTHSy82_j4PA96Q3j6A
Published Medium visual 22-62_zstQMYPoqj4kSTn4nBg
Published Medium visual 22-62_zstQMYPoqj4kSTn4nBg
Published Medium visual 23-XfbZTKCAGTSArnhi3tiMOA
Published Medium visual 23-XfbZTKCAGTSArnhi3tiMOA
Published Medium visual 24-m1Zh30Hm7e6wmzZq1Mjdog
Published Medium visual 24-m1Zh30Hm7e6wmzZq1Mjdog
Published Medium visual 25-lKoiwInK4AuBHDFSINWekA
Published Medium visual 25-lKoiwInK4AuBHDFSINWekA
Published Medium visual 26-aJW4II93D-bLqFMexDlW1g
Published Medium visual 26-aJW4II93D-bLqFMexDlW1g
Published Medium visual 27-_Dlqijzjnt_Ehr1ULHPmrg
Published Medium visual 27-_Dlqijzjnt_Ehr1ULHPmrg
Published Medium visual 28-lLkb-oRUX5Tns2S85SS16g
Published Medium visual 28-lLkb-oRUX5Tns2S85SS16g
Published Medium visual 29-0dTCvSgZ4dMeQDXkbutXPA
Published Medium visual 29-0dTCvSgZ4dMeQDXkbutXPA
Published Medium visual 30-ecTDnydMYwWX8-Ncuk8GfQ
Published Medium visual 30-ecTDnydMYwWX8-Ncuk8GfQ
Published Medium visual 31-JDE0azpONj0OVW95p9yZkg
Published Medium visual 31-JDE0azpONj0OVW95p9yZkg
Published Medium visual 32-oyHjzN-tAx7Lx19Xg0IPyA
Published Medium visual 32-oyHjzN-tAx7Lx19Xg0IPyA
Published Medium visual 33-Rai3eOrk1Upsd4zeHxtroA
Published Medium visual 33-Rai3eOrk1Upsd4zeHxtroA
Published Medium visual 34-lp9MmZunILgId0X7JHQVbw
Published Medium visual 34-lp9MmZunILgId0X7JHQVbw

Final Thought

The main idea behind AdversaryGraph is simple:

CTI should not stop at reading reports.

Good CTI should become:

That is what AdversaryGraph v4 is built to support.

Project: https://github.com/anpa1200/adversarygraph

Documentation: https://1200km.com/adversarygraph-docs/

Project hub: https://1200km.com/adversarygraph/

Release: https://github.com/anpa1200/adversarygraph/releases

Use cases: https://1200km.com/adversarygraph/use-cases.html