An Ensemble of Autoencoders for Online Network Intrusion Detection

本文的创作初衷是为了完成学校布置的课程任务,要求介绍并复现一个网络入侵检测系统,于是我们选择了Kitsune进行讲解。总的来说,Kitsune是一个相对简单的模型,主打一个轻量级和无监督。如果你有关于Autoencoder自动编码机(AE)的相关知识,那么理解起来将会非常轻松。

如果你想要更深层次的理解Kitsune,那么你可以去阅读它的原始论文[1] "Kitsune: An Ensemble of Autoencoders for Online Network Intrusion Detection." *Network and Distributed System Security Symposium (NDSS)参考资料。此外,作者也在Github上开源了论文使用的代码[2]Kitsune GitHub 源码仓库参考资料

下面是对Kitsune的一个简要梳理。

引言:我们为什么需要流量异常检测?

当今,针对计算机网络进行的攻击越来越多。为了确保计算机系统的安全,一个常见的方法是使用NIDSNetwork Intrusion Detection System,网络入侵检测系统。NIDS的工作原理是在战略点运行一个设备或者软件,用以监测所有通过的流量。假如发现了异常的流量,就发出预警告知管理员。通常情况下,我们都把NIDS部署在网关,用以单点监测。除了单点部署,也可以进行分布式部署来保障安全。

在过去几年,人们已经开始将机器学习算法运用于网络流量检测。其中使用ANNArtificial Neural Network的方法最为流行。因为ANN善于学习数据中的非线性关系,这使得它相比于其他机器学习算法在网络流量检测方面占有更大的优势。一般来说,使用ANN来检测异常流量可以分为以下四个步骤:

  1. 首先由专家收集并标注用以训练的正常流量和攻击流量数据集。
  2. 然后用强大的CPU或GPU在数据集上训练好ANN。
  3. 接着把训练好的ANN模型副本部署在NIDS上。
  4. 最后NIDS用已经训练好的模型来检测通过的流量。

然而在实际情况下,直接使用ANN是不可行的,理由主要有以下三点:

  1. 离线处理:要训练一个有监督的模型,所有的标注实例都必须在本地可用,然而这在简单的网关设施上是不可行的。当然也可以把数据发送到远程服务进行训练,但这会产生巨大的网络开销。
  2. 监督学习:标注流程成本高昂。另外,攻击随着时间的演变在不断变化,维护一个恶意攻击流量存储库是不现实的,而且为了进行识别分类将所有类别的攻击流量全部放入训练数据中本身就不合理。
  3. 复杂度高:ANN的计算复杂度随着神经元数量的增加而指数增长,因此部署在简单的网关设备上会限制ANN的性能。

为了解决这些问题,部署在基于ANN开发的NIDS应当遵循以下原则:

  1. 在线处理:使用实例训练或执行完毕后,该实例会立刻被丢弃。
  2. 无监督学习:训练过程中不采用明确数据包是良性还是恶性的标签。只要不耽误处理进程,其他元信息也可以使用。
  3. 低复杂度:数据包处理速率必须高于预期的数据包抵达速率,也就是说要保证没有任何数据包处于等待状态。

基于以上原则,诞生了Kitsune模型,它的特点是:轻量、在线、无监督

Kitsune 是什么?

Kitsune基于人工神经网络的轻量级入侵检测系统,是由以色列本古里安大学的 Yisroel Mirsky 博士等人提出,并于 2018 年发表在 NDSS(Network and Distributed System Security Symposium,网络与分布式系统安全会议)上的一项研究成果。该系统名字来源于日本神话中的“狐妖”,象征着多尾、善变、成长与进化的特性,恰好也暗示了 Kitsune 模型的结构与功能:由多个子神经网络构成,随着时间不断学习网络流量的特征,愈发强大。 ChatGPT Image 2025年5月11日 18_57_15

