Attackflow
Attackflow
Release v2.0.0
1 Overview 3
1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Who is Attack Flow For? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Use Cases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.4 Get Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.5 Deep Dive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.6 Notice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Introduction 7
2.1 Action Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Condition Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3 Parallel Attack Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.4 Operator Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5 Asset Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.6 Success and Failure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.7 Additional STIX Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3 Example Flows 17
3.1 List of Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4 Builder 19
4.1 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.2 Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.3 Download . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4.4 Developer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5 Language 27
5.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.2 STIX Datatypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5.3 STIX Common Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
5.4 Attack Flow SDOs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5.5 Effects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
5.6 Confidence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
i
7 Developers 45
7.1 Attack Flow Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
7.2 Attack Flow Builder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
7.3 Releases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
8 Translation to OWL/RDF 55
8.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
8.2 The Context . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
8.3 Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
8.4 Converting to RDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
8.5 Full Code Listing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
9 Changelog 73
9.1 Attack Flow 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
9.2 Attack Flow 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
ii
Attack Flow, Release v2.0.0
Attack Flow is a language for describing how cyber adversaries combine and sequence various offensive techniques
to achieve their goals. The project helps defenders and leaders understand how adversaries operate and improve their
own defensive posture. This project is created and maintained by the MITRE Engenuity Center for Threat-Informed
Defense in futherance of our mission to advance the start of the art and and the state of the practice in threat-informed
defense globally. The project is funded by our research participants.
CONTENTS 1
Attack Flow, Release v2.0.0
2 CONTENTS
CHAPTER
ONE
OVERVIEW
Defenders think in lists. Attackers think in graphs. As long as this is true, attackers will win.
—John Lambert, April 26, 2015
1.1 Introduction
The Attack Flow project helps defenders move from tracking individual adversary behaviors to tracking the sequences
of behaviors that adversaries employ to move towards their goals. By looking at combinations of behaviors, defenders
learn the relationships between them: how some techniques set up other techniques, or how adversaries handles un-
certainty and recover from failure. The project supports a wide variety of use cases: from blue team to red team, from
manual analysis to autonomous response, and from front-line worker to the C-suite. Attack Flow provides a common
language and toolset for describing complex, adversarial behavior.
This project is targeted at any cyber security professional seeking to understand how adversaries operate, the impact
on their organization, and how to most effectively improve their defensive posture to address those threats. Threat
intelligence analysts, security operations, incident response teams, red team members, and risk assessors are some of
the groups that can benefit from Attack Flow. This specification facilitates sharing of threat intelligence, communicating
about risks, modeling efficacy of security controls, and more. The project includes tools to visualize attacks for the
benefit of low-level analysis as well as communicating high-level principles to management.
3
Attack Flow, Release v2.0.0
sequences of attack, allowing defenders to play out hypothetical scenarios (e.g. table top exercises) with high fidelity.
Defenders can reason about security controls over chains of TTPs to determine gaps in coverage, as well as choke points
where defenses should be prioritized.
Executive Communications
Front-line cyber professionals can use Attack Flow to roll up highly complicated, technical details of an incident into
a visual depiction that aids communication with non-technical stakeholders, management, and executives. This format
Attack Flow allows defenders to present their analysis of an attack and their defensive posture strategically while de-
emphasizing raw data, technical jargon, and other information that executives do not need to make a business decision.
Defenders can use flows to communicate the impact of an attack in business terms (i.e. money) and make a convincing
case for new tools, personnel, or security controls to prioritize.
Lessons Learned
Incident responders can use Attack Flow to improve their incident response (IR) planning and after-action reveiew.
After a security incident has occurred, responders can create flows to understand how their defenses failed and where
they can apply controls to reduce future risk and enhance threat containment. Mapping a flow will also allow defenders
to see where their defenses succeeded and what they should continue to do going forward. Creating attack flows is an
easy way to ensure the incident is documented and organizational knowledge is retained for future use. Over time, this
will improve defenders’ ability to mitigate and recover from incidents more efficiently.
Adversary Emulation
The red team can use Attack Flow to create adversary emulation plans that focus their security testing on realistic
sequences of TTPs informed by public as well as proprietary intelligence. The red team can leverage a corpus of attack
flow to identify common attack paths and TTP sequences. In purple team scenarios, a flow is a very precise way to
communicate between attackers and defenders.
Threat Hunting
Threat hunters can use Attack Flow to identify common sequences of TTPs observed in the wild, then hunt for those
same TTP chains in their own environment. These flows can guide investigative searches, piecing together techniques
and timestamps to construct detailed timelines. Attack Flow can showcase the adversary tools and TTPs that are
being used, which can help aid in writing detections against common behaviors and/or adversary toolsets, as well as
prioritizing those detections.
Here are a few ways for you to learn more and get started with Attack Flow:
1. Look at the corpus of example flows. The corpus is a great place to start learning about Attack Flow.
If you’re new to the industry, it’s also a great way to familiarize yourself with some high-profile breaches!
2. Build your own flow. The Attack Flow Builder is a user-friendly tool that runs in your browser (no download
required!) and will let start creating flows in just minutes.
3. Tell us what you think. Find us on LinkedIn or email us ctid@[Link] and let us know how
you’re using Attack Flow and what ideas you have to improve it.
4. Spread the word! Our goals is to get members of the community excited about Attack Flow and adopt it
in their own work. Attack Flow is open source and royalty-free, so go ahead and share it to your professional
network!
4 Chapter 1. Overview
Attack Flow, Release v2.0.0
If you decide you want to dive even deeper into Attack Flow, here are the key resources for building up a full under-
standing of the project:
• The language specification goes into very deep detail about the inner working of Attack Flow. This is intended
for developers who want to write code that works with Attack Flow, and not required reading for the general
audience.
• The developer guide explains how to set up a development environment if you want to start using the Attack
Flow python library or modify the Attack Flow Builder.
• The GitHub repository is ready for your contributions – issues and pull requests are welcome!
1.6 Notice
© 2022 MITRE Engenuity. Approved for public release. Document number CT0040.
Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with
the License. You may obtain a copy of the License at [Link]
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an
“AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations under the License.
This project makes use of ATT&CK®: ATT&CK Terms of Use
6 Chapter 1. Overview
CHAPTER
TWO
INTRODUCTION
This chapter introduces the main concepts of Attack Flow with visual examples taken from the Attack Flow Builder.
The example start with simple scenarios and work up to complex situations.
An action represents an adversary executing a specific technique. For example, T1566: Phishing is a common adver-
sarial technique that captured in the ATT&CK knoweldge base. If an adversary utilizes this behavior during a specific
breach, then that is an action.
Note: The examples here depict ATT&CK techniques, but Attack Flow does not require the use of ATT&CK. You
may use custom collections of techniques, e.g. created in Workbench, other knowledge bases such as VERIS, or even
create ad hoc actions to describe techniques that are not part of any pre-existing taxonomy.
Adversary behavior is the focal point of the Attack Flow project, and actions are the backbone of any flow. Sequences
of adversary behavior are represented by connecting actions together with an arrow.
When two actions are connected together, it represents a dependency between them: the second action cannot be
executed until the first action completes successfully. (The handling of failed actions is discussed later.) This is not
equivalent to saying that one action happened before another! This is a more powerful concept that models how an
adversary uses one behavior to create the preconditions they need to execute the next behavior.
Sometimes the relationship between two actions is not immediately obvious to the reader, especially if the underlying
techniques are especially obscure or rare. A condition describes the state of the world after the preceding action
finishes. This can be used to clarify for the reader how two actions are related, i.e. what one action accomplishes that
enables the next action to run.
In the example above, the reader may not know enough about LSASS, password hashes, or password cracking to
understand how the first two actions lead to the third. The condition object fills this gap by succinctly describing the
outcome (or effect) of the first two actions that enables the third action.
7
Attack Flow, Release v2.0.0
8 Chapter 2. Introduction
Attack Flow, Release v2.0.0
Fig. 2: A condition clarifies how the outcome of an action sets up the execution of another next action.
The adversary may have multiple available techniques to execute in a given scenario. In the next example, the attacker
has used two different persistence mechanisms. Although the attacker is not literally executing these techniques simul-
taneously, it helps to think of these as “parallel” attack paths because neither technique depends on successful execution
of the other.
Fig. 3: The attack branches out to show that the adversary has multiple persistence techniques.
Note: Flows can represent adversary behavior in different scopes, e.g. portraying a single specific incident versus
portraying an overall campaign. In a specific incident scope, parallel attack paths indicate the attacker executing dif-
ferent techniques. On the other hand, the campaign scope rolls up behavior across multiple incidents, so parallel paths
represent the different behaviors that have been observed across multiple incidents.
After a flow splits into parallel attack paths, operators combine them back together. An OR operator means that only
of the incoming attack paths needs to succeed in order to continue the flow, while an AND operator means that all of the
incoming attack paths must succeed in order to continue. The next example shows that the adversary has two different
techniques for pivoting into a different user account. If either technique succeeds, then the attack can continue forward.
When multiple attack paths are combined, the logic can be difficult for the reader to follow. This is a great place to use
conditions to clarify what the state of the world is at that point in the flow.
10 Chapter 2. Introduction
Attack Flow, Release v2.0.0
Fig. 4: An OR operator shows that the attacker has two different techniques for pivoting to a local user account.
Fig. 5: A condition object clarifies how the actions before the operator are related to the action after the operator.
12 Chapter 2. Introduction
Attack Flow, Release v2.0.0
Perhap the reader does not understand the consequences of dumping LSASS memory or how it relates to the actions
that come afterward. The condition clarifies that the adversary is now able to pivot into a different user account.
Warning: It is possible to join paths together without using an operator by simplying pointing two arrows at a
single action or condition. This approach is ambiguous because it’s not clear how the sucess or failure of those paths
affects the outcome of the flow, but ambiguity may be appropriate in some circumstances, e.g. if the underlying
CTI is itself ambiguous.
Each action can potentially have some outcome or effect on the world. It is often informative to describe the effect in
terms of some object in the world that has been impacted. Actions can point to assets to indicate which objects are
impacted as well as which objects are used in subsequent techniques.
Fig. 6: An asset clarifies how actions modify the state of the world or depend on the state of the world.
In this example, the asset shows which particular password hash was disclosed by LSASS memory dumping. Later
in the flow, the adversary cracks that password hash. An asset can also point to another object to provide additional
structured data.
Attention: The user account object in this example is one of the many available STIX objects. This aspect of
Attack Flow is covered in depth later in this chapter.
When modeling complex adversary behavior, conditions can also depict how the attacker handles branches that are
only feasible in specific circumstances.
Fig. 7: Conditions model when different branches of the attack can be taken.
In this example (an excerpt from the NotPetya flow), the malware has two different privilege escalation techniques.
Each technique depends on the host process having a specific Windows privilege. The conditions depict what state is
required for each path to continue executing. The attack can go down one path, both paths, or neither path depending
on the state of the host process.
Conditions can also model how the adversary handles failure. All the examples up to this point have used the true
branch of each condition to represent what happens when the underlying condition is true. But conditions also have a
false branch that is activated when the condition is not true.
In this example, the adversary attempts to steal a targeted user’s credentials via spearphishing. Since this technique
relies evading email filtering and tricking users, it is inherently unreliable. The condition object after spearphishing
shows a decision point for the adversary: if they obtained a credential then they can move on to logging in with it. But
if the spearphshing fails, then the adversary falls back to a password spraying technique in another attempt to obtain a
valid credential.
14 Chapter 2. Introduction
Attack Flow, Release v2.0.0
Fig. 8: The “false” branch portrays what happens when a technique fails.
2.6. Success and Failure 15
Attack Flow, Release v2.0.0
This introduction focuses on the core Attack Flow objects, but Attack Flow is based on the STIX industry standard, so
you can also use any available STIX object in your flows! STIX contains a variety of useful objects to enrich your flow
with including IOCs and contextual details. This next example shows the standard STIX process object being used to
provide details about how the file discovery technique was executed.
Fig. 9: The process object provides technical details regarding how the action was executed.
Now that you are familiar with the central concepts, continue reading to review the corpus of example flows and how
to use the Attack Flow Builder to start creating your own flows.
16 Chapter 2. Introduction
CHAPTER
THREE
EXAMPLE FLOWS
The Attack Flow project includes a corpus of example flows that may be useful for learning about Attack Flow, studying
high-profile breaches, or mining the data for statistical patterns. You can download the entire corpus from the Attack
Flow release page, or you can view individual flows on this page. Each Attack Flow is provided in multiple formats:
Builder (.afb) The format used for creating and editing in the Attack Flow Builder.
JSON (.json) The machine-readable format for exchanging flows.
Graphviz (.dot) An example of converting from Attack Flow to another graph format in order to take advantage of
other tool ecosystems. Must install Graphviz to use this format, or use our pre-rendered Graphviz .png files.
Mermaid (.mmd) Mermaid is another graph format that you can convert Attack Flow into. Notably, Mermaid graphs
can be embedded directly in GitHub Markdown files.
17
Attack Flow, Release v2.0.0
Conti CISA Alert Dr. Desiree Beck Conti ransomware flow based on CISA alert.
Conti PWC Dr. Desiree Beck Conti ransomware flow based on PWC report.
Equifax Breach Lauren Parker Attack flow on the 2017 Equifax breach.
FIN13 Case 1 Mia Sanchez Attack by FIN13 against a Latin American bank
FIN13 Case 2 Mia Sanchez Attack flow for the FIN13 campaign targeting a bank in
Peru.
Gootloader Mia Sanchez Attack flow on the Gootloader payload distribution at-
tack.
JP Morgan Breach Lauren Parker Attack flow on the 2014 JP Morgan breach.
Marriott Breach Lauren Parker A data breach at the Marriott hotel group in 2018.
FOUR
BUILDER
Attack Flow Builder is a free and open source tool for creating, viewing, and editing Attack Flows.
Fig. 1: View and edit Attack Flows using an intuitive drag-and-drop interface.
This web-based tool provides a workspace where you can populate information about adversary actions and additional
context, then weave those items into a flow by drawing arrows to indicate the sequences of adversary techniques ob-
served during an incident or campaign.
19
Attack Flow, Release v2.0.0
The quickest and easiest way to get started is with our online option. Click the button below to open the builder in
a new tab, or select one of the Example Flows for viewing it in Attack Flow Builder.
Caution: The online Attack Flow Builder stores documents in memory and on disk on your local machine, so any
flows that you create or edit are completely private. However, the online version is accessed over the internet, and
so your connection may be visible to some third parties (e.g. GitHub, ISPs). For a completely private experience,
consider using the download or Docker approaches described below.
When you first open the Builder, if you did not select one of the example flows then you will initially see a blank
workspace. A menubar across the top contains a lot of options for working with the flow, similar to what you would
find in any flowchart software.
The right panel of the workspace contains properties for the currently selected object or–when no object is selected–the
properties for the flow itself. Begin by filling in a name and description for your flow. You can also fill in your
information in the author fields and cite any sources using the “external references” fields.
Right click in the workspace to open up a menu, then go to Create → Attack Flow → Action to create a new action
20 Chapter 4. Builder
Attack Flow, Release v2.0.0
object.
Fig. 4: This action is empty because no properties have been filled in.
Click on the action to highlight it. The action’s properties are now displayed in the side panel. Fill in a name, technique
ID, and description, and notice how the action object displays the data you’ve entered.
Repeat the steps to create a second action with details filled in. Then drag a line from the anchor points (little X marks)
on one action to the other action to create an arrow. Notice that if you move either action, the arrow stays attached to it.
Continue to build out your flow by adding objects, filling in the attributes, and drawing arrows between nodes. When
you are done, you go to the File menu to save your flow.
If you make any errors while building your flow, e.g. not filling in a required field, the validation pane calls your
attention to the changes you need to make. If you click one of the items, the builder will zoom to the corresponding
object, which makes it easy to locate the source of the problem.
Continue to build out your flow by adding objects, filling in the attributes, and drawing arrows between nodes. When
you are done, you go to the File menu to save your flow.
Save Saves the flow in *.afb format, which can be opened for further editing in the future.
Save as Image Saves the flow in *.png format, which is great for visualizing, using in presentations, sharing with
others, etc..
Save Selection as Image When you have one or more objects selected, this menu item will save an excerpt of the
selected items in *.png format. (This is how many of the examples in this documentation were created!)
Publish Attack Flow Saves the flow in *.json format, which is the machine-readable format for exchanging and pro-
cessing Attack Flows.
Fig. 5: The action displays the properties that are filled in.
22 Chapter 4. Builder
Attack Flow, Release v2.0.0
Fig. 6: Build flows by creating multiple objects and connecting them together.
Fig. 7: This flow is invalid because the first action does not have a name filled in, and names are required for all actions.
Fig. 8: There are a few different options for saving or exporting your flow.
24 Chapter 4. Builder
Attack Flow, Release v2.0.0
Warning: The Attack Flow Builder does not automatically save your work. If you accidentally close the tab or
navigate forward or backward, you will lose any unsaved work. Remember to save your work frequently. (This
issue will be addressed in a future release.)
There are a ton of useful features in the builder! Way more than we can cover here. To fully master this tool, we
encourage you to experiment with all of the different options and commands and try building some sample flows.
4.2 Docker
If you do not want to use the Attack Flow Builder embedded in this site, you can run it locally using Docker as shown
below.
Once the container is running, you can open a brower tab to [Link] to view the Builder.
If you want to customize and build your own Docker images, edit the Dockerfile and then run this command to create
the Docker image:
$ make docker-build
docker build . -t attack-flow-builder:latest
[+] Building 2.9s (13/13) FINISHED
=> [internal] load build definition from Dockerfile ␣
˓→ 0.0s
=> => transferring dockerfile: 269B ␣
˓→ 0.0s
=> [internal] load .dockerignore
...
If building the image completes successfully, then use this command to run the image:
$ make docker-run
docker run --rm -p 8080:80 attack-flow-builder:latest
/[Link]: /docker-entrypoint.d/ is not empty, will attempt to perform␣
˓→configuration
4.3 Download
If you do not wish to use Docker, you can also download the Builder from the GitHub repository:
1. Go to the Attack Flow release page and download attack_flow_builder.zip.
2. Unzip it.
3. In the attack_flow_builder/ directory, double click on [Link] to open it in a web browser.
4.2. Docker 25
Attack Flow, Release v2.0.0
4.4 Developer
Finally, if you wish to help contribute code for Attack Flow Builder, you can set up Builder in a development environ-
ment.
26 Chapter 4. Builder
CHAPTER
FIVE
LANGUAGE
5.1 Overview
Attack Flow is a machine-readable language that is defined as an extension to the Structured Threat Information Ex-
pression (STIX) 2.1 Standard. STIX is a machine-readable standard for cyber threat intelligence that is expressed in
JSON for easy parsing and processing across a variety of programming languages and computer architectures. STIX
2.1 has a formal extension mechanism that allows STIX to be augmented with new features and capabilities.
As a result of extending STIX, the Attack Flow language is interoperable with a broad ecosystem of STIX content,
tools, and vendors. A flow can reference external STIX objects (e.g. an identity or a threat actor) and external STIX
objects can also refer back to an attack flow. Attack Flow extends STIX by defining several new STIX Domain Objects
(SDOs) that are described below.
The formal specification for the Attack Flow language is represented as a JSON schema, but this page summarizes the
extension objects and attributes that make up the language.
STIX has built-in datatypes that are used in Attack Flow. The datatypes that are most relevant to Attack Flow are
summarized below.
Datatype Description
boolean A value of true or false.
enum A value from a STIX Enumeration.
external-reference A non-STIX identifier or reference to other related external content.
float An IEEE 754 [IEEE 754-2008] double-precision number.
identifier An identifier (ID) is for STIX Objects.
integer A whole number.
string A series of Unicode characters.
timestamp A time value (date and time).
For the full list of data types, see the STIX Standard Chapter 2.
27
Attack Flow, Release v2.0.0
All STIX objects, including Attack Flow objects, share a set of common properties. The most important common
properties are described in the table below. (See the STIX specification for the complete list of common properties.)
28 Chapter 5. Language
Attack Flow, Release v2.0.0
This section describes the STIX Domain Objects (SDOs) defined in the Attack Flow extension. The complete extension,
schema, and example flow can be found on the Attack Flow GitHub.
Every Attack Flow document MUST contain exactly one attack-flow object. It provides metadata for name and
description, starting points for the flow of actions, and can be referenced from other STIX objects.
Example:
{
"type": "attack-flow",
"spec_version": "2.1",
"id": "attack-flow--e9ec3a4b-f787-4e81-a3d9-4cfe017ebc2f",
"created_by_ref": "identity--fe7860f3-e23f-4d3f-9248-91105467a77a",
"created": "2022-08-02T[Link].143Z",
"modified": "2022-08-02T[Link].143Z",
"name": "Example Flow",
"description": "This Attack Flow example demonstrates some of the key concepts of the␣
˓→Attack Flow specification.",
"scope": "incident",
"start_refs": [
"attack-action--37345417-3ee0-4e11-b421-1d4be68e6f15",
"attack-action--3ea0de71-67a6-426e-bb2f-86375c620478",
"attack-action--4f541c4c-b7bb-4b14-befd-ca8e8fe12599"
],
"external_references": [
{
"source_name": "APT X Campaign Report. Fictitious Corp. August 15 2022.",
"description": "A threat intel report summarizing the public CTI associated with␣
˓→the APT X phishing campaign.",
"url": "[Link]
},
{
(continues on next page)
"url": "[Link]
}
],
"extensions": {
"extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4": {
"extension_type": "new-sdo"
}
}
}
An attack-action object represents the execution of a particular technique, i.e. a discrete unit of adverary behavior.
Example:
30 Chapter 5. Language
Attack Flow, Release v2.0.0
{
"type": "attack-action",
"spec_version": "2.1",
"id": "attack-action--37345417-3ee0-4e11-b421-1d4be68e6f15",
"created": "2022-08-02T[Link].143Z",
"modified": "2022-08-02T[Link].143Z",
"technique_id": "T1583.002",
"name": "Acquire Infrastructure: Domains",
"technique_ref": "attack-pattern--40f5caa0-4cb7-4117-89fc-d421bb493df3",
"description": "The attacker obtains a phishing domain similar to the target company.",
"effect_refs": [
"attack-condition--7e809f5b-319a-4b3f-82fe-e4dc09af5088"
],
"extensions": {
"extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4": {
"extension_type": "new-sdo"
}
}
}
An asset is any object that is the subject or target of an action. Assets can be technical assets (such as machines and
data) or non-technical assets such as people and physical systems. Actions typically either modify or depend upon the
state of an asset in some way.
Note that assets are not applicable in all contexts. For example, public threat reports may not include enough detail
to represent the assets in a flow, or the flow might represent aggregate behavior (at the campaign or actor level) for
which it does not make sense to specify an asset. Assets should be used to add context to a flow when the underlying
intelligence contains sufficient detail to do so.
Example:
{
"type": "attack-asset",
"spec_version": "2.1",
"id": "attack-asset--f7edf4aa-29ec-47aa-b4f6-c42dfbe2ac20",
"created": "2022-08-02T[Link].143Z",
"modified": "2022-08-02T[Link].143Z",
"name": "Employee WordPress Account",
(continues on next page)
An attack-condition object represents some possible condition, outcome, or state that could occur. Conditions can
be used to split flows based on the success or failure of an action, or to provide further description of an action’s results.
Example:
{
"type": "attack-condition",
"spec_version": "2.1",
"id": "attack-condition--7e809f5b-319a-4b3f-82fe-e4dc09af5088",
"created": "2022-08-02T[Link].143Z",
"modified": "2022-08-02T[Link].143Z",
"description": "Adversary possesses a phishing domain.",
(continues on next page)
32 Chapter 5. Language
Attack Flow, Release v2.0.0
An attack-operator object joins multiple attack paths together using boolean logic.
Example:
{
"type": "attack-operator",
"spec_version": "2.1",
"id": "attack-operator--609d7adf-a3d2-44e8-82de-4b30e3fb97be",
"created": "2022-08-02T[Link].143Z",
"modified": "2022-08-02T[Link].143Z",
"operator": "AND",
"effect_refs": [
"attack-action--d68e5201-796c-469c-b012-290b7040db02"
],
"extensions": {
"extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4": {
"extension_type": "new-sdo"
}
}
}
5.5 Effects
One of the key ideas behind Attack Flow is understanding how individual adversary techniques relate to each other.
The concept of effect is critical for understanding these relationships between techniques. An effect is the outcome,
result, or change in state that occurs when an adversary executes a technique. Examples of effects include:
1. The attacker modifies the state of an asset, e.g. opening a port on the firewall.
2. The attacker gains some knowledge, e.g. a password.
3. The attacker achieves code execution.
Actions can produce effects, and subsequent actions may depend on those effects:
1. The attacker wants to connect to an internal service, which requires opening a port on the firewall.
2. The attacker wants to log in remotely, which depends on knowing the password.
3. The attacker wants to run a C2 implant, which depends on having code execution.
While an action is being executed, it’s effect is an indeterminate state, i.e. we cannot make any statement about the
outcome or result. Once the action concludes, then we can evaluate its effects, whether it succeeded or failed, etc.
When one action is chained to another, the latter depends on the effects of the former, i.e. the second one can only
execute when the first one completes successfully.
A condition splits a flow into multiple paths based on evaluating an effect, e.g. if the action is a privilege escalation ex-
ploit, then the condition can test whether the attacker has obtained elevated privileges (i.e. the exploit succeeded) or still
has regular privileges (i.e. the exploit failed.) A condition always selects one path to follow, either the on_true_refs
or the on_false_refs.
On the other hand, an operator joins multiple attack paths together by aggregating multiple effects. Conditions and
operators can be used to encode complex behavior into an attack flow that represents how attackers coordinate multiple
behaviors to achieve a desired outcome, as well as how they handle individual technique failure.
5.6 Confidence
The confidence property is STIX common property that establishes the confidence in the correctness of the data in
a particular object, e.g. in a particular attack-action. In STIX, the value is defined as a number from 0 to 100
(inclusive), i.e. a percentage. It is often difficult or impossible to estimate confidence to that level of precision, because
Attack Flow typically describes real-world behavior that may have been observed only a few times, which is not a large
enough sample to compute precise statistics.
To make confidence easier to reason about, Attack Flow uses the following confidence scale to map confidence terms
to numbers, and vice-versa.
34 Chapter 5. Language
Attack Flow, Release v2.0.0
5.6. Confidence 35
Attack Flow, Release v2.0.0
36 Chapter 5. Language
CHAPTER
SIX
This chapter addresses considerations for creating flows that are outside the scope of the technical specification. While
it is possible to create a valid flow without adhering to these rules, we recommend employing these best practices to
produce high-quality flows.
The technical specification and the project as a whole are referred to as “Attack Flow” (with capital letters), while the
individual files created using the language are referred to as “attack flows” (lower case).
If you choose to use an open-source report to create an attack flow, it is important to assess the strengths and weaknesses
of the report in order to establish a confidence level in its data and assessments. Factors affecting source quality include
the manner of data collection, the level of source access to the data, report completeness, and the age and currency of
the information. In addition to extracting the technical details, it is also beneficial to construct the victimology of the
attack from the reports, as its inclusion will allow any reader to quickly gauge the scope and applicability of the flow
to their own organization. It is important to use high-quality sources, because they will support the credibility of your
flow and provide an accurate portrayal of the threat, which may be used to inform decisions on defense and resource
prioritization.
Conversely, sources that do not meet the above criteria should be avoided. Sources that do not have technical expertise
and the ability to analyze the malware or attack themselves (for example, news sites) are not considered optimal for
creating attack flows.
37
Attack Flow, Release v2.0.0
Cloudflare: “What are Petya and NotPetya?” This article simply summarizes the attack and does not offer the tech-
nical detail needed to create a flow.
Vox: “U.S. hospitals have been hit by the global ransomware attack” This news article does not have the source
credibility and technical detail needed to create a flow.
Trellix: “Update on WhisperGate, Destructive Malware Targeting Ukraine - Threat Intelligence & Protections Update”
This article focuses on mitigation strategies and tools rather than the technical details of the attack. However, the
report bases its information on a technical report by Trellix, which would be a good source to create an attack
flow.
Crowdstrike: “NotPetya Technical Analysis - A Triple Threat: File Encryption, MFT Encryption, Credential Theft”
Crowdstrike performs a first-hand analysis of the NotPetya malware and provides a sufficient level of technical
detail.
Cisco Talos: “Ukraine Campaign Delivers Defacement and Wipers, in Continued Escalation” Cisco performs a
first-hand analysis of the WhisperGate malware and provides sufficient technical detail. This report also provides
information on adversary intent, targeting, and attribution, and distinguishes between information and analytical
judgements.
The DFIR Report: “SEO Poisoning - A Gootloader Story” DFIR performs a first-hand analysis of this attack and
provides sufficient technical detail, including a detailed timeline of events.
Note: The three examples in this section have all been mapped into attack flows in Example Flows.
MITRE ATT&CK™ is a knowledge base observed adversary tactics, techniques, and procedures extracted from public
threat reporting. There are hundreds of techniques in the ATT&CK knowledge base, and it can be challenging to map
CTI reports if you are not familiar with the overall structure of ATT&CK.
Attention: Attack Flow does not require the use of ATT&CK. You may use adversary techniques from other
knowledge bases or even proprietary techniques that are not part of any public reporting.
This section works through an example of mapping a report to illustrate the process. The report used is from Cisco
Talos: “Iranian APT MuddyWater targets Turkish users via malicious PDFs, executables”. The corresponding attack
flow can be found in Example Flows.
Initial Access
The adversary gains initial access to the system through the distribution of PDF files containing embedded links.
Execution
The malware requires user-interaction to execute.
Infection Chain
The malicious XLS file variation executes via VBA macros and establishes persistence.
There was no ATT&CK technique associated with this Canary Token technique that may have served as a means of
defense evasion or anti-analysis. The action was simply named “Canary Token Execution.”
This variation of the malware concludes with the PowerShell downloader reaching out to a remote location for the final
payload, which Cisco was unable to obtain.
Impact
Because Cisco was unable to obtain the final payload, we cannot determine the objective of the attack. However, we
can assess possible impact based on information in the report on Muddy Water’s observed behavior in past campaigns.
We will reflect this uncertainty in our flow in the Action descriptions and confidence property and by using an OR
operator.
The following best practices pertain to how the individual objects are arranged together to form an attack flow.
Begin a flow with either a Reconnaissance, Resource Development, or Initial Access Technique. If the Initial
Access vector is unknown, begin the flow with a condition stating that the Initial Access vector is unknown, along with
any other details on the compromised state of the system. If there are multiple possible Initial Access vectors, combine
them using an OR operator.
Use preconditions to enhance human understanding of the flow. If a set of actions are self-explanatory, omit the
precondition and connect the actions to each other directly. For example, the NotPetya encryption routine does not
require preconditions in between the actions.
End a flow with an Impact technique. If the Impact is unknown, end the flow with condition stating that the impact
is unknown, along with any other relevant details.
The description field for the flow is open-ended but should bring context and relevance to the flow. For example,
include information on attribution, targeted company/industry/geography, specific technologies targeted, etc. This helps
readers can quickly gauge the relevance of the attack to their own assets. You may also want to include lessons learned,
IOCs, or any other information that will inform threat prioritization and decision-making.
Action descriptions should provide sufficient detail and not simply repeat the technique name. For example,
“Exploits remote services,” is a poor description because it is a rephrasing of a technique name. A better description
would be, “to move laterally, NotPetya tests for vulnerable SMBv1 condition (Eternal Blue/Eternal Romance exploit)
and deploys an SMB backdoor.””
Refrain from attaching conditions directly to other conditions. Although the specification does not forbid this, it is
duplicative and wastes space. Consider combining the two conditions into one object with a description that describes
both aspects of the state.
The project includes a number of Example Flows. We encourage you to submit flows you create for inclusion in this
public corpus. Additions to the public corpus should follow the best practices described above as well as meet the
following requirements:
1. The flow must be sufficiently complex for submission. The flow must have no fewer than 10 actions and must
make proper use of preconditions and operators.
2. The flow must contain at least one source in the metadata. Source must be credible and technically competent.
Fig. 1: A condition object is not necessary between these actions because the relationship between is very obvious.
SEVEN
DEVELOPERS
If you would like to help create or maintain the code for Attack Flow, including the Attack Flow library (Python) and
the Attack Flow builder (ECMAScript/[Link]), this document explains how to set up an environment to work on this
code and the frequent tasks that you will need to perform.
The Attack Flow Library is written in Python and contains tools for:
• Validating Attack Flow JSON files
• Generating schema documentation
• Visualizing Attack Flows using GraphViz, Mermaid, or ATT&CK matrix
• Running unit tests
7.1.1 Set up
The Attack Flow Library requires Python >=3.8. You will also need to install Python Poetry in order to handle depen-
dencies and setting up a virtualenv. Clone the repository as follows:
Once you have the repository cloned, go into that directory and install the Python dependencies. This step will also
create a virtualenv for the project so that the dependencies do not conflict with other Python packages you may have
installed.
$ cd attack-flow
$ poetry install
Creating virtualenv attack-flow-arUjfNL5-py3.9 in /Users/mhaase/Library/Caches/pypoetry/
˓→virtualenvs
45
Attack Flow, Release v2.0.0
...
Finally, enter the virtualenv. You can check if the installation succeeded by running the af command.
$ poetry shell
py[attack-flow] $ af version
Attack Flow version 2.0.0
Warning: The rest of the Attack Flow Library documentation assumes that you are in a Poetry shell. Make sure
to run poetry shell in each terminal session.
$ af validate corpus/*.json
corpus/[Link]: OK
corpus/conti_2021.json: OK
corpus/dfir_report_zero_to_domain_admin.json: OK
corpus/mac_malware_steals_cryptocurrecy.json: OK
corpus/[Link]: OK
corpus/[Link]: OK
In addition to the Attack Flow Builder, there are a few other options for visualizing Attack Flows. The first approach is
converting to GraphViz format:
The example command converts the Attack Flow [Link] into GraphViz format [Link]. If you have GraphViz
installed, you can use one of its layout tools to create an image:
This command will render [Link] as a PNG graphics file called [Link]. It will look something like this:
46 Chapter 7. Developers
Attack Flow, Release v2.0.0
Another approach for visualizing flows is to convert to Mermaid format. Mermaid is a newer format with fewer features
than GraphViz, but does have the benefit that it can be embedded directly into GitHub-Flavored Markdown.
You can copy/paste the resulting graph into a Markdown file, or if you have Mermaid installed locally, you can render
it as an image.
This command will render [Link] as a PNG graphics file called [Link]. It will look something like this:
You can also visualize an Attack Flow as an overlay on top of an ATT&CK navigator layer. In order to do this, you
must open your layer in Navigator and export it to SVG:
• Open your layer in Navigator.
• Click the camera icon to open the SVG settings screen.
• Adjust the options as you like.
• Click the download icon to save as a .svg file.
Here is an example of an SVG file – this one has several columns cropped out.
With your SVG file prepared, let’s call it base_matrix.svg you can now render any flow on top of it:
This command reads in [Link], renders the corpus/[Link] Attack Flow on top of it, and writes the
resulting image to [Link].
Note: If your flow references subtechniques that are not displayed in the Navigator layer, then the script will automat-
ically try to use the parent technique.
The Attack Flow Library can convert the JSON schema file into human-readable documentation and insert it into
[Link].
This is automatically done at build time when publishing documentation, but you may want to run this locally while
modifying the JSON schema.
48 Chapter 7. Developers
Attack Flow, Release v2.0.0
The technical documentation (i.e. what you’re reading right now) is written in a language called reStructuredText (which
is similar to Markdown but with more features) and compiled using Sphinx to produce documentation in HTML or
PDF format. To build and view the documentation:
$ make docs-server
[sphinx-autobuild] > sphinx-build -b dirhtml -a /Volumes/Code/ctid/attack-flow/docs /
˓→Volumes/Code/ctid/attack-flow/docs/_build
...
Once the server is running, you can open [Link] in your browser to view the documentation. When you
edit and save any .rst document, the docslive server will recompile it and refresh the browser so that you can see the
changes almost immediately. This makes for an efficient editing workflow.
The documentation can also be built into PDF, but it’s a slower and more complicated process. You will need to have
Docker installed and the first time you run this command it will need to download a Docker image for building Sphinx
PDFs.
50 Chapter 7. Developers
Attack Flow, Release v2.0.0
Fig. 4: A Navigator layer with the the Tesa flow rendered as an overlay.
$ make docs-pdf
...
The resulting PDF can be found in docs/_build/latex/[Link]. Alternatively, you can download PDFs
from the GitHub actions.
There is a Makefile target make test that is a shortcut for the command above, as well as make test-ci which runs
the same tests but exports the code coverage data to an XML file.
The Attack Flow Builder is written in JavaScript. To set up a development environment, you first need to install [Link]
and npm. Then, perform the following setup steps:
$ cd src/attack_flow_builder
$ npm install
...
This will download all of the dependencies needed. You also need to initialize the ATT&CK search index (used for
autocompletion of ATT&CK objects):
Finished successfully.
52 Chapter 7. Developers
Attack Flow, Release v2.0.0
If this starts up successfully, then you can access the application at [Link] As you edit source code and
save, the server will automatically rebuild the application and you can refresh the browser to run it again.
7.3 Releases
The Attack Flow project uses a [Link] version scheme. All components of the project (the STIX
extension, Python library, Attack Flow Builder) use the same version number for simplicity. The project uses bumpver
to automate the updating of version number strings throughout the project. For example, to do a new major release:
Note that the flags --minor and --patch can be used as well.
Bumpver automatically updates the version number stored in various places throughout the project (e.g. pyproject.
toml, src/attack_flow_builder/[Link], docs/[Link], etc), commits those changes, and creates a new
tag.
Review the contents of the commit. When you are satisfied:
This command will push the new commit and tag to GitHub.
7.3. Releases 53
Attack Flow, Release v2.0.0
54 Chapter 7. Developers
CHAPTER
EIGHT
TRANSLATION TO OWL/RDF
8.1 Overview
The Resource Description Framework (RDF) and the Web Ontology Language (OWL) are web standards designed to
ease data aggregation across sources and contexts. Attack Flow users may find it convenient to represent their flows in
RDF in order to use query tools such as SPARQL or graph databases such as Blazegraph.
The purpose of this document is to outline an approach for translating flows to RDF through the use of the JSON-LD
standard (JSON for Linking Data).
Note: The Attack Flow project does not provide an official translation of flows into RDF, nor a suggest a particular
vocabulary. Such an “official” translation may become possible after the OASIS Threat Actor Context (TAC) Technical
Committee releases their ontology for representing STIX reports in RDF.
In JSON-LD, a top-level @context property provides document-wide definitions for mapping JSON structures into
RDF triples. Below we provide a sample context for the Tesla flow.
55
Attack Flow, Release v2.0.0
8.3 Objects
Once the @context has been defined, a @type property must be added to all JSON objects in the document. Care
should be taken to map the objects to the appropriate type in the TAC ontology, as STIX JSON and TAC RDF types
have different names for the same objects.
"scope": "incident",
"start_refs": [
"attack-condition--0d8b4b52-5f61-42f1-8b4e-f09fca687233"
],
"external_references": [
{
"@type": "stix:reference",
"source_name": "The Cryptojacking Epidemic",
"description": "RedLock CSI Team. Feb 20 2018.",
"url": "[Link]
}
],
"extensions": {
"extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4": {
"extension_type": "new-sdo"
}
}
}
There are many tools for converting JSON-LD into RDF. In the above examples, we have stayed with the prescripts of
JSON-LD 1.0 for maximum compatibility. Below, we use RDF Toolkit to convert the flow into Turtle (an alternative
RDF syntax):
Listing 4: Snippet from the above conversion of a Flow object into Turtle
syntax
kb:attack-flow--e9ec3a4b-f787-4e81-a3d9-4cfe017ebc2f
a af:attack-flow ;
stix:created "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:created_by_ref "identity--61d33cc7-dc05-4657-8c58-157c456651c0" ;
stix:description "A vulnerable Kubernetes console leads to cryptojacking and␣
˓→exposure of AWS storage credentials." ;
stix:extensions _:blank09 ;
stix:external_references _:blank02 ;
stix:modified "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:name "Tesla Kubernetes Breach" ;
stix:scope "incident" ;
stix:spec_version "2.1" ;
stix:type "attack-flow" ;
af:start_ref kb:attack-condition--0d8b4b52-5f61-42f1-8b4e-f09fca687233 ;
.
_:blank02
a stix:reference ;
stix:description "RedLock CSI Team. Feb 20 2018." ;
stix:source_name "The Cryptojacking Epidemic" ;
stix:url <[Link] ;
_:blank09
stix:extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4 _:blank23 ;
.
_:blank23
stix:extension_type "new-sdo" ;
.
Below, you can find the full conversion of the Tesla flow into JSON-LD, as well as the resulting RDF in Turtle syntax.
"on_true_refs": [
"attack-action--fcd630b0-9958-43ad-977e-d9e236c14a29"
],
"extensions": {
"extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4": {
"extension_type": "new-sdo"
}
}
},
{
"type": "attack-action",
"@type": "af:attack-action",
"spec_version": "2.1",
"id": "attack-action--fcd630b0-9958-43ad-977e-d9e236c14a29",
"created": "2022-08-24T[Link].000Z",
"modified": "2022-08-24T[Link].000Z",
"technique_id": "T1133",
"name": "External Remote Services",
"technique_ref": "attack-pattern--40f5caa0-4cb7-4117-89fc-d421bb493df3",
"description": "The adversary logs into the Kubernetes console.",
"confidence": 90,
"effect_refs": [
"attack-action--430a4928-4eef-498d-a5ba-a2c739908a4c",
"attack-action--35c10b05-2035-4a72-bf40-a82ee548f363"
],
(continues on next page)
"confidence": 90,
"effect_refs": [
"attack-operator--31982617-e0c7-4113-a4b0-830783d96fc2"
],
"extensions": {
"extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4": {
"extension_type": "new-sdo"
}
}
},
{
"type": "attack-action",
"@type": "af:attack-action",
"spec_version": "2.1",
"id": "attack-action--9f649ddc-687c-4f58-8c72-0a361c460d62",
"created": "2022-08-24T[Link].000Z",
"modified": "2022-08-24T[Link].000Z",
"technique_id": "T1583.004",
"name": "Acquire Infrastructure: Server",
"technique_ref": "attack-pattern--60c4b628-4807-4b0b-bbf5-fdac8643c337",
"description": "The adversary runs an \"unlisted\" mining pool server on a␣
˓→non-standard port to evade IP and port blocklists.",
"effect_refs": [
"attack-action--16002983-8519-46d6-9a2b-7a983557e3a9"
],
"confidence": 90,
"extensions": {
"extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4": {
"extension_type": "new-sdo"
}
}
},
{
"type": "infrastructure",
(continues on next page)
"confidence": 90,
"extensions": {
"extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4": {
"extension_type": "new-sdo"
}
}
},
{
"type": "relationship",
"@type": "af:relationship",
"spec_version": "2.1",
"id": "relationship--9ec9afcc-4adf-4324-b32e-3bda5e0dd986",
"created": "2022-08-24T[Link].000Z",
"modified": "2022-08-24T[Link].000Z",
"relationship_type": "related-to",
"source_ref": "attack-action--b5f27faa-f66d-438a-80dc-878ade2644fd",
"target_ref": "infrastructure--cb0106c0-6705-44d7-905f-9a1d855ead11"
},
{
"type": "attack-action",
"@type": "af:attack-action",
"spec_version": "2.1",
"id": "attack-action--35c10b05-2035-4a72-bf40-a82ee548f363",
"created": "2022-08-24T[Link].000Z",
"modified": "2022-08-24T[Link].000Z",
"technique_id": "T1552.001",
"name": "Unsecured Credentials: Credentials In Files",
"technique_ref": "attack-pattern--837f9164-50af-4ac0-8219-379d8a74cefc",
"description": "The adversary could view plaintext AWS keys in the␣
˓→Kubernetes console.",
"confidence": 0,
"effect_refs": [
(continues on next page)
"confidence": 0,
"effect_refs": [
"attack-action--24728445-761a-42d6-afd8-548c82669544"
],
"extensions": {
"extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4": {
"extension_type": "new-sdo"
}
}
},
{
"type": "attack-action",
"@type": "af:attack-action",
"spec_version": "2.1",
"id": "attack-action--24728445-761a-42d6-afd8-548c82669544",
"created": "2022-08-24T[Link].000Z",
"modified": "2022-08-24T[Link].000Z",
"technique_id": "T1530",
"name": "Data from Cloud Storage Object",
"technique_ref": "attack-pattern--3298ce88-1628-43b1-87d9-0b5336b193d7",
"description": "The adversary can access data in private S3 buckets.",
"confidence": 0,
"extensions": {
"extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4": {
"extension_type": "new-sdo"
}
}
}
]
}
kb:attack-action--16002983-8519-46d6-9a2b-7a983557e3a9
a af:attack-action ;
stix:confidence "90"^^xsd:integer ;
stix:created "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:description "The adversary proxies their mining pool through Cloudflare CDN." ;
stix:extensions _:blank05 ;
stix:modified "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:spec_version "2.1" ;
stix:technique_id "T0884" ;
stix:name "Connection Proxy" ;
stix:type "attack-action" ;
af:effect_ref kb:attack-operator--31982617-e0c7-4113-a4b0-830783d96fc2 ;
af:technique_ref kb:attack-pattern--cd25c1b4-935c-4f0e-ba8d-552f28bc4783 ;
.
kb:attack-action--24728445-761a-42d6-afd8-548c82669544
a af:attack-action ;
stix:confidence "0"^^xsd:integer ;
stix:created "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:description "The adversary can access data in private S3 buckets." ;
stix:extensions _:blank11 ;
stix:modified "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:spec_version "2.1" ;
stix:technique_id "T1530" ;
stix:name "Data from Cloud Storage Object" ;
stix:type "attack-action" ;
af:technique_ref kb:attack-pattern--3298ce88-1628-43b1-87d9-0b5336b193d7 ;
.
kb:attack-action--35c10b05-2035-4a72-bf40-a82ee548f363
a af:attack-action ;
stix:confidence "0"^^xsd:integer ;
stix:created "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:description "The adversary could view plaintext AWS keys in the Kubernetes␣
˓→console." ;
stix:extensions _:blank08 ;
stix:modified "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:spec_version "2.1" ;
stix:technique_id "T1552.001" ;
stix:name "Unsecured Credentials: Credentials In Files" ;
stix:type "attack-action" ;
af:effect_ref kb:attack-action--834f885b-718d-47d7-b94d-a7c15f0bcf34 ;
af:technique_ref kb:attack-pattern--837f9164-50af-4ac0-8219-379d8a74cefc ;
.
(continues on next page)
kb:attack-action--430a4928-4eef-498d-a5ba-a2c739908a4c
a af:attack-action ;
stix:confidence "90"^^xsd:integer ;
stix:created "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:description "The adversary deploys a new container on the Kubernetes cluster." ;
stix:extensions _:blank14 ;
stix:modified "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:spec_version "2.1" ;
stix:technique_id "T1610" ;
stix:name "Deploy Container" ;
stix:type "attack-action" ;
af:effect_ref kb:attack-operator--31982617-e0c7-4113-a4b0-830783d96fc2 ;
af:technique_ref kb:attack-pattern--56e0d8b8-3e25-49dd-9050-3aa252f5aa92 ;
.
kb:attack-action--834f885b-718d-47d7-b94d-a7c15f0bcf34
a af:attack-action ;
stix:confidence "0"^^xsd:integer ;
stix:created "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:description "The adversary authenticates to AWS S3 using the discovered␣
˓→credentials." ;
stix:extensions _:blank10 ;
stix:modified "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:spec_version "2.1" ;
stix:technique_id "T1078.004" ;
stix:name "Valid Accounts: Cloud Accounts" ;
stix:type "attack-action" ;
af:effect_ref kb:attack-action--24728445-761a-42d6-afd8-548c82669544 ;
af:technique_ref kb:attack-pattern--f232fa7a-025c-4d43-abc7-318e81a73d65 ;
.
kb:attack-action--9f649ddc-687c-4f58-8c72-0a361c460d62
a af:attack-action ;
stix:confidence "90"^^xsd:integer ;
stix:created "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:description 'The adversary runs an "unlisted" mining pool server on a non-
˓→standard port to evade IP and port blocklists.' ;
stix:extensions _:blank04 ;
stix:modified "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:spec_version "2.1" ;
stix:technique_id "T1583.004" ;
stix:name "Acquire Infrastructure: Server" ;
stix:type "attack-action" ;
af:effect_ref kb:attack-action--16002983-8519-46d6-9a2b-7a983557e3a9 ;
af:technique_ref kb:attack-pattern--60c4b628-4807-4b0b-bbf5-fdac8643c337 ;
.
kb:attack-action--b5f27faa-f66d-438a-80dc-878ade2644fd
a af:attack-action ;
stix:confidence "90"^^xsd:integer ;
stix:created "2022-08-24T[Link].000Z"^^xsd:dateTime ;
(continues on next page)
stix:extensions _:blank07 ;
stix:modified "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:spec_version "2.1" ;
stix:technique_id "T1496" ;
stix:name "Resource Highjacking" ;
stix:type "attack-action" ;
af:technique_ref kb:attack-pattern--cd25c1b4-935c-4f0e-ba8d-552f28bc4783 ;
.
kb:attack-action--fcd630b0-9958-43ad-977e-d9e236c14a29
a af:attack-action ;
stix:confidence "90"^^xsd:integer ;
stix:created "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:description "The adversary logs into the Kubernetes console." ;
stix:extensions _:blank13 ;
stix:modified "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:spec_version "2.1" ;
stix:technique_id "T1133" ;
stix:name "External Remote Services" ;
stix:type "attack-action" ;
af:effect_ref
kb:attack-action--35c10b05-2035-4a72-bf40-a82ee548f363 ,
kb:attack-action--430a4928-4eef-498d-a5ba-a2c739908a4c
;
af:technique_ref kb:attack-pattern--40f5caa0-4cb7-4117-89fc-d421bb493df3 ;
.
kb:attack-condition--0d8b4b52-5f61-42f1-8b4e-f09fca687233
a af:attack-condition ;
stix:created "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:description "Tesla's Kubernetes dashboard is exposed to the public internet␣
˓→with no password required for access." ;
stix:extensions _:blank12 ;
stix:modified "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:on_true_refs "attack-action--fcd630b0-9958-43ad-977e-d9e236c14a29" ;
stix:spec_version "2.1" ;
stix:type "attack-condition" ;
.
kb:attack-flow--e9ec3a4b-f787-4e81-a3d9-4cfe017ebc2f
a af:attack-flow ;
stix:created "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:created_by_ref "identity--61d33cc7-dc05-4657-8c58-157c456651c0" ;
stix:description "A vulnerable Kubernetes console leads to cryptojacking and␣
˓→exposure of AWS storage credentials." ;
stix:extensions _:blank09 ;
stix:external_references _:blank02 ;
stix:modified "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:name "Tesla Kubernetes Breach" ;
stix:scope "incident" ;
(continues on next page)
kb:attack-operator--31982617-e0c7-4113-a4b0-830783d96fc2
a af:attack-operator ;
stix:created "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:extensions _:blank06 ;
stix:modified "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:operator "AND" ;
stix:spec_version "2.1" ;
stix:type "attack-operator" ;
af:effect_ref kb:attack-action--b5f27faa-f66d-438a-80dc-878ade2644fd ;
.
kb:bundle--9cfa7cd7-9fb1-426b-ba9b-afb02fe88c99
a stix:Report ;
stix:type "bundle" ;
.
kb:extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4
a stix:ExtensionDefinition ;
stix:created "2022-08-02T[Link].143Z"^^xsd:dateTime ;
stix:created_by_ref "identity--d673f8cb-c168-42da-8ed4-0cb26725f86c" ;
stix:description "Extends STIX 2.1 with features to create Attack Flows." ;
stix:extension_types "new-sdo" ;
stix:external_references
_:blank01 ,
_:blank03
;
stix:modified "2022-08-02T[Link].143Z"^^xsd:dateTime ;
stix:name "Attack Flow" ;
stix:schema "./[Link]" ;
stix:spec_version "2.1" ;
stix:type "extension-definition" ;
stix:version "2.0.0" ;
.
kb:identity--61d33cc7-dc05-4657-8c58-157c456651c0
a stix:identity ;
stix:contact_information "mhaase@[Link]" ;
stix:created "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:created_by_ref "identity--61d33cc7-dc05-4657-8c58-157c456651c0" ;
stix:identity_class "individual" ;
stix:modified "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:name "Mark Haase" ;
stix:spec_version "2.1" ;
stix:type "identity" ;
.
kb:identity--d673f8cb-c168-42da-8ed4-0cb26725f86c
(continues on next page)
kb:infrastructure--cb0106c0-6705-44d7-905f-9a1d855ead11
a af:infrastructure ;
stix:created "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:infrastructure_types "unknown" ;
stix:modified "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:name "Unlisted Mining Pool" ;
stix:spec_version "2.1" ;
stix:type "infrastructure" ;
.
kb:relationship--9ec9afcc-4adf-4324-b32e-3bda5e0dd986
a af:relationship ;
stix:created "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:modified "2022-08-24T[Link].000Z"^^xsd:dateTime ;
stix:relationship_type "related-to" ;
stix:spec_version "2.1" ;
stix:target_ref "infrastructure--cb0106c0-6705-44d7-905f-9a1d855ead11" ;
stix:type "relationship" ;
af:source_ref
kb:attack-action--9f649ddc-687c-4f58-8c72-0a361c460d62 ,
kb:attack-action--b5f27faa-f66d-438a-80dc-878ade2644fd
;
.
_:blank01
a stix:reference ;
stix:description "Documentation for Attack Flow" ;
stix:source_name "Documentation" ;
stix:url <[Link] ;
.
_:blank02
a stix:reference ;
stix:description "RedLock CSI Team. Feb 20 2018." ;
stix:source_name "The Cryptojacking Epidemic" ;
stix:url <[Link] ;
.
_:blank03
a stix:reference ;
stix:description "Source code repository for Attack Flow" ;
stix:source_name "GitHub" ;
(continues on next page)
_:blank04
stix:extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4 _:blank16 ;
.
_:blank05
stix:extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4 _:blank17 ;
.
_:blank06
stix:extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4 _:blank18 ;
.
_:blank07
stix:extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4 _:blank19 ;
.
_:blank08
stix:extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4 _:blank20 ;
.
_:blank09
stix:extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4 _:blank23 ;
.
_:blank10
stix:extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4 _:blank21 ;
.
_:blank11
stix:extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4 _:blank22 ;
.
_:blank12
stix:extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4 _:blank24 ;
.
_:blank13
stix:extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4 _:blank25 ;
.
_:blank14
stix:extension-definition--fb9c968a-745b-4ade-9b25-c324172197f4 _:blank15 ;
.
_:blank15
stix:extension_type "new-sdo" ;
.
_:blank16
(continues on next page)
_:blank17
stix:extension_type "new-sdo" ;
.
_:blank18
stix:extension_type "new-sdo" ;
.
_:blank19
stix:extension_type "new-sdo" ;
.
_:blank20
stix:extension_type "new-sdo" ;
.
_:blank21
stix:extension_type "new-sdo" ;
.
_:blank22
stix:extension_type "new-sdo" ;
.
_:blank23
stix:extension_type "new-sdo" ;
.
_:blank24
stix:extension_type "new-sdo" ;
.
_:blank25
stix:extension_type "new-sdo" ;
.
NINE
CHANGELOG
2.0.0 – October 27th, 2022 This major update to Attack Flow is based on community feedback from Attack Flow 1
and extensive collaboration with our research partners. The major improvements include:
• The new specification is based on STIX 2.1 and addresses known limitations and feedback on the Attack
Flow 1 specification.
• Completely overhauled Attack Flow Builder tool: more powerful and more user-friendly.
• Greatly expanded the documentation (you’re reading it right now!) to provide a better ramp up for learning
Attack Flow as well as more depth when you’re ready to become an Attack Flow expert.
• Added a dozen new attack flows to the public corpus. These flows are useful for learning Attack Flow, for
evaluating future changes to the Attack Flow specification, and data mining.
This release is not backwards-compatible with 1.0.0.
1.0.0 – March 2nd, 2022 The initial release of Attack Flow contains a specification for a machine-readable specifica-
tion for describing sequences (or more generally “graphs”) of adversary behaviors. The release also contains a
web application for creating attack flows visually as well as Python library code for validating flows.
73
Creating an Attack Flow aids in incident documentation by allowing users to visually and contextually map out TTP sequences during or following an incident. This aids retrospective analysis by providing clear timelines of adversary behavior, identifying exploited vulnerabilities, and documenting the tools and techniques used. Such comprehensive documentation can be leveraged for future threat detection efforts and enhances institutional memory, facilitating a rapid resumption of normal operations .
The specification of conditions in Attack Flows improves human understanding by clarifying different potential scenarios that might lead to similar outcomes, thereby enhancing the granularity with which flows are interpreted. For instance, indicating unknown initial access vectors or combining multiple vectors with an OR operator ensures clarity over potential starting points, thus refining flow relevance to specific circumstances and facilitating more precise engagements with the data .
Utilizing Attack Flow contributes to improving defenders' incident mitigation and recovery strategies by systematically cataloguing attack sequences, which helps in understanding typical adversary tactics, techniques, and procedures (TTPs). This enables defenders to recognize patterns, prepare for potential incidents, and enhance their detection and response mechanisms by creating better-informed responses geared towards common attack scenarios .
Attack Flow enhances threat hunting capabilities by allowing threat hunters to model known TTP sequences, which can then be searched for within their own infrastructure. This structured approach can pinpoint specific actions and tools used by adversaries, guiding the hunt and enabling hunters to focus efforts on breaking TTP chains, ultimately leading to more efficient and accurate threat detection .
Example attack flows offer cybersecurity professionals, particularly novices, a practical and insightful resource to learn about high-profile breaches and common attack vectors. They provide real-world scenarios that demonstrate how adversaries execute attacks, illuminate typical defensive measures, and impart strategic insights into threat mitigation, thus enhancing industry-specific knowledge and readiness against cyber threats .
Attack Flow integrates with existing standards like STIX by extending STIX 2.1 with features that allow the creation of structured and machine-readable attack flows. This integration facilitates a seamless combination of attack flow processes with other threat intelligence data, enhancing interoperability, data standardization, and sharing across different cybersecurity platforms, which bolsters coordinated defensive frameworks and amplifies situational awareness .
The Attack Flow Builder fosters collaboration between cybersecurity teams by providing a shared platform where both red and blue teams can visualize and discuss attack strategies and defense mechanisms. Using a drag-and-drop interface, teams can create, view, and modify flows that detail adversary actions and sequences, enabling effective communication of threats and response strategies, thus supporting both coordinated threat hunting and emulation efforts .
Attaching conditions directly to other conditions is discouraged as it can be redundant and space-consuming. It may not add value to the flow since the relationship between conditions can often be expressed more succinctly within a single condition object. This approach streamlines the flow, reducing complexity while maintaining clarity, thereby enhancing the overall quality and efficiency of the flow .
A contributed Attack Flow must be sufficiently complex, feature at least 10 actions, make effective use of preconditions and operators, and include credible metadata sources. These criteria ensure the flows provide substantial and reliable data for analysis, enabling better simulation of real-world attacks and promoting a detailed, nuanced understanding of adversarial behavior that can pragmatically inform defensive strategies .
Using the online version of the Attack Flow Builder could raise privacy concerns as it stores documents in local memory and disk, with potential visibility to third parties due to internet access. To mitigate these concerns, users can opt for the downloadable or Docker versions for a private experience, ensuring data confidentiality by avoiding exposure to the internet and minimizing the risk of unauthorized access .