mitreattack-python入門

に公開

記事の目的

mitreattack-python ライブラリを使って、 MITRE ATT&CK のデータを Python で取り扱う方法を説明します。

mitreattack-pythonを使うと何がうれしいのか

攻撃者視点での攻撃についてのナレッジベースである MITRE ATT&CK の情報を Python プログラムで取り扱うことができるようになります。

例えば、MITRE ATT&CK 上で定義されている攻撃テクニックIDを指定し、攻撃名、攻撃の説明、緩和策を抽出することが Python プログラムを通して実現できます。

MITRE ATT&CK の情報を可視化することのできる MITRE ATT&CK Navigator 用のレイヤーファイルを生成することもできるため、 Pytnon プログラムを使って、自由に可視化することができます。

SIEMやセキュリティ製品で発生するアラートから MITRE ATT&CK の攻撃テクニックIDを抽出し、自動的に MITRE ATT&CK Navigator上で可視化するといったことも可能になります。

前提条件

本記事の前提条件は以下の通りです。

  • macOS (Windows/Linuxも対応化)
  • Pythonについての基礎知識(文法、pipなど)
  • Python3開発環境
  • Git
  • MITRE ATT&CK Navigatorが利用できる

MITRE ATT&CK データの入手

MITRE ATT&CK データは、 STIX(構造化脅威情報表現/ Structured Threat Information eXpresssion )という表現に従ったデータとして公開されています。

STIXは JSON 上に記載するデータの表現方法(決まりや使い方)を決めている物であり、データ自体は人間の読むことのできるテキストデータとなります。サイバー脅威インテリジェンス( CTI )を標準化された構造的な形式で記述・共有するために使用されます。

STIX: https://oasis-open.github.io/cti-documentation/stix/intro.html

SITXの主な開発元は MITRE ですが、特定の脅威フレームワーク(例: MITRE ATT&CK )に限定されるものではありません。

MITRE ATT&CK 自体は攻撃者の戦術と技術を体系化したナレッジベースであり、MITERはこのMITRE ATT&CKナレッジベースを STIX 2.x 形式で配布しています。

CTI: https://github.com/mitre/cti (2.0)
attack-stix-data: https://github.com/mitre-attack/attack-stix-data (2.1)

STIXの主な用途

用途/対象 STIXの役割
脅威インジケータ(IOCs)共有 IPアドレス、ドメイン、ハッシュなどを構造化して表現
マルウェア・攻撃キャンペーンの記述 関連するアクター、手法、標的などをリンク可能に表現
MITRE ATT&CK との連携 MITRE ATT&CK の TTP(戦術・技術) をSTIXオブジェクトとして参照可能
TAXII(共有プロトコル) との組み合わせ STIX形式の脅威情報を自動でやりとりできるようにする
SIEM/SOAR製品との連携 自動で脅威情報を取り込み・活用できる

STIXデータは個別にダウンロードするか、 git を使ってリポジトリごとクローンして入手します。

gitを使ってクローンする例(2.0)
# 実行したディレクトリ上の cti というディレクトリに格納される
$ git clone https://github.com/mitre/cti.git
gitを使ってクローンする例(2.1)
# 実行したディレクトリ上の attack-stix-data というディレクトリに格納される
$ git clone https://github.com/mitre-attack/attack-stix-data.git

STIX データ にはターゲットに合わせた分類があります。

分類

ターゲット分類 リポジトリ上のパス 説明
enterprise enterprise-attack/enterprise-attack.json 企業向けの攻撃情報がまとまっている一般的なIT向けのデータ
ICS ics-attack/ics-attack.json Industrial Control Systems (ICS: 産業制御システム) 向けのデータ
Mobile mobile-attack/mobile-attack.json モバイル向けのデータ

ターゲットに合わせたデータを選択する必要があります。
一般的なIT向けである企業のサーバやPCは enterprise に該当するため、 enterprise-attack.json を使います。

なお、産業制御システムとは、発電所、変電所、上下水道、向上の制御装置など、いわゆる OT (Operational Technology) 環境で使われるシステムのことであり、 PLC (プログラマブルロジックコントローラ) や HMI (ヒューマンマシンインターフェース) などを含みます。

ICSの用語説明

用語 説明
プログラマブルロジックコントローラ( PLC ) 産業用の小型コンピュータ。主に工場やインフラで機械やプロセスの自動制御を担う。
ヒューマンマシンインターフェース( HMI ) PLCなどの制御システムと人間をつなぐ操作画面。いわゆる監視・操作パネル

mitreattack-python とは

mitreattack-python とは