Kitsune 的总体功能是构建一个在线、无监督、低资源消耗的入侵检测系统。与传统离线训练的大模型不同,Kitsune 只需要看到一条流量就能立即进行训练和判断,不依赖攻击流量、不依赖标签,也不需要高性能服务器。它通过Autoencoder不断学习“正常流量”的表现形式,一旦出现偏离这种“正常模式”的行为,就通过重建误差高低将其标记为异常。

image-20250511201331980

Kitsune 的设计目标非常明确:部署在现实中实际可用的设备上,尤其适用于物联网场景中的边缘设备如家庭路由器、小型防火墙、工业控制器等。在这些资源有限、无法运行大模型的环境中,Kitsune 可以提供基本且实时的网络入侵检测能力。

总而言之,Kitsune 不是为了“跑得更准”,而是为了“部署得出去”,它用巧妙的架构设计和神经网络的最小必要单元,做成了一个真正能用的流量检测系统。

自编码器基础:如何让神经网络自己学会“什么是正常”?

Autoencoder,是一个最经典的无监督神经网络结构。它不需要任何人工标签,只需要输入原始数据,就能训练出“对输入数据结构的理解”。换句话说,它的目标不是分类,不是预测,而是让网络自己理解输入数据长什么样子,并尽力还原它

自编码器的结构一般分为两部分:

  1. 编码器(Encoder):把输入压缩为一个低维的“潜在表示”
  2. 解码器(Decoder):再把这个压缩表示尽量还原成原始输入

训练的目标很简单——最小化输入和输出之间的差距。差距越小,说明网络对输入理解得越好。

image-20250511201259173

以图像为例:如果你把一张猫的照片输入自编码器,它压缩再重建后还是一张猫,那说明它确实理解了“猫”的样子。可如果你给它一张它没见过的奇怪图,它就重建不出来,结果就会很模糊。

这就是自编码器能被用来异常检测Anomaly Detection的原因:它只能还原它见过的“正常”,无法还原没见过的“异常”。

Q:那 Kitsune 是怎么用 AE 做异常检测的呢?

A:Kitsune 的每个小型神经网络(也就是小 AE)都是在“正常流量”上进行训练的。当模型看到新的流量包时,会尝试把它压缩再还原。如果这个包的特征和过去见过的正常流量一致,AE 就能重建得很好,误差很小;如果它属于攻击流量或某种从未见过的模式,那么重建就会失败,误差变大。

因此,在 Kitsune 的世界里,判断是否异常的关键标准非常直接:

重建误差 > 阈值 = 异常

这是一个没有标签、也无需攻击预设的检测方式,它让模型自己决定什么是“正常”。

Kitsune 的架构解析

系统模块结构图

为了理解 Kitsune 是如何工作的,我们不妨跟着一条网络数据包走一遭。

Kitsune 的整个检测流程可以用一句话概括:

Packet In → Feature Extractor → Feature Mapper → KitNET → 判断是否异常

📦 网络包 → 🎛 特征提取器(Feature Extractor)→ 🧩 特征映射器(Feature Mapper) → 🧠 KitNET(多个小 AE + 输出层 AE) → ⚠️ 异常判断器(根据重建误差阈值)

每一个环节都有它独特的功能。下面我们用一张图来表示 Kitsune 的结构:

image-20250511201242288

每来一个网络包,Kitsune 都会做以下几件事:

  1. 特征提取:从包头和连接上下文中提取 115 维统计特征(如包间时间、方向、大小等)
  2. 特征分组:将这 115 个特征根据相关性自动分成多个组,每组送入一个小型 Autoencoder
  3. 局部重建:每个小 AE 对自己的特征子集进行“压缩-还原”操作,输出一个局部重建误差
  4. 整合判断:所有小 AE 的输出汇总到一个输出层 AE,由它综合给出最终的异常得分
  5. 误差判定:若误差高于阈值,则该流量被判定为异常

接下来我们将逐步拆解系统中每一个模块的细节。

特征提取(Feature Extractor)

