Web 应用程序中基于异常的恶意软件检测

信息安全 恶意软件 php 反恶意软件 异常检测
2021-08-22 01:38:39

我部分负责大量托管帐户的安全和恶意软件检测(通常)。我们的方法严重依赖 ClamAV 提供的基于签名的检测,我们自己也为此创建了一个相当不错的签名数据库(500 多个样本)。

我们每天会收到多达 30-40 条通知,说明在用户帐户中发现恶意代码。随着时间的流逝,黑客变得更加直观,并且总是设法跟上我们(整个白帽社区)的进展,因为我们试图停止他们利用漏洞的尝试。然而,基于签名的恶意代码检测似乎越来越不够——我们不断发现我们的扫描最初未能检测到的新恶意软件样本。因此,我冒昧地尝试并设计了一个严格的异常检测系统。

我正在征求意见,我目前的计划是否可以被认为是合理的,因为这是我第一次承担这样的任务。

我认为我检查文件的条件越多,我可以获得更好的结果(尽可能消除误报)。到目前为止,我已经创建了以下条件列表:

  • 文件位置(5%)
  • 文件名(10%)
  • 代码整洁/对齐(5%)
  • 重复模式(5%)
  • 数据结构的奇怪/非逻辑名称(10%)
  • 多种功能的叠加(3%)
  • 错误报告已禁用(5%)
  • 使用错误抑制(2%)
  • 包含十六进制(即 \x73)(3%)

其中每个条件都赋予文件一定比例的潜在恶意或其中包含恶意内容。我的问题是

  1. 这是开发严格的基于异常的检测系统的好/正确的方法吗?如果不是,为什么?
  2. 你能给我举例说明我还可以检查文件吗?任何提示或任何有用的信息?

请考虑:

  1. 它针对 Web 应用程序,主要是 PHP 文件;
  2. 我们的很多客户都使用 CMS。也许将系统建立在某个 CMS 上会更好?

谢谢你。

2个回答

我目前正在网络安全领域进行一些研究,我的主题是日志消息的异常检测。但是,我希望我能够为您的问题提供一些见解。

(1) 签名很丑陋,但它们确实有效。尽管每个人都在谈论异常检测和类似的话题,但如今签名仍然是检测恶意代码/活动/等的最可靠方法。所以你应该继续使用它们,不要指望一些异常检测能够完全取代它。

(2) 签名当然非常有限,它们无法识别新型恶意代码/攻击/等。然后尝试通过异常检测来解决这个问题。异常检测的主要缺点是它总是会产生误报警报,您应该对其进行处理和过滤。当前的趋势是构建一个混合系统:首先应用签名和一些查询,然后执行异常检测。

(3)绝对可以基于一些机器学习技术(根据您的条件列表)为您的问题创建异常检测方法;理论上,也可以分析 PHP 代码,即执行静态代码异常检测,但是这可能是相当复杂/大项目)。但是,我不希望它会捕获所有恶意代码。实际数字可能是 70-80% 的检测率和 10-20% 的误报率。因此,如果您检查 1000 个文件,其中 10 个是恶意文件,可能在最好的情况下,您将能够开发一个系统,该系统将返回 100 个警报,其中 10 个恶意文件中的 8 个将被检测到,但其余的(比如说 92其他警报)将是误报。此外,您可能已经通过签名和查询检测到这 8 个中的 6-7 个。

我希望我在这里不要太悲观。有时,对于特定的用例,有可能达到 98-99% 的真阳性率和 1-2% 的假阳性率,但我不确定你的情况是否会有这么大的运气。此外,我对您的用例的了解不够详细,无法做出任何预测。

(4) 但是,如果您能够对结果进行排名,那么异常检测输出的顶部将包含更多的真阳性和更少的假阳性警报。例如,如果您的系统将返回 100 个排名警报,那么您只能查看其中的前 30 个。这 30 个将包含 6 个真阳性结果,只有 24 个假阳性(这在某种程度上优于 8 个真阳性和 92 个假阳性)。接下来,如果您查看 5 个排名最高的警报,它们可能包含 1-2 个真阳性和 3-4 个假阳性。除了基于签名的检测结果外,这也是您每天可以检查的内容。

如果您有足够的技能,您可以聘请数据挖掘/机器学习专家为您构建这样的系统,或者尝试自己做。

我没有找到太多相关的研究论文(这不是一个好兆头),但我希望以下内容可以对您相对有用:

最后,应该有一些替代解决方案来解决这个问题。我已经用谷歌搜索了它,这是我迄今为止发现的:

也不多(只有一个链接),但希望大家多多尝试搜索,应该有沙盒之类的技术。也许您可以查看此 pdf以获取相关信息。

这并不意味着您的问题的完整答案,但它比评论中的内容要长,所以这里是:

我认为这是一种有趣的方法,只要您知道它显然永远无法捕获所有恶意软件,因为无论您设置哪种标准,它们都可以解决。

例如,最后一个“包含十六进制”可以通过将十六进制值指定为十进制数数组或 base64 编码字符串来轻松解决,并且可以通过运行通过 xxxtidy 文件,其中 xxx 代表您最喜欢的编程语言版本的代码整理器。

我也不确定您打算如何检测“数据结构的奇怪、非逻辑名称”。这对我来说似乎是一个不可能的问题。而且我不确定“多种功能的堆叠”是什么意思;如果我理解正确,那会产生大量误报。

尽管如此,我觉得这种方法很有趣的原因是因为即使它永远不会完美,它可能有助于检测可疑程序,就像 jslint、pylint 等有助于发现常规代码中的问题一样。

如果您知道您正在处理的编程语言,您还可以检查可疑调用,例如尝试启动系统 shell 的调用、尝试打开网络套接字的调用、重定向输入或输出、调用 eval、调用打开外部文件进行读取或写入等。

执行

这就是我认为你会遇到困难的地方,至少如果你的想法是基于扫描单个 php 文件。我不想编写能够可靠地检测所有提到的标准的解析器。听起来工作量很大。

选择

在 php 文件中查找特定代码模式的替代方法可能是查找正在执行的此类代码模式的特定后果。例如,如果您正在寻找尝试打开网络套接字的代码,这可能很难检测到,但定期运行 nmap 或 netstat 并检查不应该打开的端口很容易。检查写入外部文件的代码很困难,但构建一个列表,例如,/tmp 下的所有可执行文件,或 /usr/local/bin 下具有最近时间戳的文件,很容易。您还可以查找活动的 root shell 进程,等等。

现有技术

有各种程序已经完成了其中的一部分。例如,Linux 下的 rkhunter 会查找您的文件系统的可疑更改,tripwire 和 snort 将是另外两个要检查的解决方案。

一个快速的谷歌搜索会话也出现了https://github.com/nbs-system/php-malware-finderhttps://www.decalage.info/python/balbuzard,这两个似乎都完全符合你的建议.