mitreattack-python は、 MITRE ATT&CK を Python から扱えるようにするための Python ライブラリです。

https://github.com/mitre-attack/mitreattack-python

mitreattack-python ライブラリを使用すると MITRE ATT&CK の STIX データをパースし、攻撃技術、戦術、グループ、ソフトウェア、関係性などをプログラム的に扱うことができます。

mitreattack-pythonn の主な用途

使用目的 具体的な例
MITRE ATT&CK のデータを取得する TTP(攻撃技術、戦術)、グループ、ソフトウェアの一覧を取得する
関連性の解析 特定のグループが使う技術を抽出、ある技術に関連する緩和策を取得する
可視化や自動分析の前処理 MITRE ATT&CK Navigator 用のレイヤーJSONの自動生成を行う
STIXデータの解析 STIX 2.x形式の MITRE ATT&CK データを読み込んで解析する

mitreattack-pythonには追加モジュール(機能/仕組み)も用意されています。

https://github.com/mitre-attack/mitreattack-python?tab=readme-ov-file#additional-modules

追加モジュール

追加モジュール 説明
navlayers MITRE ATT&CK Navigator のレイヤーを操作するためのユーティリティ集です。レイヤーのインポート、エクスポート、操作が可能です。レイヤーはファイルシステムまたは Python 辞書から読み込み、結合・編集し、JSON、ExcelまたはSVG画像にエクスポートできます。
attackToExcel MITRE ATT&CK の STIXデータをExcelスプレッドシートに変換するためのユーティリティ集です。また、データ分析に使用するデータセットを表す Pandas DataFrame へのアクセスも提供します。
collections MITRE ATT&CKコレクションおよびコレクションインデックスを操作するためのユーティリティセット。コレクションおよびコレクションインデックス内のデータの変換と要約機能、および生のstixバンドル入力からコレクションを生成する機能を提供します。
diffStix MITRE ATT&CKコンテンツを表すSTIX2バンドルの2つのバージョン間の変更点をレポートする、マークダウン、HTML、JSON、またはMITRE ATT&CK Navigatorレイヤーを作成します。

mitreattack-python の導入方法

mitreattack-pythonは、pythonのライブラリであり pip を使って Python 開発環境に導入できます。

$ pip install mitreattack-python

mitreattack-python の呼び出し方

mitreattack-python は Python プログラム上で import して使います。

ライブラリ内の使いたいクラスがある場合は、モジュールを指定してクラスをインポートします。

https://github.com/mitre-attack/mitreattack-python/blob/d054371179533de55daaf74b92777c807dca8586/mitreattack/stix20/MitreAttackData.py#L13-L28

自身のプログラム中で、 mitreattackstix20 にある MitreAttackData.py(モジュール) を指定して、 MitreAttackData クラスを使いたい場合は、次のように記述します。

from mitreattack.stix20.MitreAttackData import MitreAttackData

mitreattack-pythonの情報源

readthedocs の API Reference
https://mitreattack-python.readthedocs.io/en/latest/mitre_attack_data/mitre_attack_data.html

リファレンス内のexamples
https://mitreattack-python.readthedocs.io/en/latest/mitre_attack_data/examples.html

開発の流れ

mitreattack-python を使った開発の流れを説明します。

  1. STIX データを MitreAttackDataクラスに渡しインスタンス化する。
  2. MitreAttackDataのインスタンスに対してメソッドを呼び出し、ATT&CK オブジェクトを取り出す。
  3. ATT&CK オブジェクトから、欲しい情報を取り出す。
  4. 取り出した情報を使って、 MITRE ATT&CK Navigator 用のレイヤーファイルを生成する。
  5. 生成した レイヤーファイルを MITRE ATT&CK Navigator に読み込ませ可視化する。

STIXデータは、SITXオブジェクトというまとまり/単位で構成されています。
それぞれのオブジェクトごとに意味や記載について決まっています。

STIX2.1 におけるオブジェクトの例

