最近看了一本《Machine Learning and Security》的翻译版,原书应该是安全数据科学领域一本比较不错的而且较为基础的书,奈何翻译的太差而且本人水平有限,对书中的许多内容了解的不多,而且书中的代码部分并没有自己亲自实现,只是选取了安全领域的异常检测、恶意软件分析和网络流量分析三个部分做了笔记。希望在学习一段时间之后,能够对之前不了解的内容有所掌握,并且实现一下书中的实战部分。另外如果再读此书的话,一定要读英文版。
1 异常检测
(1)AI for security分为两类:模式识别和异常检测
- 模式识别:发现数据中的特性,将其提炼成特征集
- 异常检测:建立一个描述正常状态的特征,所有偏离该状态的情况都被视为异常
(2)shell命令可以形成一个时间序列,因此可以从时间序列分析的角度进行异常检测
(3)主机入侵检测
- 工具框架:osquery(收集低层级OS Metics,可以使用基于SQL的接口进行查询)、Linux auditd
- 可以利用第三方工具将上述两种工具集成到自动化业务流程框架中,如:Chef、Puppet、 Ansible、SaltStack、Kolide、doorman
- Indicator Of Compromise
(4)网络入侵检测
- 流量分析工具:tcpdump、Bro、Snort
- 检测单位是流量
- 提取网络流量元数据
- 基于状态数据包检测(stateful packet inspection,SPI)
- 工作在3、4层
- 检查数据包的头尾而不触及数据包上下文
- 保持先前收到的数据包的状态、从而能够将新接收到的数据包与先前的相关联
- 检查网络流量内容
- 深度包检测(Deep packet inspection、DPI)
- 工作在应用层
- Bro(可以检测HTTP请求POST的字符串,从而可以检测SQL注入和XSS)
- 如果要在使用了TLS/SSL加密的环境中进行检测,只能在监测点取消加密
(5)Web应用程序入侵检测
- 标准Web服务器以NCSA通用日志格式来生成日志
(6)异常检测方法——预测(监督学习)
- 适用于一维实值度量序列
- 思想:将预测与观测之间的偏差视为异常
- ARIMA (autoregressive integrated moving average,自回归积分移动平均模型),通过使用正常的数据集,由序列与以前时间点自身之间的相关性(autocorrelation,自相关),来预测接下来的时间段内的状态。在预测相对准确的情况下(预测结果与实际观测到的非异常状态拟合度较高),如果观测值与预测结果之间的差值超过了某个threshold,则认为发生了异常。
- 人工神经网络(Particularly,长短期记忆网络(long short-term memory,LSTM))
- 注意:预测适合novelty detection(训练集中不包含异常数据),而不适合outlier detection(离群点检测,训练集中包含异常数据)。即适合训练集中没有异常数据,如果训练集包含异常数据的话,容易造成在训练过程中对预测数据的过拟合,从而使观测到的异常状态与预测值之间的差值变小,异常检测效果下降。
(7)统计度量
- 绝对中位差(median absolute deviation,MAD):去查找一群数据中的离群值,表示为数列中位数的绝对偏差的中位数
import numpy as np
import numpy as np |
- Grubbs的离群值检测
- Goodness-of-fit——椭圆包络拟合(Elliptic envelope itting (covariance estimate itting))
(8)异常检测方法——无监督学习
- 单类支持向量机
- 孤立森林
- 随机森林非常适合高维数据的异常检测,适合时间序列数据的实时异常检测
- 思想:异常数据和正常数据相比,可以用较少的次数将其与正常数据分隔开
- K均值
(9)异常检测方法——基于密度的方法
- KNN
- 局部离群因子(Local outlier factor,LOF)
(10)入侵检测面临的问题
- 错误代价高
- 语义鸿沟
- 可解释性
2 恶意软件分析
(1)恶意软件类别划分依据:family
(2)可以用静态签名匹配来判断是否是恶意软件
(3)使用机器学习进行恶意软件分类的优势
- 模糊匹配:给出了两个实体之间的相似程度,而不是简单的yes or no
- 自动特征加权和选择
- 适应性:适应不断变化的输入,跟踪恶意软件的进化
(4)使用机器学习进行恶意软件分类的挑战:特征工程
(5)二进制可执行文件的特征生成:
- 静态方法:
- 结构分析:查看程序的文件构成
- 静态分析:查看程序的代码
- 动态分析:运行程序分析(沙箱)
- 调试
- 动态插桩:通过挂钩正在运行的进程,并将自定义逻辑注入到应用程序中,从而修改应用程序或环境的运行时行为
可用做特征的指标:
(6)程序请求权限
- 系统调用
- 操作码n-gram(一个包含其它特征的序列)
- 网络行为
- logcat
(7)特征选择:
- 单变量分析:迭代地对每个单独特征进行分析,在只考虑该特征的情况下,模型执行会有多好;从而可以得到对特征好坏的评估
- 递归特征消除:从完整的特征集开始,分析特征的排除对模型情况的影响
- 潜在特征值表示:奇异值分解(SVD)、主成分分析(PCA)
- 特定模型中通过特征权重减小或消除某些特征对模型的影响
3 网络流量分析
(1)无监督特征学习:指的是从原始数据自动生成特征,不同于无监督学习
(2)TSL/SSL数据包可以被解密
(3)攻击分为被动攻击和主动攻击
- 被动攻击:不会启动与网络中节点的通信,也不会与网络数据交互或修- 改网络数据;而是进行信息收集和侦察活动。
- 主动攻击
- 漏洞:用过远程服务器发送的命令,可以使用基于机器学习模糊匹配来检测
- 欺骗:DNS欺骗、ARP欺骗
- 横向移动
- 拒绝服务
(4)C&C服务器控制僵尸网络,C&C服务器的体系结构如下:
- 星形/集中式网络
- 多重网络:解决了a中的单点故障、可以缓和物理距离带来的问题
- 分层网络:为了解决指令必须集中发布的问题
- 随机P2P网络:僵尸网络管理员可以向僵尸网络中的任何一个节点发布指令,然后指令在网络中以多点传送的方式进行传播
(4)使用NSLKDD数据金构建网络攻击分类预测模型
- 数据由TCPDump产生有标记的数据集,包含38种攻击类型,只有24种在训练集中出现,攻击属于下面四大类:
- dos:拒绝服务
- r2l:来自远程服务器的未授权的访问
- u2r:提权尝试
- probe:探测性暴力破解攻击
- 我们的任务是设计一个通用的分类器,将数据分为五类:4类攻击+良性
- 类不平衡问题:训练集中属于r2l和u2l的数据占比非常少,因此在测试集中对这两类数据的分类效果极差,由于训练集中benign数据占比最大,因此这两类数据大部分都被预测为benign数据。
- 处理类不平衡的方法:
- 欠采样:在占比较大的数据中进行采样,选取一部分进行使用,而不是用全部的数据集
- 过采样:为占比较少的数据类智能合成数据点
- 流行的做法是先过采样,再欠采样