背景

入侵检测技术一般分为异常检测和特征/签名检测,这里主要讨论的是网络入侵检测系统(NIDS)。

  1. 异常检测 (Anomaly detection):假设入侵者活动异常于正常主体的活动。常用的方法有:关联规则、神经网络、SVM、邻近算法、隐含马尔可夫模型、Kalman过滤器、聚类算法、PCA、信息论等等。缺点是:需要训练样本、误报率(异常行为≠入侵行为)高。
  2. 特征/签名检测 (Misuse/Signature detection):假设入侵者活动可以用一种模式来表示,然后将观察对象与之进行比较,判别是否符合这些模式。常用的方法有:关联规则、神经网络、SVM、决策树、遗传算法、贝叶斯网络等等。缺点是:对新的入侵方法无能为力。

主流的入侵检测系统通常是采用异常检测+特征/签名检测。他们都存在的问题就是:

  1. 告警的基数大,即使只有1%的误报率,也会产生大量的误报告警。
  2. 误报率往往跟漏报率成反比,改进算法降低误报率可能会增加漏报率,降低系统的可靠性。
  3. 大量的告警需要人工审核,造成疲惫和不信任感。

基于输出数据(Outgoing data)

完整的数据流应该包括输入和输出两个部分,而大部分NIDS却只考虑了输入数据,没有使用输出数据。通常情况下,存在异常/恶意输入数据,并不意味着有成功的入侵行为。比如一个任意文件读取的HTTP请求,只有当它的响应体中包含那个文件的内容,才算是一个成功的入侵行为。所以降低误报率的一个方法就是对输入和输出数据进行关联分析。而输出的异常检测,就是另一种方法。

输出数据有以下几个问题:

  1. 不同程序/服务的输出数据不同,而且在使用的过程中,输出数据可能会一直变化。
  2. 不同程序/服务对于一种攻击类型做出的反应不同(比如一个SQL注入的HTTP请求,有些程序直接阻断,有些程序做了过滤,正常返回)。
  3. 如何把输入和输出数据关联起来?

那么这种降低误报的方法就是在传统的基于输入的NIDS的基础上,增加:1、输入输出数据的关联分析。2、输出数据的异常检测。结构如下:

Untitled

一次成功的攻击行为一定会引起程序/服务的异常输出(输出数据、响应时间、其他行为等等)。当NIDS触发告警,关联引擎查看该告警对应的输出数据是否有异常,如果存在异常才认定为True positive。也可将攻击行为分类,关联分析输出数据是否符合该攻击行为的响应。当然,这也存在着许多缺点:1、每个程序/服务第一需要大量的样本训练。2、程序/服务的某些特征出现变动,需要重新训练样本。3、输出数据太多(比如我司http下行流量4GB/s),收集、训练成本太高。4、其他…

基于威胁模型(Thread Model)

NIDS的目的就是随时发现可能的入侵行为,并进行具体分析,及时、主动地进行干预(发送告警),从而取得防患于未然的效果,也就是说降低风险。在风险管理中,Risk = (probablity of the accident occuring) x (expected loss in case of accident)。其中(expected loss in case of accident)可以理解的攻击的类型,常见的有三类:

Powered by Fruition