オブジェクト 意味 内容例 用途
indicator 脅威を検知するためのヒントや証拠 IPアドレス、ドメイン名、ハッシュ値、正規表現パターン など システム上で脅威の兆候を識別するために利用される example.com への通信があればマルウェアの感染を疑う、など
malware 悪意のあるソフトウェアやコード マルウェア名、機能、挙動、バージョン など マルウェアの識別・分類・分析情報を記録 EmotetやTrickBotのようなマルウェアファミリーの記述
threat-actor 攻撃を行う人物・手段・組織 国家主体、ハクティビスト、犯罪グループなどの情報 誰が攻撃しているのか、どのような動機があるのかを特定 APT28、Lazarus Grup など
attack-pattern アクターが使用する攻撃手法やテクニック MITRE ATT&CK の技術、フィッシング、DLLインジェクションなど 脅威の手法を定型化・再利用しやすくする Spear Phishing Attachment (T1193)
campaign 特定期間に実行された攻撃活動のまとまり 目的、対象、実施時期、使用法など 一連の攻撃イベントをグループとして管理する 「2022年春の金融機関攻撃キャンペーン」
course-of-action (対処法) 脅威に対する防御・検知・対応策 シグネチャの更新、設定変更、パッチ適用など 脅威への対応計画やアクションガイドとして使用 マルウェア通信先ドメインのブロック
intrusion-set (侵入セット) 複数の攻撃キャンペーンに共通して使われる手口やリソースの集合 インフラ、マルウェア、技術、標的などの共通要素 アクターの長期的な活動特性を捉える このアクターが複数のキャンペーンで同じマルウェアとC2を使っている
relationship (リレーションシップ) STIXオブジェクト間の関係を表現する AはBを使用する。CはDを標的にする など 脅威情報の相互関係を構造化・可視化する threat-actor "APT28" -> uses -> malware "X-Agent"

STIXオブジェクトに対応した mitreattack-python のクラスのことを ATT&CK オブジェクトと呼びます。

つまり、mitreattack-python では、STIX オブジェクトを直接取り扱うのでは無く、 対応した Python プログラム内の ATT&CK オブジェクト( ATT&CK 用のクラスをインスタンス化したもの) を取り扱うことで、 MITRE ATT&CK の情報にアクセスします。

mitreattack-python を使って開発を行う

STIXデータは、以下のリポジトリから enterprise-attack.json を取得済みであり作成するプログラムファイルと同じディレクトリに配置しているものとします。
本記事作成時点の enterprise-attack.json は、バージョン 17.1 のデータです。

attack-stix-data: https://github.com/mitre-attack/attack-stix-data (2.1)

MD5 (enterprise-attack.json) = b49adbcaf71290d7816ce098a94dbf82

MITRE ATT&CK のテクニックIDを指定してテクニックに関する情報を抽出する

mitreattack-python の examples に get_object_by_attack_id.py ファイルが公開されています。

https://mitreattack-python.readthedocs.io/en/latest/mitre_attack_data/examples.html#getting-an-att-ck-object

get_object_by_attack_id.py は、STIXデータから、Attack ID T1134に関する情報を引っ張ってくるプログラムです。
この実装を参考にしながら、MITRE ATT&CK のテクニックIDを指定してそのテクニックに関する情報を抽出していきます。

https://github.com/mitre-attack/mitreattack-python/blob/master/examples/get_object_by_attack_id.py

プログラムファイルの名前を、 custom_get_object_by_attack_id.py とします。

https://github.com/sesame/introduction_mitreattack_python/blob/main/examples/custom_get_object_by_attack_id.py

解説

stix_file = Path(__file__).parent / "enterprise-attack.json"
mitre_attack_data = MitreAttackData(str(stix_file))

MitreAttackData クラスに STIX ファイルを渡す部分です。 MitreAttackData クラスは、 Path オブジェクトを受け取れないため、文字列に変換して渡しています。

attack_pattern = mitre_attack_data.get_object_by_attack_id("T1134", "attack-pattern")

mitre_attack_data から、get_object_by_attack_id メソッドを通して MITRE ATT&CK のテクニックID T1134 に対応する ATT&CK オブジェクト( STIX の attack-pattern に対応する、 Python の AttackPatternオブジェクト)を抜き出します。

mitre_attack_data.print_stix_object(attack_pattern, pretty=True)

ATT&CK オブジェクトを直接 print で表示すると、一行で横に長く表示されてしまうので、人間にとって見やすい形で表示する、 print_stix_object メソッドを使って表示します。 print_stix_object メソッドは、 mitre_attack_data のインスタンスメソッドとして実装されています。

pretty=True を引数に指定することで見やすい形式で表示されます。以下、プログラムの実行結果です。表示結果は長くなるため表示の一部を省略しています。

