一覧OP-14-3 · 検知設計・テスト・評価

検知ルールの例外設定と回帰テスト

report.exeの固定試料で、保守時間中の端末を丸ごと除外する条件と、主体・ハッシュまで合わせる条件を比較します。技術分類のラベルと、実際に試験した範囲も分けて記録します。

説明

誤検知を減らす例外条件が広すぎると、同じ端末で起きた別の不審な活動も通知されなくなります。変更後のルールを、検知したい例と通知したくない例の両方へ適用して確認します。

report.exeの固定試料で、保守時間中の端末を丸ごと除外する条件と、主体・ハッシュまで合わせる条件を比較します。技術分類のラベルと、実際に試験した範囲も分けて記録します。

1正常例と対象例を確認する

expectedはこの試料で求める通知結果です。maintenanceは保守時間帯を表します。

from oplab import * db=connect(14) show(db, 'SELECT正常例と対象例を確認する * FROM regression ORDER BY id')

r2は承認されたopsのh8、r3は同じ保守時間中のaliceのh7です。両方を除外すると見逃しが生じます。

2実行名だけの条件を試す

元の条件ではreport.exeを全て通知します。

show(db, 'SELECT実行名だけの条件を試す id,expected,image="report.exe" AS detected FROM regression ORDER BY id')

r1、r2、r3が通知されます。r2が誤検知で、例外の追加が必要な候補です。

3保守時間だけの除外を試す

保守時間中の全活動を除外した場合を確認します。

show(db, 'SELECT保守時間だけの除外を試す id,expected,(image="report.exe" AND maintenance=0) AS detected FROM regression ORDER BY id')

r2の通知は減りますが、r3も見逃します。誤検知が減った件数だけでは変更を評価できません。

4承認された主体と実体まで条件を狭める

保守時間、ops、h8の組合せだけを例外とします。

show(db, 'SELECT承認された主体と実体まで条件を狭める id,expected,(image="report.exe" AND NOT (maintenance=1 AND actor="ops" AND hash="h8")) AS detected FROM regression ORDER BY id')

r1とr3を検知し、r2とr4は通知しません。この固定試料では期待結果に一致します。

5期待結果との不一致を検索する

判定結果を副問い合わせにし、差異のある行だけを出します。

show(db, 'SELECT期待結果との不一致を検索する * FROM (SELECT id,expected,(image="report.exe" AND NOT (maintenance=1 AND actor="ops" AND hash="h8")) AS detected FROM regression) WHERE expected<>detected')

不一致は0件です。ただし未知の正常処理や別名の実行など、試料外の事例まで正しく判定できる保証ではありません。

6技術分類と試験範囲を照合する

別の検知資産台帳を読み、分類IDだけではカバー範囲が分からない例を確認します。

show(db, 'SELECT技術分類と試験範囲を照合する * FROM tested')

この台帳のT1059.001はWindowsのプロセス名だけを試験した記録です。PowerShellの全実行方式や全プラットフォームを検知済みとは報告できません。

まとめ

この台帳のT1059.001はWindowsのプロセス名だけを試験した記録です。PowerShellの全実行方式や全プラットフォームを検知済みとは報告できません。

表示された証拠IDと検索条件を残すと、調査結果を元の記録までたどれます。

操作履歴と解説を振り返れます。

Python 3.15 / SQLite・固定の調査記録

1
from oplab import * db=connect(14) show(db, 'SELECT * FROM regression ORDER BY id')
id | host | actor | image | hash | maintenance | expected
r1 | ws7 | alice | report.exe | h7 | 0 | 1
r2 | ws8 | ops | report.exe | h8 | 1 | 0
r3 | ws8 | alice | report.exe | h7 | 1 | 1
r4 | ws9 | ops | viewer.exe | h9 | 0 | 0
2
show(db, 'SELECT id,expected,image="report.exe" AS detected FROM regression ORDER BY id')
id | expected | detected
r1 | 1 | 1
r2 | 0 | 1
r3 | 1 | 1
r4 | 0 | 0
3
show(db, 'SELECT id,expected,(image="report.exe" AND maintenance=0) AS detected FROM regression ORDER BY id')
id | expected | detected
r1 | 1 | 1
r2 | 0 | 0
r3 | 1 | 0
r4 | 0 | 0
4
show(db, 'SELECT id,expected,(image="report.exe" AND NOT (maintenance=1 AND actor="ops" AND hash="h8")) AS detected FROM regression ORDER BY id')
id | expected | detected
r1 | 1 | 1
r2 | 0 | 0
r3 | 1 | 1
r4 | 0 | 0
5
show(db, 'SELECT * FROM (SELECT id,expected,(image="report.exe" AND NOT (maintenance=1 AND actor="ops" AND hash="h8")) AS detected FROM regression) WHERE expected<>detected')
id | expected | detected
6
show(db, 'SELECT * FROM tested')
technique | source | platform | fixture
T1059.001 | process | Windows | powershell-name-only

演習完了