基于Python的异常检测

基于Python的异常检测,python,machine-learning,statistics,intrusion-detection,Python,Machine Learning,Statistics,Intrusion Detection,我为一个网络主机工作,我的工作是查找和清理被黑客入侵的帐户。我找到90%的shells\malware\injections的方法是查找“不合适”的文件。例如,eval(base64\u decode(…),其中“…”是一整串base64'ed文本,通常都不好。当我在文件中搜索关键字符串时,奇怪的文件跳出来 如果这些文件突然出现在我身上,我相信我可以用python构建某种探查器来查找统计上“不合适”的东西,并将它们标记为手动检查。首先,我想我可以比较php文件中包含关键字符串的行的长度(eval

我为一个网络主机工作,我的工作是查找和清理被黑客入侵的帐户。我找到90%的shells\malware\injections的方法是查找“不合适”的文件。例如,
eval(base64\u decode(…)
,其中“
”是一整串base64'ed文本,通常都不好。当我在文件中搜索关键字符串时,奇怪的文件跳出来

如果这些文件突然出现在我身上,我相信我可以用python构建某种探查器来查找统计上“不合适”的东西,并将它们标记为手动检查。首先,我想我可以比较php文件中包含关键字符串的行的长度(
eval
base64_decode
exec
gunzip
gzflate
fwrite
preg\u replace
,等等),并寻找偏离平均值2个标准差的行

线路长度变化很大,我不确定这是否是一个好的统计数据。另一种方法是将加权规则分配给cretin事物(超过或低于阈值的行长度=X点,包含单词upload=Y点),但我不确定我能对分数做什么,也不确定如何对每个属性进行评分。我的统计数据有点生疏


有人能为我指出统计分析的正确方向(指南、教程、库)吗?

这里有一个简单的机器学习方法来解决这个问题,这是我开始解决这个问题并开发基线分类器所要做的:

建立一个脚本语料库,并附加一个标签“good”(标签=0)或“bad”(标签=1),越多越好。尽量确保“坏”脚本占总语料库的合理比例,50-50个好/坏是理想的

开发指示可疑或错误脚本的二进制功能。例如,“eval”的出现,“base64_decode”的出现。尽可能全面,不要害怕包含可能捕获一些“好”脚本的功能。一种帮助实现这一点的方法可能是计算两类脚本中单词的频率计数,并选择在“bad”中突出显示但在“good”中不太突出的单词作为特征

在语料库上运行特征生成器,并使用标签构建特征的二进制矩阵

将语料库分成训练集(80%的例子)和测试集(20%)。使用scikit学习库,使用训练集训练几种不同的分类算法(随机森林、支持向量机、朴素贝叶斯等),并在看不见的测试集上测试它们的性能

希望我有一个合理的分类精度基准。然后,我会考虑改进这些特性、一些无监督的方法(没有标签)和更专业的算法,以获得更好的性能


参考资料方面,Andrew Ng的Coursera机器学习课程(我相信其中包括垃圾邮件分类示例)是一个良好的开端。

这一建议有点过于宽泛,因此非常有用,但您可能希望尝试贝叶斯方法。建立一个“好”代码和一个“坏”代码的语料库,并建立或使用一个分类器(您可能直接使用各种垃圾邮件过滤器之一)来预测一段新代码是否更可能是“好”或“坏”语料库的成员。谷歌用于贝叶斯学习、垃圾邮件过滤等。我希望你可以直接使用垃圾邮件过滤项目来完成这项工作,而不是从头开始写东西。@Joe,Josh——如果你选择贝叶斯方法,我过去曾用Revered成功地解决过类似问题。如果数据集正确,很容易得到合理的结果。