AttackGraph
From a Model it is possible to create an maltoolbox.attackgraph.AttackGraph
.
The point of the AttackGraph is to give an abstraction that shows each step an Attacker can take, analyze paths for an attacker and run simulations.
While a Model consists of assets and associations, an AttackGraph instead contains maltoolbox.attackgraph.AttackGraphNode
.
The AttackGraphNode can be an attack or defense step (defined in the MAL language for each type of asset).
AttackGraphNode
An AttackGraphNode is an attack step or a defense step, decided by its type. If the node has type and or or, it is considered an attack step.
Nodes can have these properties:
- Viable
Determine if a node can be traversed under any circumstances or
if the model structure or active defense steps makes it unviable.
- Necessary
Determine if a node is necessary for the attacker or if the
model structure means it is not needed(it behaves as if it were already compromised) to compromise children attack steps.
- Compromised
An attacker compromises an attack step by reaching it (performing the attack step)
- Traversable
Determines whether an attack step can be compromised in the next step.
- Reachable
Determines if a specific or any attacker can reach an attack step any time in the future from its currently reached attack steps.
Generating an AttackGraph
If you already have an instance model file and .mal/.mar, the easiest way to create an AttackGraph
is to use the wrapper maltoolbox.wrappers.create_attack_graph()
which combines all steps from model file to the AttackGraph:
from maltoolbox.wrappers import create_attack_graph
lang_file = "org.mal-lang.coreLang-1.0.0.mar"
model_file = "example-model.yml"
attack_graph = create_attack_graph(lang_file, model_file)
To generate an AttackGraph from existing lang graph and model, use the init of
maltoolbox.attackgraph.attackgraph.AttackGraph()
:
# Create the attack graph from existing LanguageGraph and Model
attack_graph = AttackGraph(lang_graph, model)
From AttackGraph file maltoolbox.attackgraph.attackgraph.AttackGraph.load_from_file()
:
from maltoolbox.attackgraph import AttackGraph
# Load the attack graph
example_graph_path = "attackgraph.yml"
loaded_attack_graph = AttackGraph.load_from_file(example_graph_path)
Analyzers
maltoolbox.attackgraph.analyzers
contains analyzers for the attackgraph used to calculate viability and necessity.