在神经网络中,输入的质量决定了模型输出的上限。Kitsune 不直接用原始数据包的比特流,而是通过一个轻量的特征提取模块,把每个网络包转换为一个115维的特征向量的行为快照。这些信息捕捉了一个小的时间窗口:

  1. 数据包发送方的总体情况
  2. 数据包发送方和接收方之间的流量。

这个过程发生在系统的最前端,叫做 Feature Extractor特征提取器

为什么选这些特征?

Kitsune 不仅关注这个包的内容,更关注是谁发的、发给谁、通信的上下文是否异常。因此,它会从四种不同粒度的“通信实体”中提取特征:

通信实体 表示的含义
SrcMAC-IP 包的来源 MAC + IP(物理+逻辑)
SrcIP 来源 IP 地址(逻辑层行为)
Channel 来源 IP 与目的 IP 的组合(一个 IP 层的通路)
Socket TCP/UDP 四元组(端口级的通信)

这四种实体从不同维度反映当前包所处的“社交关系”,比如这个发包者是一个频繁通信的大 IP?还是一个端口刷屏的可疑客户端?从一个时间窗 λ 中总共可以提取 23 个特征(包括上述特征)。

Kitsune 不仅看当前行为,还会快速回顾过去一段时间内这个实体的通信习惯。具体来说,Kitsune 会使用 五种不同时间窗口 λ 来提取过去的行为统计:

  • 最近 100ms(λ = 0.01)
  • 最近 500ms(λ = 0.1)
  • 最近 1.5 秒(λ = 1)
  • 最近 10 秒(λ = 3)
  • 最近 1 分钟(λ = 5)

这种做法让模型能同时看到“短期突发行为”和“长期趋势变化”,是检测攻击流量节奏的关键机制。

Q:Kitsune 是怎么得出 115 维特征的?

A:Kitsune 从每个通信实体中提取一套共 23 个流量行为特征,然后将这 23 个特征,在 5 个时间窗口下各提取一遍:

23 特征×5 时间窗口=115 维特征23 \text{ 特征} \times 5 \text{ 时间窗口} = 115 \text{ 维特征}

每个网络包到来时都会提取这 115 维向量,作为后续 KitNET 模型的输入。即便某些实体(如 socket)在包中不存在,它们的对应特征也会自动填 0,保证特征维度统一。

一个聪明的小细节:阻尼递增统计(Damped Incremental Statistics)

为了实现在线处理,Kitsune 并不保留所有历史数据来计算统计特征,而是使用了一种叫做 Damped Incremental Statistics阻尼递增统计 的方法。

这是一种不保存历史样本的“在线统计”方法,它能对“最新数据”给更大权重,而让老数据的影响随时间自动衰减,非常适合流量这种时序敏感的数据与资源受限的嵌入式设备

实际上,Kitsune 所用的“阻尼统计”在工程实现上考虑了很多实用问题,比如时间差异、异常流量抖动等。但从核心原理来看,它的机制就是一种指数加权平均(EWMA),用不断衰减的方式综合过去数据的影响。我们可以用简化公式来帮助理解这个机制。下面是一段用于计算阻尼平均值与标准差的伪代码:

initialize: mean = 0, variance = 0
set: alpha = 0.01 # 阻尼因子(越大越关注当前)

for each new value x:
delta = x - mean
mean += alpha * delta
variance = (1 - alpha) * (variance + alpha * delta^2)
  • mean 是阻尼平均值
  • variance 是阻尼方差(无偏估计)
  • alpha 是阻尼因子:值越大,越“健忘”,越关注当前

Kitsune 通过这个机制,在不牺牲速度和内存的前提下,准确提取了流量行为的最新状态,为后续的 AE 模型提供了足够信息密度的输入。

特征映射(Feature Mapper)

提取出 115 维的网络流量特征向量后,Kitsune 并不会直接将它们一股脑送进一个大模型。相反,它采用了一种模块化的神经网络结构,把特征按组划分、分别送入多个小型自编码器中,再将它们的结果汇总判断。

这个划分工作由 Feature Mapper特征映射器 模块完成。

自动分组的动机:小 AE 更快更稳