実行結果
{
    "type": "attack-pattern",
    "spec_version": "2.1",
    "id": "attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48",
    "name": "Access Token Manipulation",
    "description": "Adversaries (省略), that can be used to modify access tokens.",
    "kill_chain_phases": [
        {
            "kill_chain_name": "mitre-attack",
            "phase_name": "defense-evasion"
        },
        {
            "kill_chain_name": "mitre-attack",
            "phase_name": "privilege-escalation"
        }
    ],
    "external_references": [
        {
            "source_name": "mitre-attack",
            "url": "https://attack.mitre.org/techniques/T1134",
            "external_id": "T1134"
        },
        {
            "source_name": "BlackHat Atkinson Winchester Token Manipulation",
            "description": "Atkinson, J., Winchester, R. (2017, December 7). A Process is No One: Hunting for Token Manipulation. Retrieved December 21, 2017.",
            "url": "https://www.blackhat.com/docs/eu-17/materials/eu-17-Atkinson-A-Process-Is-No-One-Hunting-For-Token-Manipulation.pdf"
        }
    ],
    "x_mitre_is_subtechnique": false,
    "x_mitre_platforms": [
        "Windows"
    ],
    "x_mitre_version": "2.1"
}

取得できた情報は、 MITRE ATT&CKの以下のURLに相当する情報となっています。

https://attack.mitre.org/techniques/T1134/

T1134
MITRE ATT&CK上の T1134

AttackPattern オブジェクトの中身について代表的な物を説明します。

プロパティ 説明
type オブジェクトの種類を表します。値として入っている attack-pattern は、攻撃手法(テクニック)のオブジェクトであることを意味します。
id STIX の内部 において使われるユニークなIDです。 MITER ATT&CK における識別番号である ATTACK IDとは別物です。
name テクニックの名前を表します。 MITRE ATT&CK におけるテクニック名あるいはサブテクニック名に対応します。
description MITRE ATT&CK におけるテクニックの説明に対応します。
external_references 外部参照(MITRE ATT&CK上のATTACK IDやURL)のリストです。ここでは、 mitre-attack と BlackHat の2つの外部参照が記載されています
source_name 外部参照ごとの情報源を表します。
external_id 外部参照情報源におけるIDを表します。 mitre-attack の場合、Tが前置される、テクニックに分類されるATTACK IDを表します。
url 外部参照情報の、Web上の詳細情報を表します。
kill_chain_phases キルチェーン上の位置付け/戦術を表します。
kill_chain_name どの情報源のキルチェーンのものなのかを表します。 mitre-attack の場合は MITRE ATT&CK のキルチェーンであることを意味します。
phase_name キルチェーンのフェイズ名を表します。 MITRE ATT&CK の場合は、戦術名を意味します。
x_mitre_is_subtechnique MITER ATT&CK におけるサブテクニックに該当するかを表します。
x_mitre_platforms この攻撃が対象とするプラットフォームを表します。
x_mitre_version SITXのバージョンを表します。

AttackPatternの内容は、 MITRE ATT&CK の用語や名称と一致していないため、 MITRE ATT&CK の情報に合わせるには適切な読み替えを行い再構成する必要があります。

注意が必要なものとして以下の3つが挙げられます。

  • (STIX) ID
  • MITRE ATT&CK のテクニックID
  • MITRE ATT&CK の戦術

STIX における attack-patternはそれぞれ一意のIDが振られています。
AttackPattern の id として取得できるものが、 STIX の id となります。
MITRE ATT&CK 内で割り振られる テクニックID とは別物です。

STIX における攻撃、前述のデータでは attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48 というIDが振られています。この攻撃には、 MITRE ATT&CK においては、T1134 というIDが振られています。他の同様のフレームワークでは別のIDが振られているかもしれません。

SITXでは、外部の情報は enternal_references で管理されており、MITRE ATT&CK の情報であっても同様です。
つまり、STIX 上の attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48 というIDの攻撃がMITRE ATT&CK のどのテクニックIDと紐付いているかは、 external_references をチェックする必要があると言うことです。

external_references
{
    "external_references": [
        {
            "source_name": "mitre-attack",
            "url": "https://attack.mitre.org/techniques/T1134",
            "external_id": "T1134"
        },
        {
            "source_name": "BlackHat Atkinson Winchester Token Manipulation",
            "description": "Atkinson, J., Winchester, R. (2017, December 7). A Process is No One: Hunting for Token Manipulation. Retrieved December 21, 2017.",
            "url": "https://www.blackhat.com/docs/eu-17/materials/eu-17-Atkinson-A-Process-Is-No-One-Hunting-For-Token-Manipulation.pdf"
        }
    ]
}

MITRE ATT&CK におけるID(テクニックID)を知るには、 external_references に格納されている複数の外部参照情報の中で、 source_namemitre-attack のものを探し、その外部参照情報の external_id を入手する必要があることを意味します。

この攻撃が、 MITRE ATT&CK のどの戦術に紐付いているかについては、別の考慮が必要になります。

MITRE ATT&CK のテクニックにはテクニックIDが付いています。このテクニックIDの攻撃がどの戦術(tactic)で使われるかについては、1対1とは限らず、複数の戦術に紐付いているケースがあります。

