A Multi-Model Approach to the Detection of Web-Based Attacks
背景知识和启发
异常检测的假设条件
- 依赖于用户和应用的潜在行为模型
- 假设攻击模式异于正常行为
- 这个差异可以定量或定性地描述
- 与正常行为的偏差视为异常的证据
Web 安全
- Web 服务器可以由外部环境访问
- Web 应用开发时并未事先考录安全问题
Web 相关的攻击检测
- 基于滥用的检测
- 例如:Snort
- 将2464个签名中的1037个用于检测与web相关的攻击
- 难以持续更新
- 内部开发的应用程序会带来挑战
- 无法检测未知的攻击
- 基于异常的检测
- 适用于自定义开发的 web 应用程序
- 支持新攻击检测
论文目标与贡献
- 基于无监督学习的异常检测
- 在主机上部署
- 大量不同的模型
- 针对特定类型的应用
数据样本
数据集 |
时间间隔 |
大小 (MByte) |
HTTP 请求数 |
程序 |
程序请求数 |
属性 |
Google |
1 h |
236 |
640,506 |
3 |
490,704 |
1,611,254 |
UCSB |
297 days |
1001 |
9,951,174 |
2 |
4617 |
7993 |
TU Vienna |
80 days |
251 |
2,061,396 |
8 |
713,500 |
765,399 |
数据模型