如果把 115 维的特征都塞进一个大的自编码器,会遇到几个严重问题:

  1. 计算量大,训练慢:AE 的参数量和输入维度成平方增长,资源消耗高。
  2. 泛化能力差:大模型容易过拟合少数重要特征,而忽略其他微妙信号。
  3. 不适合在线训练:Kitsune 要求每个包来就更新一次,速度必须快。
  4. 难以解释:局部异常(比如某一个 Socket 行为异常)容易被大模型“稀释掉”。

所以 Kitsune 的思路是:

“与其一个大脑处理所有输入,不如分成多个小脑,各司其职,专注某一类特征。”

那么我们怎么自动把特征分成组?

Kitsune 使用了一种简单但高效的策略:基于 Pearson 相关系数的贪心聚类算法。

Pearson 聚类的策略(简述)

Kitsune 使用了一种基于 Pearson 相关性的层次聚类算法agglomerative hierarchical clustering,通过对 115 维特征构建相关距离矩阵,再生成一棵聚类树dendrogram。最终通过裁剪该树,将特征分成若干组,确保每组内高度相关、且组内维度不超过预设上限(如 m=10)。

其基本思路如下:

  1. 计算特征之间的 Pearson 相关性矩阵
    • 两两计算特征间的线性相关程度,数值越接近 ±1 代表相关性越强
  2. 使用贪心策略分组
    • 尽量将相关性高的特征放进同一个组
    • 每组不超过一个预设的最大维度(默认是 10)

最终的结果是:

  • 将 115 维特征划分成多个组(如 12 组)
  • 每组交给一个单独的小 AE 处理
  • 每个小 AE 专注学习一个“特征子空间”的正常行为模式

Feature Mapper 的输出是一个列表:

[
[x0, x1, x9], # 小AE1接收的特征
[x2, x3, x4, x5], # 小AE2接收的特征
...
[x99, x100, x114] # 小AEk接收的特征
]

它是一个“特征索引列表”,表示哪组特征归哪个 AE 管。这个映射在 训练初期生成一次后就固定,不会在之后动态调整,确保训练稳定性。

image-20250511201147358

总的来说,Kitsune 的 Feature Mapper 模块,让我们把高维输入“切块”,分发给多个小神经网络,从而实现了:

  • 更快的训练
  • 更好的鲁棒性
  • 更强的解释性
  • 更适合嵌入式设备部署

这种“分组 + 小 AE”架构也就是我们即将讲到的核心组件:KitNETKit-sune NET-work,模块化自编码网络 的基石。

image-20250511201028597

KitNET 架构详解

前面我们讲到,Kitsune 并不使用一个庞大的神经网络去处理全部特征,而是将特征按相关性分组,分发给多个 Autoencoder 模块,每个模块独立训练。这些模块构成了 Kitsune 检测引擎的核心结构:KitNET,包含在Anomaly Detector异常检测器部件中。

KitNET 的设计由两层组成:

Ensemble Layer(子模型层)

这是多个小型自编码器组成的神经网络集合,每个小 AE 负责处理一组特征子集。

例如:

子 AE1:处理 [x₀, x₁, x₉]
子 AE2:处理 [x₂, x₃, x₄, x₅]
...
子 AEk:处理 [x₉₉, x₁₀₀, x₁₁₄]

每个小 AE 的输出是一个 局部重建误差值,表示该特征子空间当前的行为是否“正常”。

这就像每个小医生在检查某个局部器官,有的查血,有的查心跳,有的测体温。

Output Layer(输出层 AE)

Ensemble Layer 的输出,是一组误差值:

e₁, e₂, ..., eₖ

这些误差值构成一个新的输入向量,送入一个额外的大型 AE,我们称之为“输出层 AE”或“meta AE”。

它的任务是:

  • 学会“正常的误差组合模式”
  • 判断这些误差组合是否也偏离了常规

最终我们得出一个整体重建误差 eₒ,用来判断当前整个输入是否异常。