kill_chain_phases
{
    "kill_chain_phases": [
        {
            "kill_chain_name": "mitre-attack",
            "phase_name": "defense-evasion"
        },
        {
            "kill_chain_name": "mitre-attack",
            "phase_name": "privilege-escalation"
        }
    ]
}

T1134 の場合は、 MITRE ATT&CK の defense-evasionprivilege-escalation に紐付いています。
kill_chain_phases の中に入っているデータから、 kill_chain_namemitre-attack であるものをピックアップし、 MITRE ATT&CK のどの戦術に紐付いているかを、 phase_name から抽出することになります。

external_references や、 kill_chain_phases には順番を意識するリスト(配列)が割あたっています。
external_references に関しては、0番目に mitreattack に関するものを置くという慣習はありますが、絶対的な物では無く、これらのリストの順番については明確な定義がありません。
一部のツールやスクリプトは external_reference[0].external_id をATT&CK IDとして使用することを前提にしていることがありますが前提が崩れる場合があるので、位置依存にすべきではありません。

AttackPatternオブジェクトに含まれる MITRE ATT&CK テクニック関連情報を抽出する

AttackPatternオブジェクトのプロパティは、プロパティ名を指定することで値を取得することができます。
プロパティ名の指定とは、AttackPatternオブジェクトに対して以下のような形でアクセスすることを意味します。

print(attack_pattern.id)
print(attack_pattern["id"])  # この呼び出し方も可能
結果
attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48
attack-pattern--dcaa092b-7de9-4a21-977f-7fcb77e89c48

AttackPatternオブジェクトから、 MITRE ATT&CK のテクニック関連情報として以下の情報を抽出するプログラムを考えます。

MITRE ATT&CK のテクニック関連情報

  • テクニック名
  • 説明
  • テクニックが属する MITRE ATT&CK 戦術名
  • MITRE ATT&CK 上のテクニックID

ファイル名は extract_technique.py とします。

https://github.com/sesame/introduction_mitreattack_python/blob/main/examples/extract_technique.py

実行結果
name='Access Token Manipulation'
tactics=['defense-evasion', 'privilege-escalation']
attack_id='T1134'
description='Adversaries (省略)'

mitreattack-python を使って MITRE ATT&CK のSTIXデータを操作し欲しい情報を抽出できるようになりました。
次のステップとして、 MITRE ATT&CK Navigator用のレイヤーファイルを生成し可視化を行っていきます。

MITRE ATT&CK Navigator用のレイヤーファイルを生成し可視化を行う

mitreattack-python では、 navlayers モジュールを使うと MITRE ATT&CK Navigator用のレイヤーファイルを生成することができます。

ここでは以下の順番で説明を行います。

  • MITRE ATT&CK Navigator のレイヤーファイルについて説明を行います。
  • mitreattack-python を使って MITRE ATT&CK Navigator 用のレイヤーファイル生成方法を説明します。
  • 生成した レイヤーファイルを MITRE ATT&CK Navigator に読み込ませ可視化します。

MITRE ATT&CK Navigator とは

MITRE ATT&CK Navigator は、 MITRE ATT&CK フレームワークを視覚的に探索・分析・共有するためのWebベースのツールです。

簡単にいうと、 MITRE ATT&CK の戦術(Tactics)と技術(Techniques)を表にしたマトリクスビューで、脅威分析・ギャップ分析・対策状況を「色・ラベル・スコア」などで可視化できるツールです。

MITRE ATT&CK Navigator には主に以下の機能があります。

機能 説明
マトリクス形式での表示 MITRE ATT&CK の戦術と技術を表で表示
色分け 各技術に色を付けて、可視化。リスクが高い技術は赤、対策済みは緑など
カスタムレイヤーの作成 自組織の脅威モデルや検知力カバレッジをレイヤーとして作成・共有
フィルタや検索 技術やサブ技術をキーワードやIDで検索
データのインポート・エクスポート JSON形式のレイヤーファイルを保存・共有可能
MITRE ATT&CK の複数バージョンに対応 Enterprise、Mobile、ICSなどを切り替えて使用可能

Navigator
MITER ATT&CK Navigator画面

map
レイヤー表示画面

画面上部には、戦術(Reconnaissance: 偵察、Initial Access: 初期アクセスなど)が記述され、実際に行われた攻撃はその下にテクニック(Active Scanning、Gather Victim Host Information など)として記載されています。