- 一个 URI 的有序集 U={u1,u2,...,um}
- 从成功的GET请求中提取
- 200≤return-code<300
- ui 包括
- 请求资源的路径:pathi
- 可选路径信息:pinfoi
- 可选查询字符串:q
- 跟随在
?
后面
- 将参数传递给查询资源
- 属性和值:q=(a1,v1),(a2,v2),...,(an,vn)
- A,所有属性的集合,ai 属于 A
- vi,字符串
- Sq={a1=v1,a2=v2,...,an=vn}
- 没有请求字符串的 URI 不包含在 U 中
- Ur:给定资源路径 r 的 U 的子集
- 分割 U
- 对每一个 Ur 都独立进行异常检测
检测模型
- 一个查询对应各个模型
- 对单一恶意属性发出警报是必要的谨慎
- 训练模式
- 为每个服务器端的程序,及其每个属性建立模型
- 设定适合的阈值
- 存储最高的异常分数
- 默认阈值:比训练模式中的最大异常分数大 10%
- 检测模式
- 任务:输出正常的概率 p
- 异常分数,∑m∈Modelswm(1−pm)
- 设定相关权重 w
- 本文中默认 value=1
属性长度
用户
攻击者
- 缓冲区溢出攻击:shell code 和 padding
- XSS
训练
- 估计训练数据长度的均值 μ 和方差 σ2
检测
- 长度大于均值的字符串
- If length<mean, p=1
- 使得 padding 失效
- 切比雪夫不等式是弱上界
- 仅用于标记重要的异常值
属性字符分布
- 字符分布:相对频率排序
- 丢失单个字符与相对频率的关系
passwd
:0.33, 0.17, 0.17, 0.17, 0.17, 0, ..., 0
- 与
aabcde
一样
- 在人类可读的令牌频率平滑下降
- 在恶意输入中快速下降
用户
攻击者
- 重复的填充字符使得频率快速下降
- 例子
- 缓冲区溢出:需要发送二进制数据和填充字符
- 文件目录遍历:属性中会有许多
.
训练
- 存储每个观测到的属性的字符分布
- 计算所有字符属性分布的平均值
检测
- Pearson χ2-test 的变体
- Bins:{[0],[1,3],[4,6],[7,11],[12,15],[16,255]}
- 对每一个查询属性
- 计算字符分布
- 观测频率 Oi :由 bins 聚集
- 期望频率 Ei :训练属性字符分布的长度
- 计算:χ2=∑i=0i<6Ei(Oi−Ei)2
- 读取对应概率
结构推测
用户
攻击者
- Exploit 需要不同的参数结构
- Exploit 的浅显特征
- 逃避检测
训练
- 看似合理
- 在丢失太多结构信息前停止
- 目标:找到一个模型(NFA)能给予训练样本最大的可能性
- 马尔科夫模型/非确定有限自动机(NFA)
- “合理的概括”
- Ps(o):在状态 S 时,输出 o 的概率
- P(t):转移 t 的概率
- 输出:从开始到终止的路径
- 贝叶斯模型归纳
- P(model∣training_data)=p(training_data)p(training_data∣model)∗p(model)
- P(training_data) 比例系数,被忽略
- P(model):优先选择小模型
- 所有状态总数:N
- 状态 S 的所有转移数:T(S)
- 状态 S 的所有输出数:E(S)
- 从一个完全反映输入数据的模型开始
- 逐渐合并状态
- 直到后验概率不增加
- 计算复杂度:O((n∗L)3) ,输入字符串 n,最大长度 L
- 最多有 n∗L 个状态
- 每次合并 2(n∗L)(n∗L−1) 次比较
- 最多 n∗(L−1) 次合并
- 优化
- Viterbi 路径近似值
- 路径前缀压缩
- 复杂度: O(n∗L2)
检测
- 首选项:计算查询属性的概率
- 要求:所有概率相加为 1
- 所有单词的概率都很小
- 输出:
- 如果单词是马尔科夫模型的有效输出 p=1
- 否则 p=0
令牌查找器
用户
- 对于某些特定的属性,Web 应用常常要请求一个或多个可能的值
攻击者
训练
- 参数是可枚举的或随机的变量
- 不同的参数样本数量与总体样本数量成比例增长时,视为随机变量
- 不存在上述的增长,视为枚举值
- 计算 f 和 g 之间的相关性 ρ
- f(x)=x
- g(x), g,类似于枚举计数器
- g(x)=g(x−1)+1,当 xth 是新值时
- g(x)=g(x−1)−1,当 xth 存在时
- g(x)=0,当 x=0
- Corr=√Var(f)Var(g)Covar(f,g)
- 如果 Corr<0,为枚举值
- 如果是枚举值,储存所有数值用于检测阶段
检测
- 如果是枚举值,则期望变量值落在存储的数值中
- 相应的输出 p=1 或 p=0
- 使用哈希表,提高查找效率
- 如果是随机变量,p=1
属性是否缺失
用户
- URI通常不是由用户直接生成的,而是由脚本,表单,客户端程序生成
攻击者
- 手动攻击通常会打破这种规律
- 不完整或格式错误的请求来探测/exploit Web 应用
训练
- 根据属性可接受数据的子集创建一个模型
- 记录每一个不同的集合 Sq
检测
- 在哈希表中查找属性集
- 返回相应的 p=1 或 p=0
属性次序
用户
- 相同的参数在相同的次序
- 即使一些属性被省略,依旧能表现出有序的程序逻辑
攻击者
训练
- 属性 as 在 at 之前
- as, at 至少出现在一个查询中
- 当他们同时出现时,as 先于 at 出现
- 有向图 G
- 顶点 vi 对应属性 ai
- 对于每个训练查询,在有序属性对对应的节点之间添加边
- 找出这个图的所有强连通分量(strongly connected component,SCC)
- 移除强联通分量中的边
- 对于每一个点,找到可以到达的点
- 把对应的次序对 (as,at) 添加到次序集 O 中
- Tarjan's 算法,O(v+e)
检测
- 找到所有违规的次序
- 相应的返回 p=0 或 p=1
访问频率
- 不同的服务器端 Web 应用,访问频率不同
- 两种频率类型
用户
攻击者
- 访问频率突然增加
- 探测
- 猜测参数值
- 逃避手段:放慢攻击速度
训练
- 划分训练时间为固定时间间隔(例如,10秒)
- 按区间统计访问次数
- 得出总体和分用户的统计分布
检测
- 分总体\用户计算切比雪夫概率
- 返回这两个概率的平均值
请求间延迟
用户
攻击者
训练
检测
- Pearson χ2-test
调用次序
用户
攻击者
训练
检测
- 依照 NFA 的结果,返回 p=1 或 p=0
局限
参考资料
- A multi-model approach to the detection of web-based attacks, 2005
- CS 259D Lecture 8