Kitsune 作为一个无监督入侵检测系统,它并不会告诉你:“这是木马”或“这是DDoS”,也不会输出一个多分类结果。它的判断逻辑非常朴素而有效——能不能把输入“还原”出来?只要重建误差超过某个阈值,就报警!

判断规则就是:

If e>τAnomaly\text{If } eₒ > \tau \quad \Rightarrow \quad \text{Anomaly}

其中 τ\tau 是一个用户可调的阈值,可以根据你希望报警多还是少来设定。

Q:阈值是怎么来的呢?

A:Kitsune 默认有一个静态阈值(如 0.1、1.0),但更推荐使用统计式自适应阈值,比如:

  • 根据 warm-up 阶段的平均重建误差 + N 倍标准差来设置
  • 或者使用滑动窗口内的历史误差分布来实时调整

这使得系统能更灵敏地适应环境变动,降低误报率。

Kitsune 不通过分类器判断“这是什么”,而是通过重建误差判断“这是不是我熟悉的”。只要重建失败,误差高于阈值,就被视为异常。这个机制简单、高效、不依赖攻击标签,是无监督流量检测最实用的一种方式。

这个结构就像是多个小科室医生检查完后,汇总给一个总诊断医生,由他拍板:这个人到底是不是“健康”。

为什么这样设计比一个大 AE 更好?

这个问题很值得问。确实,如果只从功能角度看,一个大 AE 也可以处理所有 115 维输入。那为什么 Kitsune 要“拆成小模块+一个输出层”这么麻烦?

答案是:

  1. 计算效率高:
    • 小 AE 参数少,训练和前向传播都快
    • 更适合嵌入式设备和在线训练
  2. 表达更稳定:
    • 高维 AE 更容易过拟合局部模式
    • 小 AE 专注特定子空间,泛化能力强
  3. 模型可解释性好:
    • 每个子 AE 的异常得分可单独追踪
    • 有利于溯源(是哪部分出了问题?)
  4. 支持模块替换:
    • 可以只重训某几个子 AE,而不用全模型更新
    • 更灵活

通过小模型协作 + 层级汇总的机制,Kitsune 实现了:

  • 快速响应
  • 在线训练
  • 高效部署
  • 适度可解释

在下一节中,我们将看到 Kitsune 是如何在实时运行中结合这些结构进行训练与判断的。

训练方式与在线学习机制

大多数基于神经网络的模型都需要一个完整的数据集,经过长时间的训练之后,才能进行部署。但 Kitsune 的设计初衷在于部署到边缘设备上处理实时网络流量,所以它不能在训练上花费太多时间,它必须做到:一个数据包来,就能学一点东西;再来一个,就立刻用得上。

这就决定了它采用的是一种完全不同的训练方式:Online Learning在线学习,搭配 SGD随机梯度下降 来即时更新参数。

使用 SGD 的原因与优势

SGD(Stochastic Gradient Descent)与传统的批量梯度下降(Batch Gradient Descent)不同,它每次只用一个样本来估计梯度并更新模型。批量梯度下降每次用全量数据更新,计算精确但开销大;而 SGD 每次用一个样本更新,虽然抖动大但非常快速,适合实时系统。Kitsune 使用 SGD 正是因为它支持在线训练,适合边缘设备高频流量处理。

相比之下:

方式 数据使用 更新频率 适合场景
批量训练 一次用整个数据集 一轮才更新一次 离线、资源充足的场景
在线训练(SGD) 每次一个样本 每来一个包就更新 实时、边缘计算设备

Kitsune 的设计目标就是实时低资源检测,所以 SGD 成为不二之选。

在线学习机制

每当一个网络包到来时,Kitsune 做三件事:

  1. 提取特征向量 xR115x \in \mathbb{R}^{115}
  2. 用当前参数计算预测值(AE 重建)
  3. 计算误差,反向传播,立刻更新参数

每个自编码器都是局部独立的,每次都只用当前样本做一次训练更新,不会等到数据积累才统一训练。这种“边看边学”的方式,让 Kitsune 能够在没有完整训练集的情况下快速上线。