テクニックには、複数のサブテクニックが紐付いているケースもあります。テクニックを展開すると、サブテクニックを見ることができます。
上記の画像でいうと、戦術ExecutionにテクニックCommand and Scripting Interpreterがあり、その下にサブテクニックであるApple ScriptやAutoHotKey & AutoITが紐付いていることがわかります。

面中央にはサブテクニックPowershellが表示されていますが、背景が水色になっています。

Powershellの背景を水色にするというレイヤーファイルを用意し、そのレイヤーファイルをMITRE ATT&CK Navigatorで読み込むことによって実現しています。

MITRE ATT&CK Navigator はコンテナ上に用意することも可能です。詳しくは、過去の記事を参照してください。
https://zenn.dev/sesamum/articles/1f06dcdf8b3757

MITRE ATT&CK Navigator のレイヤーファイルとは

MITRE ATT&CK Navigator の「レイヤーファイル(layer file)」とは、ATT&CK Navigator 上で攻撃手法(テクニック)に色やスコア、コメントなどを付けて視覚的に分析・整理できる設定ファイルです。形式は JSON です。

一言でいうと「どの攻撃手法が注目点か」「どれを対策したか」などを、カラフルに可視化して共有できるファイルのことです。

レイヤーファイルは以下の用途で使用します。

レイヤーファイルの用途

用途 内容
分析 攻撃キャンペーンやマルウェアが使うテクニックをハイライト
防御 自社の対策状況を色分けして表示
報告 上司やチームにわかりやすく可視化して共有
自動化 ツールで作った結果をそのままで可視かできる

レイヤーのフォーマット仕様は、 MITRE ATT&CK Navigatorのリポジトリで管理されています。
https://github.com/mitre-attack/attack-navigator/blob/master/layers/spec/v4.5/layerformat.md

現時点(2025年8月)で最新のレイヤーフォーマットのバージョンは4.5です。

レイヤーフォーマット仕様の中で、バージョンオブジェクト、テクニックオブジェクトのようにオブジェクトという用語が使われています。

ここで言うオブジェクトとはJSONにおけるオブジェクト(JavaScript由来)のことを示しています。
JSONにおけるオブジェクトとは、Python言語で言うと辞書データだと思えば良く、キー/バリューの集合のことを指すと理解してください。

JavaScriptのオブジェクトは、辞書的にもクラスのようにも使える万能的な構造であり、限定的に使えば他言語の辞書(連想配列)のように使えるため、「オブジェクト」という包括的な呼び方になっているとの認識でもここでは良いと思います。

MITRE ATT&CK Navigator のレイヤーに関してオブジェクトというときは辞書のことを意味し、 Python の文脈でオブジェクトというときは、クラスのインスタンスのことを指すことが多いです。

(参考)Pythonにおけるオブジェクト

用語 意味
オブジェクト 値を表すすべての実体。型情報を持ち、メソッドを使える
クラス オブジェクトの設計図。オブジェクトはクラスから作られる
インスタンス クラスから生成された具体的なオブジェクト

(参考)JavaScriptとの違い

観点 Python JavaScript
オブジェクトの意味 クラスから生成された実体(+全データ) プロパティの集合 (辞書的+振る舞い)
型とクラス 厳密に分かれていて、すべてがクラスのインスタンス オブジェクトリテラルも型情報が薄い
辞書とオブジェクト 明確に区別(dict型 vs object型) 基本的に同じ構文 {} で両方とも書く

レイヤーフォーマットのポイント

レイヤーフォーマット4.5のExampleの内容をベースにして説明します。
https://github.com/mitre-attack/attack-navigator/blob/master/layers/spec/v4.5/layerformat.md#example

バージョンオブジェクト

バージョンオブジェクトでは以下の3つのバージョンを指定します。

  • attack (optional)
  • navigator (required)
  • layer (required)

attackバージョンは、MITRE ATT&CK のマトリクス(例: Enterprise, ICS など)のバージョンを指定します。enterprise-attack.json などと一緒に使われるバージョンです。
必須ではなく省略できます。

navigatorバージョンは、 MITRE ATT&CK Navigatorのバージョンを指定します。MITRE ATT&CK Navigator画面の左下にバージョン情報が表示されているので、そのバージョンを指定します。

Navigator
Navigator バージョン v5.1.1

layerバージョンは、レイヤーフォーマットのバージョンを指定します。最新である4.5のレイヤーフォーマット仕様を採用しているので、4.5を指定します。

これらを踏まえるとバージョンオブジェクトは次のように記述できます。

バージョンオブジェクト
{
    "versions": {
        "attack": "17.1",
        "navigator": "5.1.1",
        "layer": "4.5"
    }
}

