KAIROS复现记录

KAIROS:使用全系统起源的实用入侵检测和调查

Github:https://github.com/ProvenanceAnalytics/kairos
KAIROS: Practical Intrusion Detection and Investigation using Whole-system Provenance

1. 复现实验

(1) 环境准备

机器配置:
在这里插入图片描述

psycopg2                       2.9.9
tqdm                           4.66.4
scikit-learn                   1.5.0
networkx                       3.3
xxhash                         3.4.1
graphviz                       0.20.3
pytz                           2024.1

torch                          2.3.0+cu121
torchvision                    0.18.0+cu121
torch_geometric                2.5.3
pyg_lib                        0.4.0+pt23cu121
torch_scatter                  2.1.2+pt23cu121
torch_sparse                   0.6.18+pt23cu121
torch_cluster                  1.6.3+pt23cu121
torch_spline_conv              1.2.2+pt23cu121

数据集
CADETS-E3
THEIA-E3
ClearScope-E3
CADETS-E5
THEIA-E5
ClearScope-E5
OpTC

CADETS-E3数据示例
在这里插入图片描述

(2) 数据库

service postgresql status # 查看服务状态
service postgresql start # 启动服务
su - postgres
psql

在这里插入图片描述

postgres=# \l   # 查看数据库
postgres=# create database tc_cadet_dataset_db;   # 创建数据库
CREATE DATABASE
postgres=# \connect tc_cadet_dataset_db;    # 切换到新创建的数据库
psql (16.3 (Ubuntu 16.3-1.pgdg22.04+1), server 15.7 (Ubuntu 15.7-1.pgdg22.04+1))
You are now connected to database "tc_cadet_dataset_db" as user "postgres".
tc_cadet_dataset_db=# create table event_table    # 创建事件表
tc_cadet_dataset_db-# (
tc_cadet_dataset_db(# src_node      varchar,
tc_cadet_dataset_db(# src_index_id  varchar,
tc_cadet_dataset_db(# operation     varchar,
tc_cadet_dataset_db(# dst_node      varchar,
tc_cadet_dataset_db(# dst_index_id  varchar,
tc_cadet_dataset_db(# timestamp_rec bigint,
tc_cadet_dataset_db(# _id           serial
tc_cadet_dataset_db(# );
CREATE TABLE
tc_cadet_dataset_db=# \d event_table   # 查看表结构
                                     Table "public.event_table"
    Column     |       Type        | Collation | Nullable |                 Default                  
---------------+-------------------+-----------+----------+------------------------------------------
 src_node      | character varying |           |          | 
 src_index_id  | character varying |           |          | 
 operation     | character varying |           |          | 
 dst_node      | character varying |           |          | 
 dst_index_id  | character varying |           |          | 
 timestamp_rec | bigint            |           |          | 
 _id           | integer           |           | not null | nextval('event_table__id_seq'::regclass)
tc_cadet_dataset_db=# alter table event_table owner to postgres;
# 在表event_table的_id列上创建唯一索引,并允许用户postgres对表执行delete,insert,select等操作
tc_cadet_dataset_db=# create unique index event_table__id_uindex on event_table (_id); grant delete, insert, references, select, trigger, truncate, update on event_table to postgres;

tc_cadet_dataset_db=# create table file_node_table    # 创建文件节点表
tc_cadet_dataset_db-# (
tc_cadet_dataset_db(# node_uuid varchar not null,
tc_cadet_dataset_db(# hash_id   varchar not null,
tc_cadet_dataset_db(# path      varchar,
tc_cadet_dataset_db(# constraint file_node_table_pk
tc_cadet_dataset_db(#     primary key (node_uuid, hash_id)
tc_cadet_dataset_db(# );
CREATE TABLE
tc_cadet_dataset_db=# alter table file_node_table owner to postgres;
ALTER TABLE

tc_cadet_dataset_db=# create table netflow_node_table   # 创建网络流节点表
tc_cadet_dataset_db-# (
tc_cadet_dataset_db(# node_uuid varchar not null,
tc_cadet_dataset_db(# hash_id   varchar not null,
tc_cadet_dataset_db(# src_addr  varchar,
tc_cadet_dataset_db(# src_port  varchar,
tc_cadet_dataset_db(# dst_addr  varchar,
tc_cadet_dataset_db(# dst_port  varchar,
tc_cadet_dataset_db(# constraint netflow_node_table_pk
tc_cadet_dataset_db(#     primary key (node_uuid, hash_id)
tc_cadet_dataset_db(# );
CREATE TABLE
tc_cadet_dataset_db=# alter table netflow_node_table owner to postgres;
ALTER TABLE

tc_cadet_dataset_db=# create table subject_node_table    # 创建subject节点表
tc_cadet_dataset_db-# (
tc_cadet_dataset_db(# node_uuid varchar,
tc_cadet_dataset_db(# hash_id   varchar,
tc_cadet_dataset_db(# exec      varchar
tc_cadet_dataset_db(# );
CREATE TABLE
tc_cadet_dataset_db=# alter table subject_node_table owner to postgres;
ALTER TABLE

tc_cadet_dataset_db=# create table node2id    # 创建node2id表
tc_cadet_dataset_db-# (
tc_cadet_dataset_db(# hash_id   varchar not null
tc_cadet_dataset_db(#     constraint node2id_pk
tc_cadet_dataset_db(#         primary key,
tc_cadet_dataset_db(# node_type varchar,
tc_cadet_dataset_db(# msg       varchar,
tc_cadet_dataset_db(# index_id  bigint
tc_cadet_dataset_db(# );
CREATE TABLE
tc_cadet_dataset_db=# alter table node2id owner to postgres;
ALTER TABLE
tc_cadet_dataset_db=# create unique index node2id_hash_id_uindex on node2id (hash_id);
CREATE INDEX

(3) 图学习

  1. 准备
cd DARPA/CADETS_E3/
mkdir -p ./artifact/
  1. 创建数据库
service postgresql start # 启动postgresql数据库

修改config.py

raw_dir = '下载的CADETS3模型的路径'
host = 'localhost'
password = 'postgres账号的密码'

运行create_database.py可能会遇到如下错误:
在这里插入图片描述
需核对config.py中的host和password部分
3. 嵌入
直接运行时产生报错:这个错误是由于FeatureHasher期望输入的数据是一个可迭代的字符串集合,而不是单个字符串列表。
解决方法:将gen_feature函数中的vec=FH_string.transform([i]).toarray()修改为 vec=FH_string.transform([[i]]).toarray()
在这里插入图片描述
嵌入:
在这里插入图片描述
在这里插入图片描述
4. 训练
训练过程train.py中使用了torch_geometric 2.5.3版本,没有seq_batches方法。这里改为手动实现并调用seq_batches方法:

def seq_batches(data, batch_size):
    for i in range(0, data.num_events, batch_size):
        src = data.src[i:i + batch_size]
        dst = data.dst[i:i + batch_size]
        t = data.t[i:i + batch_size]
        msg = data.msg[i:i + batch_size]
        yield Batch(src=src, dst=dst, t=t, msg=msg)

class Batch:
    def __init__(self, src, dst, t, msg):
        self.src = src
        self.dst = dst
        self.t = t
        self.msg = msg
        self.num_events = len(src)
...
for batch in seq_batches(train_data, batch_size=BATCH):
...

运行训练脚本后,得到训练好的模型
在这里插入图片描述

  1. 测试
    由于torch_geometric版本问题,导致直接运行test脚本会产生错误:
AttributeError: 'GlobalStorage' object has no attribute 'seq_batches'

可以改用 TemporalDataLoader 来处理时间数据的批次处理。

# 将'for batch in inference_data.seq_batches(batch_size=BATCH):'替换为
loader = TemporalDataLoader(inference_data, batch_size=BATCH)
for batch in loader:

运行test.py后得到不同时间段下图重建的结果
在这里插入图片描述
在这里插入图片描述

(4) 异常检测

  1. 构造异常队列
python anomalous_queue_construction.py

anomaly.log内容
在这里插入图片描述
2. 评估

python evaluation.py

评估结果:
在这里插入图片描述

(5) 攻击调查

直接运行会报错,缺少安装包

pip install python-louvain
sudo apt-get install graphviz
dot -V # 验证安装成功
python attack_investigation.py 
  0%|                                                                                                               | 0/4 [00:00<?, ?it/s]0.7539264735377483
1.1945989746948176
thr: 2.545824935579975
 25%|█████████████████████████▊                                                                             | 1/4 [00:00<00:01,  1.61it/s]0.9960993769260919
1.2333574363661417
thr: 2.8461355314753045
 50%|███████████████████████████████████████████████████▌                                                   | 2/4 [00:01<00:01,  1.95it/s]1.1539775785682247
1.305662714011356
thr: 3.1124716495852587
 75%|█████████████████████████████████████████████████████████████████████████████▎                         | 3/4 [00:01<00:00,  1.93it/s]1.146837810093757
1.344813304213849
thr: 3.1640577664145306
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████| 4/4 [00:01<00:00,  2.21it/s]

最后得到可视化的攻击图结果

2. 论文实验

实验部分使用SCISKIT-LEARN来实现分层特征散列,使用PYG来实现Kairos的图学习框架,使用NetworkX实现了Louvain。最后,使用GraphViz来可视化摘要图,以便进行手动检查。
实验环境:
所有实验都是在运行CentOS7.9、2.20G Hz 20核Intel Xeon Silver 4210 CPU和64GB内存的服务器上运行的
超参数:
节点特征嵌入维度|Φ|=16、节点状态维度|s(v)|=100、邻域大小|N|=20、边嵌入维度|z|=200、时间窗口长度|tw|=15分钟

(1) 数据集

DARPA和Manzoor et al.
在这里插入图片描述

Manzoor et al.
数据集包含由SystemTap从受控实验环境中的六个活动场景中捕获的起源图。每个良性场景中只使用一个图来训练Kairos,并使用24个图作为验证数据来配置检测阈值,以不在其选择中引入偏差。我们使用剩余的良性图(每个场景75个)和所有100个攻击图作为测试数据。
使用这一数据集允许比较Kairos与Unicorn和ThreaTrace,这两个最先进的PIDS在全系统起源图上执行异常检测。然而,无法证明Kairos可以用这个数据集重建攻击活动,因为细粒度的攻击gt(具体的攻击过程)不是公开的

DARPA
使用来自DARPA TC和OpTC计划的数据集,其中E3和E5的起源数据是公开可用的。OpTC数据集包含500台Windows主机在7天内的良性活动,以及另外3天的良性和APT活动的混合数据。实验部分随机选择六台主机,只使用其中一天的良性数据进行训练,另外一天进行验证,但使用所有主机的全部三个攻击日数据进行测试。
使用DARPA数据集来表明Kairos:

  • 可以准确检测异常,即使它们隐藏在长时间跨度的大量良性活动中
  • 精确地从原始起源图(描述良性和攻击活动)提取出紧凑的攻击摘要图中,而无需事先知道攻击,即使攻击活动罕见几个数量级
  • TC数据集可以比较Kairos与Unicorn和ThreaTrace
  • OpTC数据集来证明Kairos可以实际部署在大规模的系统网络中

DARPA提供攻击GT,使我们能够标记与攻击相关的单个节点和边。因此可以手动将Kairos重建的攻击图与GT图进行比较。

(2) 检测性能

为了评估Kairos的检测性能,重播每个数据集中的测试数据,就好像Kairos在监控主机系统运行时的行为一样。仅使用良性数据离线进行模型训练。
根据时间窗口计算所有数据集的精确度、召回率、准确度和ROC曲线下面积(AUC)结果。根据GT手动将起源图中的每个时间窗口标记为良性或攻击。如果Kairos将良性时间窗口标记为异常(即,如果Kairos错误地将良性时间窗口包括在异常队列中),我们认为该时间窗口是假阳性(FP)。另一方面,如果Kairos正确地将攻击时间窗口标记为异常,则将其计为真阳性(TP)。
在这里插入图片描述
Kairos可以准确检测所有攻击,实现100%召回。Kairos在一组实验中报告了FP(导致精度较低),原因是①在攻击者停止主动攻击之后,Kairos仍会将高重构错误分配给其节点处于攻击者影响下的边。②Kairos将高重构误差分配给仅在测试数据中引入的新应用程序的新活动。由于他们的行为完全未知,尽管不是恶意的,但这对Kairos来说是不正常的。这是概念漂移的一个例子,其中新的良性行为不适合通过模型学习的基本统计属性。
模型再训练
Kairos使模型再训练更加实用,因为它使系统管理员能够通过KAIROS提供紧凑的候选摘要图来快速识别错误警报以进行检查。为了更新模型,仅使用FP时间窗口中的起源数据在现有模型上重复相同的训练过程。Kairos可以不断向FP学习,以解决概念漂移问题,并避免在未来犯下类似的错误。

(3) 对比实验

选择Unicorn和ThreaTrace作为主要的PIDS进行比较,因为它们是基于异常的、开源的,并且由作者使用Manzoor et al.以及DARPA数据集的子集进行评估。同样,StreamSpot和Frappuccino也是开源的异常检测系统。然而,Unicorn已经被证明优于这些系统。我们自己在DARPA TC数据集上对StreamSpot的评估证实了其他人之前的性能分析:StreamSpot无法在所有TC数据集中检测到任何异常。因此,不再进一步讨论StreamSpot或Frappuccino。

Unicorn

Unicorn通过将动态的起源图特征化为一系列固定大小的、可增量更新的草图来构建系统的行为模型。每个草图表示一个快照,该快照描述了从系统执行的开始到拍摄快照的时间点的整个图形。生成新草图的频率是一个超参数,由流向该图的新边的数量决定。在测试时,Unicorn可以快速生成和更新被监控系统的草图,并将它们与模型中已知的良性草图进行比较,以执行运行时检测。

Unicorn将整个图归类为良性或包含攻击,并将其用作计算检测性能的单个数据点,而不是像在Kairos中那样计算更细粒度的时间窗口级别。为了采用Unicorn的计算指标的方法,如果Kairos将至少一个时间窗口标记为攻击,则认为整个图都是恶意的。
Unicorn没有在DARPA E5数据集上进行评估
在这里插入图片描述
当Unicorn发出警报时,攻击活动可以隐藏在图中的任何位置,要求系统管理员盲目回溯图以推断警报。相比之下,Kairos不仅产生更少的错误警报,而且还创建紧凑的摘要图,突出显示可能的攻击足迹

ThreaTrace

ThreaTrace为起源图中的每种类型的节点都构建一个模型,以检测异常节点。对比实验的数据集是ThreaTrace使用的数据集:Manzoor et al.和DARPA的子集。由于Manzoor et al.数据集节点级别的GT不可靠,因此ThreaTrace对Manzoor et al.数据集的节点级检测转换为图级检测。如果异常节点的数量超过预定义的阈值,则认为图是异常的。
ThreaTrace手动将GT中的节点及其2跳祖先和后代节点都标记为异常,即使相邻节点没有参与攻击,即与GT中的真正异常节点相距4跳的良性节点可能被ThreaTrace错误分类,但不会被报告为FP。

在这里插入图片描述
对于DARPA数据集,采用ThreaTrace的方法来计算度量,并使用异常时间窗口中的异常节点来计算精确度、召回率和准确率。
与Kairos不同,ThreaTrace不能重建一个完整的攻击过程。虽然ThreaTrace的节点级检测在一定程度上可以帮助理解攻击,但当图较大且FP节点数量较多时,这种方法是不实用的。

(4) 超参数对性能的影响

节点嵌入维度(|Φ|)

节点嵌入对初始节点特征进行编码。相对较小的维度足以编码这些特征。较大的维度会导致稀疏特征,这可能会严重影响检测性能并导致较大的内存开销。|Φ|=16是所有数据集的理想维度

节点状态维度|s(v)|

节点的状态捕获节点邻域随时间的时间演变。当|s(v)|太小时,Kairos很难记住过去事件的信息。但如果|s(v)|变得太大,检测性能会下降,因为状态可能包含与当前事件无关的过时历史,另外|s(v)|还会影响内存开销。|s(v)|=100是所有TC数据集的理想维度

邻域采样大小(|N|)

节点的邻域捕获了节点的结构角色。|N|=20在所有数据集中是理想的

边嵌入维度(|z|)

边嵌入z编码了边周围的图的状态和结构信息。随着|z|的增加,边嵌入可以更好地保留解码器重建边缘的时间和结构信息。然而,过大的|z|会使模型复杂化,并影响Kairos的泛化能力。|z|=200提供最佳检测性能

时间窗口长度(|tw|)

时间窗口的长度决定了Kairos执行其异常检测算法的频率。通常,时间窗口越长,累积的系统事件数量就越多。由于良性活动的数量占比远超攻击活动的数量,较大的时间窗口可能会使异常检测变得困难。当|tw|太大(60分钟)时,Kairos产生更多的假阴性,这导致低召回率(和高准确率)和总体低准确率。当|tw|较小时(5分钟),我们会看到性能略有下降,因为较短的时间窗口可能会限制Kairos准确地将事件设置为上下文的能力。然而,没有必要仅仅为了提高检测的及时性而使用小的时间窗口,因为APT行为者只会缓慢地渗透到他们的目标系统中。|tw|=15分钟在所有数据集中是理想的,增加时间窗口长度仅略微增加了存储器开销,即使当长度很大时也是如此。这是因为Kairos以流的方式处理起源图,而不是将整个图保存在内存中。

(5) 攻击重建

重建完整但简洁的攻击过程的能力是首要设计指标。这对异常检测系统尤其重要,尤其是那些利用深度学习的系统。
与生成攻击摘要图的异常时间窗口队列的大小相比,攻击摘要图的大小最多小五个数量级。例如,在E3-Theia中,Kairos实现了109,469倍的边数减少,将需要手动检查的边数从异常时间窗口队列中的340万条减少到仅31条。这部分将使用攻击摘要图和良性摘要图来说明Kairos构建简明图的能力。

(6) 端到端性能

Kairos以固定的时间窗口间隔处理流来源图,并在检测到异常时间窗口队列时发出入侵警报。如Kairos在E3-Theia上处理15分钟时间窗口,Kairos最多只需要228.8秒(或15分钟的25.4%)来处理一个时间窗口(包含大约250万个边缘),远远低于一个时间窗口的持续时间。StreamSpot每秒处理约14K个边缘,而Kairos的延迟稍高一些,每秒处理约11K个边缘。然而,Kairos在检测准确率方面明显优于StreamSpot。先前的工作已经表明,即使在主机系统繁忙的情况下,起源捕获系统每秒生成的边数通常也少于10K。因此,Kairos可以同样轻松地处理流传输的起源图,而不会“落后”。综合表示,Kairos可以在运行时有效地监视主机系统。

  • 20
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值