Warm-up 阶段为何重要(避免乱报)

在系统刚启动的阶段,模型还什么都没学,会把一切流量都当成“异常”。为了避免这种误报,Kitsune 设置了一个训练热身期,也就是:

前 N 个数据包只用于训练,不进行异常检测

这个阶段叫 Warm-up冷启动学习期。只有当 KitNET 里的每个自编码器都训练了一定次数,模型才会切换为执行模式,开始根据重建误差判断是否异常。

Kitsune 的优势与局限

在前面的章节中,我们已经详细分析了 Kitsune 的整体结构和工作机制。可以说,它不是一个“只存在于论文里的模型”,而是一个真正能够部署、能够落地的异常检测系统。

但与此同时,Kitsune 并非完美无缺。它所选择的设计方案,也带来了许多场景适配上的权衡

优势:快、轻、够用

  • ✅ 在线学习,训练快速,边看边学

    Kitsune 使用的是 SGD,每来一个样本就训练一次,不需要大数据、也不依赖集中式训练。这让它具备了快速收敛 + 持续学习的能力,非常适合部署在网络边缘位置,比如家庭网关、交换机、嵌入式防火墙等。

  • ✅ 不需要攻击样本,无需人工标注

    传统的机器学习 NIDS 系统需要先收集海量攻击流量,并打上标签。Kitsune 完全跳过了这一点,它只需要学习“正常流量长什么样”,当流量不再“正常”时就报警。这种 零正负学习Zero-Positive Learning 思路使得它对未知攻击类型也有一定泛化能力

  • ✅ 模型轻量,资源开销小

    每个小 AE 模型结构非常简单,特征维度也被控制在合理范围,整个系统甚至可以在树莓派等低功耗设备上运行。论文中实测,Kitsune 在 Raspberry Pi 上能处理超过 5000 个包/秒。

局限:不是所有问题都能靠“还原”解决

  • ⚠️ 冷启动阶段依赖“干净数据”

    Kitsune 的训练期默认所有接收到的流量都是“正常的”,如果部署环境中一开始就混入了攻击流量,那模型就会错误地学习到异常行为,以后再也不会把它当作异常。这种“概念污染”很难逆转。解决方式是:

    • 人工隔离训练阶段
    • 在训练结束后冻结参数
    • 或引入更复杂的漂移检测机制(Kitsune 本身不支持)
  • ⚠️ 容易被攻击者“训练带偏”(概念漂移)

    由于模型一直在线更新,如果攻击者长期缓慢地注入恶意流量(比如每天一点点),就有可能把模型“带坏”,让它逐渐把恶意行为当成正常行为。这是在线无监督学习系统的天然缺陷。

    BARS 所做的鲁棒性认证,就是在某种程度上检验 Kitsune 是否对扰动敏感。

  • ⚠️ 对参数设定敏感,特别是阈值

    Kitsune 的最终判断逻辑依赖于一个设定好的“重建误差阈值”。如果设得太低,可能正常行为也会被误报;如果设得太高,一些微妙的异常就会被忽略。虽然可以使用滑动窗口或均值+标准差来动态估计,但仍存在调整成本。

小结

Kitsune 不是完美的,但它是“能跑起来、能判断、能实时部署”的模型。在“标签稀缺、计算资源有限”的网络边缘环境里,Kitsune 的小模型 + 局部判断 + 快速上线方案,体现了极强的实用性。

但在高安全要求、高动态环境下,它仍需要配合更完整的安全策略使用,比如模型冻结机制、漂移监测、阈值自调、或配合有监督审计系统。

BARS:我们是怎么对 Kitsune 做鲁棒性检测的?

在前面几节中,我们已经讲清楚 Kitsune 的整体原理与结构。但作为一个部署在真实网络环境中的系统,还有一个更关键的问题尚未解答:

Kitsune 稳不稳定?它面对数据扰动时还能维持判断一致吗?