正確に言うと、 versions キーが指す値のことをバージョンオブジェクトと呼びます。

バージョンオブジェクト(正確には)
{
    "attack": "17.1",
    "navigator": "5.1.1",
    "layer": "4.5"
}

テクニックオブジェクト

テクニックオブジェクトは techiniques プロパティの値に割り当てたリストの、各要素として指定します。

テクニックオブジェクト
{
    "techniques": [
        {
            "techniqueID": "T1110",
            "score": 0,
            "color": "#fd8d3c",
            "comment": "This is a comment for technique T1110",
            "showSubtechniques": true
        },
        {
            "techniqueID": "T1110.001",
            "score": 100,
            "comment": "This is a comment for T1110.001 - the first subtechnique of technique T1110.001",
            "links": [
                {
                    "label": "Navigator GitHub",
                    "url": "https://github.com/mitre-attack/attack-navigator"
                }
            ]
        }
    ]
}

テクニックオブジェクトのプロパティは以下で説明されています。

https://github.com/mitre-attack/attack-navigator/blob/master/layers/spec/v4.5/layerformat.md#technique-object-properties

techniqueIDは必須であり、Tから始まるMITRE ATT&CKのテクニックIDを指定します。サブテクニックの場合は、 T####.### の形式で指定します。

tacticの指定は任意ですが、テクニックの戦術を指定します。 lateral-movement のような値を指定することになります。各テクニックオブジェクトの戦術はtacticとして1つしか指定することができません。

あるテクニックが複数の戦術に紐付いている場合、テクニックと戦術の1対1の組み合わせを必要な数だけ用意する必要があることを意味します。

T1134 が複数の戦術に紐付いている例
technique_name='Access Token Manipulation'
technique_tactics=['defense-evasion', 'privilege-escalation']
technique_attack_id='T1134'
technique_description='Adversaries may modify (略)'

レイヤーファイルでは、テクニックを次のように指定します。

複数の戦術を割り当てる際のテクニックオブジェクトの例(T1134)
{
    "techniques": [
        {
            "techniqueID": "T1134",
            "score": 0,
            "color": "#fd8d3c",
            "tactic": "defence-evasion",
            "comment": "This is a comment for technique T1134",
            "showSubtechniques": true
        },
        {
            "techniqueID": "T1134",
            "score": 0,
            "color": "#fd8d3c",
            "tactic": "privilege-escalation",
            "comment": "This is a comment for technique T1134",
            "showSubtechniques": true
        }
    ]
}

テクニックの背景は color に色の値を割り当てることで実現します。
あるいは、 score 値に基づいて計算した結果を基に自動的に色を割り当てる gradient という方法も利用できます。
gradient よりも color により直接した色の方が優先して適用されることに注意してください。

スコアには任意の数値を入れて良く、数値自体の意味は MITRE ATT&CK Navigator および MITRE ATT&CK 上では決められていません。
好きな値を好きな目的でスコア値として割り当てることができます。
スコア値は、MITRE ATT&CK Navigatroの機能としては、 gradient による色分けのみに使われます。

この考え方は、 MITRE ATT&CK Navigator の汎用性につながります。スコアをどのような意味で採用するかによって MITRE ATT&CK Navigatorによって表現できることが変わります。

グラディエントオブジェクト

グラディエントオブジェクト
{
    "gradient": {
        "colors": [
            "#ff6666",
            "#ffe766",
            "#8ec843"
        ],
        "minValue": 0,
        "maxValue": 100
    }
}

gradient オブジェクトでは、スコア値に応じた色のグラデーションを設定できます。

  • colors: グラデーションに使う色のリスト。最低2つ以上必要です。
  • minValue, maxValue: スコアのスケーリング範囲を指定します。

スコアは minValue から maxValue の間で正規化され、その値に応じて colors の間を補間して色が決まります。
たとえば、スコアが minValue と maxValue の中間値なら、中央の色(またはその中間色)になります。

スコアがminValue, maxValueの範囲外(たとえば -100 や 200)の場合は、次のように扱われます:

  • minValue 未満 → 最初の色
  • maxValue より大 → 最後の色

この minValue / maxValue は「スコアの取り得る範囲」ではなく、「色の割り当て範囲(クリップ値)」として使われる点に注意してください。

クリップとは、簡単に言うとある値が「はみ出した」ときに、無理やり端っこに「とどめておく」ことを「クリップ(clipping)」といいます。

たとえば:

  • 「0〜100の範囲で扱いたい」と決めたのに、
  • 入ってきた値が 120 や -10 だったら、
  • そのまま使うとおかしくなるので…

120 は 100 に変える、-10 は 0 に変える

