検知ルールの例外設定と回帰テスト
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・固定の調査記録
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
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
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
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
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
show(db, 'SELECT * FROM tested')technique | source | platform | fixture T1059.001 | process | Windows | powershell-name-only
演習完了