为此,我们引入了一种新的评估框架:BARSBoundary-Adaptive Randomized Smoothing,对 Kitsune 进行了一次鲁棒性检验。

什么是 BARS?

BARS 是一种基于随机平滑Randomized Smoothing思想的鲁棒性认证方法,最早用于图像分类领域,我们在这里将其用于网络流量检测。具体可以参考这篇文章:【顶会论文分享】BARS:基于深度学习的流量分析系统的鲁棒性认证-腾讯云开发者社区-腾讯云

如果想要更进一步了解这项技术,可以去阅读它的原始论文[3]BARS: Local Robustness Certification for Deep Learning based Traffic Analysis Systems参考资料,由清华大学的王凯等人撰写,发表于 2023 年的 Network and Distributed System Security Symposium(NDSS)会议。同样的,作者也将复现代码[4]BARS 实验复现代码(包含 smoothed_kitsune 模块)参考资料托管在了Github。

它的基本思路是:

对于同一个输入流量特征 xx,向其添加一系列扰动噪声,生成多个扰动样本 x1,x2,...,xnx_1, x_2, ..., x_n,分别送入模型。
如果模型对这些扰动样本多数仍做出相同判断,说明这个输入点是“稳定”的。

我们怎么向 Kitsune 加噪声?

在实践中,我们使用 BARS 框架向 Kitsune 的输入特征加入分布自适应的扰动噪声。具体来说:

  1. 对输入特征 xx 的每一维添加从特定分布(如 Gaussian、ISRU、Arctan)中采样的噪声 δ\delta
  2. 同样的扰动的最大幅度(半径)为 rr
  3. 重复采样多次,输入到已训练好的 Kitsune 模型中
  4. 统计模型的输出判断是否一致,估算其“认证准确率”

这种方法类似于“推一推模型,看它还站得稳不稳”。

结果展示:稳定性随着扰动增大而降低

我们对 Kitsune 模型在 Mirai 攻击数据集上的表现进行了评估,得到如下图所示的结果:

certified_accuracy_robustness_radius_curve

图中横轴是扰动半径(即加入的噪声强度),纵轴是模型对这些扰动样本仍然保持判断一致的比例(认证准确率)。

可以看到:

  • 在小扰动范围(半径 0.1~0.3)内,Kitsune 的判断非常稳定
  • 随着扰动增大,模型预测开始出现波动
  • 到半径 0.5 以上时,认证准确率大幅下降

小结

BARS 给我们提供了一个很直观的视角,帮助我们理解:

  • Kitsune 对特征扰动的鲁棒性如何
  • 哪些特征子空间容易引起误判
  • 是否可以在未来增加防御机制来强化稳定性

最终我们可以说,Kitsune 在轻量设计的前提下仍保持了可接受的判断稳定性,但在强扰动下确实存在脆弱区域。

总结

在这篇文章中,我们详细梳理了 Kitsune——一个基于自编码器的轻量级在线入侵检测系统。它不依赖攻击标签、不需要离线训练,也不追求复杂的大模型结构,而是用一套极具工程智慧的设计,将无监督学习方法真正部署到了实时网络环境中。

Kitsune 的设计遵循三个核心原则:

  • 在线学习(Online):每个数据包来就训练,模型随时更新
  • 无监督训练(Unsupervised):只学习“正常”,无需预知“异常”
  • 轻量部署(Efficient):特征提取、模型结构、更新方式全部为边缘设备量身打造

它使用小型自编码器组成的 KitNET,结合多粒度时间窗口和相关性分组的特征输入,在不牺牲实用性的前提下,实现了对流量行为的敏感建模。

当然,我们也看到了它的局限:

  • 它假设训练初期是“干净环境”
  • 它难以抵抗被训练带偏的风险
  • 它依赖人为设定的参数阈值

但正如论文标题隐喻的和Chatgpt总结的那样:Kitsune——这只日本神话中的“狐妖”——不是万能的神兽,但却拥有多尾协作、变化灵活、持续成长的能力。

参考资料


image-20250511224410700