使用Python进行异常检测

15 投票
1 回答
3904 浏览
提问于 2025-04-16 22:37

我在一家网络托管公司工作,主要负责查找和清理被黑客攻击的账户。我发现大约90%的恶意代码、木马和注入攻击的方法,就是寻找那些“看起来不太对劲”的文件。比如,像eval(base64_decode(.......))这样的代码,其中的"....."通常是一大堆经过base64编码的文本,这种情况一般都不太好。通过搜索一些关键字,我能很快发现那些奇怪的文件。

如果我能作为人类快速识别这些文件,那么我相信我可以用Python编写一个程序,统计分析那些“看起来不太对劲”的东西,并标记出来,方便人工审核。最开始,我想通过比较包含关键字的PHP文件中每行的长度(比如evalbase64_decodeexecgunzipgzinflatefwritepreg_replace等)来寻找那些偏离平均值超过两个标准差的行。

不过,行长度差异很大,我不太确定这个统计方法是否合适。另一种方法是给某些特征分配权重规则(比如,行长度超过或低于某个阈值得X分,包含“upload”这个词得Y分),但我不太清楚这些分数能用来做什么,或者如何给每个特征打分。我的统计知识有点生疏。

有没有人能给我一些方向,比如相关的指南、教程或库,帮助我进行统计分析?

1 个回答

5

这里有一个简单的机器学习方法来解决这个问题,这也是我开始处理这个问题并建立一个基础分类器的步骤:

首先,收集一些脚本,并给它们贴上标签,要么是“好”(标签=0),要么是“坏”(标签=1),数量越多越好。尽量确保“坏”脚本在总数中占有合理的比例,理想情况下是好坏各占一半。

接下来,开发一些二进制特征来表示可疑或坏的脚本。比如,看看脚本中是否有“eval”或者“base64_decode”。尽量全面,不要害怕包括一些可能也会出现在“好”脚本中的特征。一个方法是计算这两类脚本中单词的出现频率,选择那些在“坏”脚本中出现频繁但在“好”脚本中出现较少的单词作为特征。

然后,使用这些特征生成器对收集的脚本进行处理,建立一个带有标签的二进制特征矩阵。

接着,把这些脚本分成训练集(80%的样本)和测试集(20%)。使用scikit-learn库,利用训练集训练几种不同的分类算法(比如随机森林、支持向量机、朴素贝叶斯等),然后在未见过的测试集上测试它们的表现。

希望我能得到一个合理的分类准确率作为基准。接下来,我会考虑改进特征,尝试一些无监督的方法(没有标签的)和更专业的算法,以获得更好的表现。

至于学习资源,Andrew Ng在Coursera上的机器学习课程(我相信里面有垃圾邮件分类的例子)是一个很好的起点。

撰写回答