これが「クリップ(clip)」です。はみ出しを防ぐ処理です。

LegendItemオブジェクト

MITRE ATT&CK Navigator の画面には、表示される色と説明用のラベルについての凡例を載せることができます。
LegendItemオブジェクトはこの凡例を用意するオブジェクトです。

LegendItemオブジェクト
{
    "legendItems": [
        {
            "label": "Legend Item Label",
            "color": "#FF00FF"
        }
    ]
}

グラディエントオブジェクトと関係なく、好きな色とラベルを割り振ることができますが凡例として意味をなさなくなるためなるべく合わせた方が良いと思われます。

フォーマットに従ったJSONファイルをレイヤーファイルとして自身で1から作成してもかまいませんが、 mitreattack-python に用意されている、 navlayers という便利な追加モジュールを利用することもできます。

navlayers
https://github.com/mitre-attack/mitreattack-python/tree/master/mitreattack/navlayers

プログラムによるMITRE ATT&CK Navigator レイヤーファイルの作成は、以下のサイトを参考にします。
https://github.com/mitre-attack/mitreattack-python/blob/master/mitreattack/navlayers/core/README.md#creating-layers-programmatically

レイヤーファイル作成のポイントは以下の通りです。

ポイント

  • mitreattack.navlayers モジュールをインポートすること。
  • Layerクラスのインスタンスを作る方法には複数あること。
  • レイヤーフォーマットに従った属性名を指定すること。

Layerクラスのインスタンスには、たとえば次のような方法があります。

  • 辞書データを作って、その辞書データをLayerクラスのインスタンスに読み込ませて作る方法
  • Layerクラスのインスタンスを生成して、インスタンスにプロパティとして設定値(オブジェクト)を直接組み込んでいく方法

辞書データを使う方法は、辞書データにすべきかどうか辞書データがどのようにLayerクラスのインスタンスに反映されていくかがわかりづらいため、今回は それぞれ Python の専用オブジェクト(インスタンス) を生成し、Layerクラスのインスタンスにプロパティとしてオブジェクトを組み込んでいく方法について説明します。

create_layer.py を作成します。

https://github.com/sesame/introduction_mitreattack_python/blob/main/examples/create_layer.py

プログラムを実行すると、 output.json ファイルが作成されます。
output.json は、 navlayers の仕様として UTF-16le のエンコーディングで出力されます。

以下の出力は、読みやすさのためUTF-8に変換した後、 jq による整形を行った結果を記載しています。

output.json
{
  "name": "example",
  "domain": "enterprise-attack",
  "description": "THis is a demonstration layer",
  "versions": {
    "layer": "4.5",
    "attack": "17.1",
    "navigator": "5.1.1"
  },
  "filters": {
    "platforms": [
      "Windows"
    ]
  },
  "layout": {
    "layout": "side",
    "showID": true,
    "showName": true,
    "showAggregateScores": true,
    "countUnscored": true,
    "aggregateFunction": "sum",
    "expandSubtechniques": "annotated"
  },
  "hideDisabled": true,
  "techniques": [
    {
      "techniqueID": "T1134",
      "tactic": "defense-evasion",
      "comment": "Demo",
      "score": 1,
      "color": "#AABBCC",
      "name": "Access Token Manipulation"
    },
    {
      "techniqueID": "T1134",
      "tactic": "privilege-escalation",
      "score": -80,
      "name": "Access Token Manipulation"
    }
  ],
  "gradient": {
    "colors": [
      "#DAF7A6",
      "#FFC300",
      "#FF5733",
      "#C70039",
      "#900C3F",
      "#581845"
    ],
    "minValue": -100,
    "maxValue": 100
  },
  "legendItems": [
    {
      "label": "a",
      "color": "#DAF7A6"
    },
    {
      "label": "B",
      "color": "581845"
    }
  ],
  "metadata": [
    {
      "name": "example metadata",
      "value": "This is an example"
    }
  ]
}

プログラムを実行して作成した output.json ファイルをMITRE ATT&CK Navigatorにて、Open Existing Layerから読み込むと次のような画面が表示されます。


結果画面

まとめ

mitreattack-pythonを使って、MITRE ATT&CKのデータを操作しMITRE ATT&CK Navigator用のレイヤーファイルを作成しました。
実際に、MITRE ATT&CK Navigatorに読み込ませることにより、希望通りの可視化を行うことができました。

参考サイト

mitreattack-python: https://github.com/mitre-attack/mitreattack-python

関連記事

MITRE ATT&CK関連記事一覧
https://zenn.dev/sesamum/articles/fba079cadba113

Discussion