jiacwng/meerkat

GitHub: jiacwng/meerkat

Meerkat 是一款利用机器学习对 SOC 多检测器告警进行标准化聚合和优先级排序的辅助分拣工具,帮助分析师在有限预算下高效审查可疑活动。

Stars: 1 | Forks: 0

Pixel-art meerkat security analyst reviewing an alert

Meerkat

针对多检测器 SOC 数据的机器学习辅助告警分类。

## 概述 安全运营中心(SOC)接收到的告警数量可能远超分析师的审查能力。一旦检测器触发告警,接下来的问题就是决定优先审查哪些活动。 Meerkat 从 Wazuh、Suricata 和 AMiner 读取告警,标准化它们的不同格式,将重复的活动进行分组,并对生成的案例进行排名。它会生成一个有边界的每日审查队列,同时保留原始证据和 MITRE ATT&CK 上下文以供调查。 Meerkat 不再对孤立的告警进行排名,而是对**家族**(families)进行排名。例如,同一条 Wazuh 规则在一天内在同一台主机上触发了 7,068 次,它会被归为一个需要调查的家族,而不是 7,068 个独立的决定。 ``` detector alerts | v normalized alerts -> sessions -> families -> ranked daily queue ``` - 一个**会话**(session)包含在同一台主机上触发的同一个检测器规则,直到该数据流静默超过十分钟。 - 一个**家族**(family)将同一天内具有相同主机、检测器和规则的会话合并在一起。 - **预算**(budget)是指分析师每天可以审查的家族数量。 Meerkat 对家族进行排名,因为队列仍然需要一个顺序,但排名只是实现目的的机制,而非最终目标。离线评估关注的是:在审查预算内,包含了多少个不同的已标记攻击窗口,而不是因为队列反复暴露同一个高频阶段的告警而给予奖励。 这模拟了 Tier 1 分析师面临的实际问题:在有限的时间内,该队列暴露了多少个不同的可疑活动? 在内置的示例中,Meerkat 将 36,358 条告警缩减为 1,487 个会话和 326 个家族。在预算为 10 的情况下,它为场景中的四天分别展示了排名前 10 的家族。 ## 工作原理 Meerkat 使用了两层小型的机器学习模型: 1. 随机森林(Random Forest)根据每个会话的流量、持续时间、检测器、标准化严重程度、规则稀有度、ATT&CK 存在情况以及资产上下文对其进行评分。 2. 逻辑回归重排序器(logistic re-ranker)结合子会话的评分和家族级别的上下文,对最终队列进行排序。 一个单独的校准器会将家族分数转换为证据百分比以供显示。该百分比不会控制队列顺序,也不应被视为分析师的最终裁决。 原始的主机名、IP 地址、规则 ID 和告警名称并不是模型的特征。这可以防止模型简单地死记硬背某一家训练公司的数据。 模型外部仍会使用资产清单(inventory)来识别受影响的机器,将其与观察传感器区分开来,并附加资产角色。 该设计将特定于检测器的解析与排名分离开来。一旦告警共享了标准化的 schema,模型就会使用可通用的度量而不是原始的公司标识符,并且每个评估折叠(fold)都会在未见过的环境中学习其词汇表。这减少了对单一数据集或公司的依赖,但并不能使该工具完全与检测器无关:每个新的告警源仍然需要一个标准化适配器。 该项目的开发参考了关于 SOC 告警优先级排序、分组和上下文分析的相关研究,包括 [TEQ](https://arxiv.org/abs/2302.06648)、[AIP](https://arxiv.org/abs/2607.16963)、[AlertBERT](https://arxiv.org/abs/2602.06534)、[RAPID](https://research.ibm.com/publications/rapid-real-time-alert-investigation-with-context-aware-prioritization-for-efficient-threat-discovery)、[AI2](https://people.csail.mit.edu/kalyan/AI2/) 和 [DeepCASE](https://doi.org/10.1109/SP46214.2022.9833671)。 ## 快速开始 Meerkat 需要 Python 3.11 或更高版本,以及用于演示告警的 Git LFS。 ``` git clone https://github.com/jiacwng/meerkat.git cd meerkat git lfs install git lfs pull python -m pip install -e . meerkat demo ``` 该演示使用了在七个 AIT-ADS 环境中训练出的模型,并将 `russellmitchell` 作为未见的第八个环境进行排名。 ``` run russellmitchell-... | company russellmitchell | budget 10 | 326 families handle date host detector finding alerts F001 2022-01-21 inet-firewall AMiner Unusual DNS query frequencies 6 F002 2022-01-21 inet-firewall AMiner New service_start combination 1 F003 2022-01-21 inet-firewall AMiner New service_stop combination 1 ``` 队列会作为一次运行(run)被保存,因此调查命令不会再次对数据进行评分: ``` meerkat queue meerkat inspect F003 meerkat inspect F003 S1 meerkat review F003 escalate --note "Unexpected service change" meerkat export navigator ``` ## 分析师工作流 | 命令 | 用途 | |---|---| | `meerkat triage --company C --input DIR --inventory FILE` | 标准化并对某家公司的告警批次进行评分 | | `meerkat queue` | 重新打开最新的队列或筛选所有已评分的家族 | | `meerkat inspect F003 [S1]` | 检查某个家族、单个会话或其原始告警 | | `meerkat review F003 escalate --note "..."` | 记录升级、良性发现或误报 | | `meerkat export navigator` | 将观察到的技术导出为 ATT&CK Navigator 层 | | `meerkat train --holdout C` | 训练并保存可复用的模型包 | | `meerkat demo` | 运行内置的留出公司(held-out-company)示例 | 一个完整的从批处理到审查的工作流如下所示: ``` meerkat triage --company russellmitchell --input data/raw --inventory data/raw/inventory/russellmitchell.json --budget 10 meerkat queue meerkat inspect F003 meerkat inspect F003 S1 --raw --alerts 1 meerkat review F003 escalate --note "Unexpected service change" ``` 第一条命令对新批次进行标准化和排名,然后保存该运行。其余命令会重新打开该运行,检查一个选定的家族,并记录分析师的决定,而无需再次运行模型。 实用的队列筛选器包括: ``` meerkat queue --all meerkat queue --host intranet-server meerkat queue --detector wazuh meerkat queue --review-state escalate ``` 检查以摘要开始,而不是直接倾倒原始告警。证据会显示在一致的板块中,例如发现、身份、进程、网络、HTTP、DNS、TLS 和来源。空板块会被隐藏。 ``` meerkat inspect F218 --distinct http_status meerkat inspect F218 --where http_status=403 meerkat inspect F218 --exclude http_status=404 --alerts 20 meerkat inspect F218 S1 --raw --alerts 1 ``` 审查记录会被追加到运行目录内的 `reviews.jsonl` 文件中。最近的记录是当前决定,而早期的记录仍作为小型的审计追踪保留。 ## 评估 该评估使用了全部八个 AIT-ADS 环境。对于每一折(fold),其中七个环境用于训练模型,第八个环境保持未见过状态。训练词汇表、模型特征、重排序器和校准器都是在没有留出环境的情况下拟合的。 主要指标是**固定每日预算下的攻击窗口覆盖率**。它将选定的队列视为一个集合:十个几乎相同的家族所提供的覆盖率,无法与代表不同攻击活动的十个家族相提并论。 攻击窗口仅在离线评估期间可知,绝不会影响运行时的分组、特征、评分或队列选择。 AIT-ADS 使用带标签的时间窗口来描述其脚本化攻击步骤。仅当每日队列中包含来自该窗口的官方事件标记告警时,Meerkat 才将该窗口计为**严格触及**(strictly reached)。 ``` time --------------------------------------------------------------> attack window [=========================] family F023 |-----------------------------------| sessions [ S1 ] [ S2 ] [ S3 ] labelled alert * ``` 家族将相关活动集中在一起供分析师做出一个决定。它的会话在活动沉寂时拆分该活动。家族可能会超出攻击窗口的范围,但严格的覆盖率要求其带标签的告警(`*`)落在该窗口内;仅时间重叠是不计入的。 | 每日审查的家族数 | 5 | 10 | 25 | |---|---:|---:|---:| | 最大子会话评分 | 44 | 53 | 58 | | **学习到的家族重排序器** | **52** | **58** | **58** | 这些数值是八个留出环境的总和,是对三个随机种子和 200 棵树的平均值。 该数据集包含 79 个攻击窗口。其中只有 60 个包含至少一条官方事件标记的告警,因此在当前的监督机制下,严格覆盖率无法超过 60。 在每天 10 个家族的预算下,重排序器触及了这 60 个可通过标签触及的窗口中的 58 个。 校准将汇总的 Brier 分数从 0.0301 降至 0.0202,并改善了全部 24 种留出环境和种子的组合。它改善了显示百分比与观察到的结果的匹配程度;它并不会改变排名。 完整的实验方法(包括被拒绝的特征组合和阴性结果)均记录在 **[Meerkat: Ranking Alert Families for Capacity-Limited Triage](docs/report/meerkat.pdf)** 中。 ## 数据集 Meerkat 使用了 [AIT Alert Data Set](https://zenodo.org/records/8263181),该数据集由 Wazuh、Suricata 和 AMiner 监控的八个模拟公司环境构建而成。随附的 [AIT-ADS repository](https://github.com/ait-aecid/alert-data-set) 提供了检测器配置、资产配置和单条告警的标签。 完整的实验处理了八个环境中约 **3.1 GB 的源数据**:2,655,821 条原始告警记录,去除检测器重复项后的 2,349,098 条告警,1,817,250 条事件标记记录以及 79 个脚本化攻击窗口。 该演示仅需要内置的 `russellmitchell` 原始文件和预训练模型。要复现完整的跨环境评估,则需要全部八个场景以及事件标签文件。 ``` data/raw/_wazuh.json data/raw/_aminer.json data/raw/alerts_csv/_alerts.txt data/raw/inventory/.json ``` 资产清单可以通过官方的 `server_configs` 目录生成: ``` python -m pip install PyYAML python -m core.inventory ../alert-data-set/server_configs data/raw/inventory ``` ## 项目结构 ``` core/ normalize.py detector parsing and the shared alert schema inventory.py entity and asset-role resolution sessions.py session and family construction features.py leakage-safe session features classifier.py Random Forest, family re-ranker and calibration scenario_eval.py leave-one-environment-out evaluation and model bundles attack_mapping.py MITRE ATT&CK enrichment triage_policy.py bounded daily queue meerkat/ cli.py training, triage, inspection and review commands models/ pretrained demo bundle docs/ report and project assets ``` ## 未来工作 - 在 [Microsoft GUIDE](https://www.kaggle.com/datasets/Microsoft/microsoft-security-incident-prediction/data) 上评估排名流水线,作为第二个基准测试。其真实世界的事件证据和分析师分类标签可以测试 Meerkat 能否在 AIT-ADS 之外进行泛化,而无需替代当前的多检测器评估。 - 在相同的已保存运行之上添加浏览器界面。排名和评估代码将保持独立于展示层。 ## 范围与限制 Meerkat 是一个实验性的批量分类工具。它不能替代 SIEM 或案件管理平台。 - 结果来自于一个模拟的测试床,该测试床的环境共享同一个攻击脚本。它们不能代表生产环境中的性能表现。 - 目前的分类是基于批处理的,而不是流式处理。 - 审查状态是本地且单用户的。没有身份验证、所有权分配或多分析师锁定机制。 - 当前的适配器涵盖 Wazuh、Suricata 和 AMiner。新的检测器仍然需要一个解析器,将其字段和严重性等级映射到 Meerkat 的 schema 中。 - ATT&CK 映射提供了调查上下文。它们并不能证明若干次观察结果属于同一个攻击活动。 ## 许可证 Meerkat 基于 MIT 许可证发布。AIT-ADS 由奥地利理工学院(Austrian Institute of Technology)根据 CC BY 4.0 单独分发。
标签:Apex, Cloudflare, MITRE ATT&CK, Suricata, Wazuh, 告警分诊, 安全运营, 扫描框架, 文档结构分析, 机器学习, 现代安全运营, 逆向工具