fiord Advent Calendar 2025 11 日目の内容となります。
また、Summiting the Pyramid v3.0.0 とは 1: Summiting Levels の続きの内容となります。
注意 : 現在時点での私個人の理解に基づく記事であり、正しいことを保証しません。
目次
観測データの組み合わせ(Combining Observables)
単一のイベント O の Summiting Level を R(O) と記述します。
さて、イベント A と B があるとき、組み合わせると堅牢性はどうなるでしょうか?
この時、このようなルールが適用されます(個人的に要らんだろという記述は抜いてます)
- R(A AND B) = min(R(A), R(B))
A と B 両方のイベントがある際に悪性であるとして検知するロジックでは、A もしくは B に対して回避を成功させれば、検知されなくなります。よって簡単な方で評価します。 - R(A OR B) = max(R(A), R(B))
A もしくは B のどちらかがある際に検知するロジックでは、A と B 両方の回避が必要であり、難しい方で評価します。 - R(NOT A) = R(A)
A が観測されなかった場合に検知する、というロジックは A に依存します。よって堅牢さとしては A と同等です。
ただし、必ずしも上記に合致する訳では無く、レベルの昇格が行われる場合もあるという...
例えば、A OR B でとあるテクニックの実装を網羅することに成功した場合、R(A)、R(B) ともに Summiting Level が 4 であるにも関わらず、R(A OR B) が 5 になります。
連鎖アナリティクス(Chaining Analytics)
さて、複数のイベントを「連鎖」させることが有効な話をしていましたが、その結合度合いにも種類があります。
直接的な相関関係
「アクション A → アクション B」のような際にアクション B はアクション A が成功していないと成功しない場合、直接的な相関があると言えるでしょう。
実際に検知するにあたっても A AND B で良いと思います。
緩い相関関係
攻撃者が複数のコマンドからアクションを実行しようとしているとき、その中のコマンドのいくつかは他のコマンドを利用することも出来るとします。
また、それぞれのコマンドは普段から良性として実行されることが想定される場合、単一のコマンドでは不十分であり、複数のコマンドを元に良性/悪性の判断が必要です。
この際に、悪性と判断するためのコマンドの集合を Analytics 1/Analytics 2/Analytics 3 とします(一部が代替可能なため、集合として取り扱う必要があります)
この Analytics 1 は Analytics 2 で代用可能かもしれません。ただし、全く別のコマンドの集合であり、アナリティクスとしては別物かも知れませんね。
このような場合に、「検出された Analytics の種類の数をカウントし、その数が x 以上になったら悪性であると判断する」と閾値を設けることが一実装方法として有効です。
この緩い相関関係では、アクションの順序を考慮しません。そのメリットして、実装が複雑になりにくいのが上げられそうです。
Robust Detection(堅牢な検知)の構成要素
堅牢であるべきですが、どのようなものが堅牢なのでしょう?
機械学習の分類問題における混合行列にもありますが、TP/FP/FN/TN という概念があります。
- TP: アラートすべきものをアラートした
- FP: アラートすべきでないものをアラートした
- FN: アラートすべきものをアラートしなかった
- TN: アラートすべきでないものをアラートしなかった
さて、機械学習では評価指標として「適合率(Precision)」「再現率(Recall)」というものがあります。
- 適合率: 正予測の際の正答率。$\frac{TP}{TP+FP}$
- 再現率: 正に対する正答率。$\frac{TP}{TP+FN}$
これを
正確な検知(Accurate Detection)
Robust Detection の前に Accurate Detection について触れる必要があります。上記の適合率と再現率を組み合わせて評価します。
正確な検知においては、FP 及び FN を減らすべきです。
- FP が減れば、検知されたそれは TP である可能性が高く、特定の悪性のアクティビティを検知するのに向いています。例えば特定のツールに対してハッシュ値で検知ルールを作成した場合、FP は発生しませんが、FN は発生すると認識する必要があります。
- FN が減れば、悪性のイベントを検知することが出来る可能性が増大します。例えば「サービスの作成」を検知する場合、多数の FP が発生しますが、攻撃途中にサービスを作成する攻撃は全て検知出来ます。攻撃者が攻撃方法を変えても、そこを変えない限り検知されるので、Summiting Level も高くなることが期待されます。
検知が発生した際に、確認するアナリストからすれば、FP が少ないことが望ましく、TP の数は(ほとんど)変わらないのに FP が大量に増えることに対して負担に感じるでしょう。
一方で、検知ルールを作成する側からすれば、漏れ(FN)が無いことが重要です。
この際に、バランスを取ることが大切ですが、後述の 文脈 というものを組み込むことで類似した悪質/良質のアクティビティを判別することに役立ちます。
このバランスが取れた上で「攻撃者にとって長期的に回避が困難な検知」が Robust Detection となります。
文脈から意図を決定する(Context to Determine Intent)
攻撃者があたかも端末利用者の良性の活動に見せかけて攻撃をする手法があります(Ambiguous Techniques)。
これに対して、下記の 3 つの文脈から行動の意図を汲み取ることが出来ると分類しています。これは複数のイベントを組み合わせた結果として得られるものであると自分は認識しています。
周辺レベルの文脈(Peripheral-Level Context)
自分の環境内に侵入される前から外部脅威インテリジェンスなどを用いて調査を行い、ネットワーク外部から自分の環境を見た情報から攻撃者が行うであろう攻撃の意図を汲み取ります。
ポートスキャン、Shodan の情報を見たり、とあるグループが自分の会社の業界に対して APT が行っているといった情報が有用です。
連鎖レベルの文脈(Chain-Level Context)
侵入された疑いがある際、特定の攻撃手法をその前後、あるいは同時に発生する別の手法と紐づけ、そこから攻撃者の意図を汲み取ります。
例示されていた手法として、いくつかの侵害事例を調査した結果として、「情報漏洩の前段階として、収集データを圧縮する」という事例が多く見られたそうです。
ただし、「ZIP ファイルを作っている」「ファイルをアップロードしている」だけでは良性の可能性がある、といった際に有用かもしれません。
テクニックレベルの文脈(Technique-Level Context)
検知の際に「When」「Where」「Who」「What」を明確にし、これを元に分類することで攻撃者の意図を汲み取ります。
- When: アクティビティの頻度(Brute-Forceなど)やその時間帯(深夜はおかしいよね、など)
- Where: ネットワークあるいはファイルにおけるアクセス(普段見られないファイルアクセスやポートへのアクセス)
- Who: 誰が操作しているか、どの権限を使用しているか、どのようにリソースへアクセスしようとしているか
- What: コマンドライン、レジストリ操作やAPIの利用など
文脈の活用例
上の図は、アクティビティに対して良性/悪性を判断するためのフローチャートの例です。
判断が十分に出来ない場合において、左から右に進んでいきます。
- 攻撃段階
a. 侵害前: Recon など、まだ自分の環境に侵入する前の段階。Peripheral-Level Context が有用です。
b. 侵害後: 攻撃者が中に入っているかもしれないのであれば、先に進みましょう。 - ツールの使用法
a. 攻撃者が持ち込んだツールで、Mimikatz など、明確に悪意のあるものであれば、それは攻撃者によるものでしょう。
b. 侵害前からあるような PowerShell であれば、判断は難しいです。 - 操作について
a. ツールが普段の使い方と明らかに違うなら、攻撃者によるものと判断できそうです。例えば、PowerShell で実行されたコマンドから判断できる場合があると思います。
b. 普通の使い方なら、まだ判断が難しそうですね。 - ユーザーアクセス
a. システムアカウントを直接操作していたら怪しいかもしれません。
b. 正当なユーザーによるものでも、認証情報が盗まれた結果、悪用されているのかもしれません。 - アクションの結果: ここで Chain-Level Context/Technique-Level Context を用いて、「結果何が起きたか」が悪性/良性の判断を行います。判断基準や方法は前段の「ユーザーアクセス」により変わります(原文では、ここに書いてあることがちぐはぐなので、具体的な例は出さないようにします)
まとめ
- 堅牢な検知のためには、FP/FN のバランスを取る必要がある。
- 文脈を活用することで一見良性に見えるような悪性のアクティビティを見つけることが出来る。複数のデータから攻撃者の意図を汲み取り、良性/悪性を見極め、その中から攻撃の本質を検知ルールとすることでより堅牢な検知ルールとなるのではないだろうか。
