CCS 2019
弗吉尼亚大学
本文介绍一种名为MalMax的系统,用于检测常常采用复杂多态逃避运行时代码生成技术的web-server端恶意软件。即MalMax遇到多个可能执行路径的执行点时(例如通过谓词/动态代码),它通过对代码在隔离执行环境中进行对比执行来探索这些路径,且在一个执行上下文中未解决的成分可以用其他执行上下文来具体化,这种合作极大地扩展了对比执行的范围。wordpress中的代码覆盖率增加63%
作者使用一个大型数据集(来源工业界),进行了广泛的评估。通过将恶意软件的检测能力与VT中的AV引擎进行对比,评估了MalMax的有效性。结果显示,其在揭示复杂多态malware的恶意行为方面非常有效。
web-based malware(包括服务端和客户端)一直是互联网用户的头号安全威胁,与客户端恶意软件不同,服务端恶意软件可能造成更严重的后果,例如它们可以在全球范围内持续存在并侵害客户端,此外服务端恶意软件可以被用来构建恶意基础设施,(如僵尸网络)
现有技术难以处理复杂的服务器端恶意软件,许多报告描述了服务端恶意软件的普遍存在;
原因如下:
因此动态application的分析是一个活跃的研究领域
先前的研究主要关注于malware生成的网络流量例如http响应来检测,然而具有逃避性的恶意软件会避免检测,因为他们只会随机触发恶意行为,或只针对部分客户端触发,近年来出现ml模型因为加密、混淆和重构技术,难以足够精准识别;
本文介绍了一种名为MalMax的新型系统,用于准确检测高度复杂的基于PHP的服务器端恶意软件。选择PHP恶意软件,因为它是Web服务器恶意软件最普遍的形式,全球超过79%的Web服务器使用PHP。MalMax可以对Web应用程序中常用的动态代码等进行准确分析。MalMax通过对照执行和合作隔离执行的组合方式,系统地揭示目标程序的多个方面,包括隐藏的恶意行为。对照执行是一种技术,即使分支条件不满足,也会强制执行分支(第3.1节),而合作式隔离执行在隔离的执行路径之间共享全局范围的成分(例如全局变量),以促进代码发现(第3.2节)。MalMax优于现有的恶意软件检测技术。
与该领域的其他研究相比,本研究的范围明确如下:
php恶意软件是最常见的web-server恶意软件,通常用于感染web服务器。web服务器上的恶意软件无法自己运行,或在特定的时间和条件下运行,它需要干预,要么通过用户浏览触发,有么通过攻击者手动触发。
与客户端恶意软件不同,Web服务器恶意软件有时会利用攻击者提供的值来隐藏其恶意逻辑。例如,恶意软件可能检查攻击者提供的输入,并且只有在输入满足某些条件时才展示任何恶意行为。
由于PHP是一种高度动态的语言,因此在不知道触发条件的情况下分析和检测此类逃避性恶意软件是具有挑战性的(例如,恶意软件需要硬编码的密码才能显露自己)。
此外,Web服务器恶意软件,特别是PHP恶意软件,通常被注入到良性的PHP程序文件中。由于很难区分注入的恶意代码和良性应用程序,针对这些恶意软件的分析技术必须能够处理复杂的良性程序。本研究的重点是发现和检测此类恶意软件。
Web服务器恶意软件可以由攻击者手动释放,也可以在攻击后由自动化的攻击者(即脚本)注入到网站中。Web应用程序可能存在漏洞,当利用这些漏洞时,攻击者可以获得访问服务器的权限,并通过上传恶意软件来建立立足点。恶意软件可以是一个独立的文件,位于不引起怀疑的区域(例如临时文件夹、缓存文件夹、上传文件夹或库文件夹),也可以并入服务器上的Web应用程序的关键文件中。后者使得检测恶意软件更加困难,因为必须启动和执行Web应用程序,并且执行必须到达恶意软件代码,从而激活它。
根据其行为和最终目的,我们将Web服务器恶意软件分为几个类别:
1)Webshell:Webshell是最常见的Web服务器恶意软件类型。它通过Web界面提供类似于SSH的访问方式,可以简单地通过输入命令来执行操作,也可以包含用户界面列出文件和系统配置等功能。
2)后门:后门使攻击者可以通过HTTP或网络套接字在受害机器上执行任意系统或PHP功能。
3)Flooder:Flooders在收到攻击者指令后向指定的机器发送突发网络数据包。它们用于进行拒绝服务(DoS)或分布式拒绝服务(DDoS)攻击。
4)Spammer:Spammers感染其他电子邮件服务器信任的服务器(例如使用新的IP地址的新服务器),用于发送欺骗/垃圾邮件。
5)Bruteforcer:Bruteforcer使用暴力破解方法(例如尝试不同的密码)来获取对Internet或本地网络服务的访问权限。一旦成功猜测到凭证,攻击者将使用该立足点进行进一步的攻击。
6)Bypasser:Bypasser试图绕过本地或远程的安全预防措施。例如,通过符号链接绕过chroot、绕过PHP/Apache安全模块、防火墙和IDS等。网络代理
7)Defacer/Uploader:Defacers和uploaders用于将攻击者内容上传到Web服务器。攻击者使用它们留下明显的痕迹来声称对入侵事件负责。任意文件写
不止这些类别,可以新加类别如下:信息窃取
MalMax系统地探索目标程序的多个方面,以揭示潜在的恶意执行路径。具体而言,MalMax采用反事实执行的方法,这是一种多路径探索方法,结合合作状态隔离,可以在隔离的执行之间共享重要的元素,以便于发现更多用于发现恶意行为的代码。反事实执行使发现动态分析中无法访问的代码部分[60],它强制执行分支,即使分支条件未满足,通过退出节点,进入通常不执行的代码片段。这种反事实执行依赖于状态隔离,以跟踪在探索反事实路径时对执行状态所做的更改,并支持对状态更改进行精细控制(例如,反转和回退)。
此功能使能够展开、解码和显示模糊和编码文件的原始代码,同时在执行过程中维持有效的状态,从而最大程度地减少假阳性和假阴性。
反事实执行处理动态构造,例如eval(),include()和动态函数调用,每个构造可能导致新代码片段的发现和新路径的生成。它递归地分析动态生成的代码,直到无法发现任何新的唯一代码(即达到一个固定点)。
如下图所示,显示了一个简单动态分析和提议的反事实执行的跟踪(即执行的源代码行号)。动态分析仅覆盖了2行,因为第1行缺少输入。反事实执行通过在谓词或终止事件(即退出表达式)上创建新的隔离状态来处理此问题。
insight:反事实执行强制执行分支,即使分支条件未满足,通过退出节点,并进入通常不执行的代码片段,从而递归地发现动态生成的代码,直到我们全面地覆盖它们。通过这种方式,MalMax有效地揭示了复杂恶意软件中隐藏的恶意代码。
控制流修剪:php恶意软件中包含有意的设置长时间运行的循环,以延迟恶意行为的执行,这会使基于动态分析的恶意软件分析器在一定时间内中止分析,因此会被绕过,处理此类恶意软件的简单方法是限制循环迭代的次数,如果php malware的执行取决于循环迭代的次数和循环内的特定路径,则在限制循环迭代次数时,执行可能不会显示恶意行为。例如解码的加密密钥实在循环内的特定路径上计算的,那么就应该足够迭代该循环,并覆盖特定路径。
作者提出控制流修剪技术,具体而言,当由于循环中缺少计算而导致恶意行为未被揭示时,MalMax首先执行循环,直到循环计数达到预定义的阈值(本文中为100),同时测量每个执行路径的执行次数。当观察到某个特定路径比其他路径更频繁地执行,从而阻止了其他执行路径的探索时,我们创建一个新的隔离执行状态,并强制新的执行来探索其他路径。如果新的执行可以发现任何新的执行语句或执行状态(与原始执行路径相比),我们认为循环分析是成功的。
图2-(a)显示了图1-(a)中部分代码(第3-10行)的控制流图。每个节点的标签表示它的行号,边表示控制流。请注意,红色标记的第6行是调用恶意代码的位置。图2-(b)显示了在第4-8行执行100次后的加权控制流图(CFG)。请注意,节点3、4、5和8之间的边是粗边,表示该路径经常执行。具体而言,我们对每个节点之间的边执行计数,每次执行时计数增加。例如,在100次迭代后,每个粗边(例如3和4之间的边)的计数值将为100。当计数值达到预定的阈值(本文中为100)时,我们应用控制流修剪方法。特别是,对于每个具有计数值达到阈值的边的节点,我们检查是否有替代路径(即另一条边)。如果有替代路径且其计数值小于阈值,则执行替代路径。实质上,我们修剪达到阈值的控制流,执行未探索的路径。
运行时阈值调整:
我们观察到某些恶意样本需要更大的阈值才能成功执行恶意行为。为了处理这种情况,MalMax通过将阈值按2的倍数递增来处理。图3-(a)显示了一个示例。该程序有一个循环(第1-5行),在循环内,首先执行do_benign(),它需要超过10秒钟(故意阻碍动态分析),然后更新解密密钥(第4行)。然后,该密钥用于解密恶意代码,并通过eval()函数执行。
图3-(b)展示了使用朴素动态分析的跟踪结果。它迭代了循环1,000次,将耗时较长的代码do_benign()(第2行)执行了1,000次。朴素动态分析需要约2小时46分钟才能到达恶意代码。图3-©展示了使用反事实执行的跟踪结果。它迅速到达了恶意代码(第6行)。然而,由于跳过了循环迭代,解密密钥($key)不正确,导致在eval()函数处执行失败(我们将传递给eval()的无效代码视为失败)。
图3-(d)表示使用阈值100进行控制流修剪的第一次尝试。它循环迭代了100次,然后尝试执行恶意代码。然而,由于解密密钥更新不足,执行失败。
然后,MalMax将阈值按2的倍数递增。图3-(e)是第二次尝试的跟踪结果,更新后的阈值为200。在200次迭代后,成功执行了恶意代码。请注意,密钥仅在前200次迭代中更新。我们的评估结果显示,绝大多数恶意软件在默认阈值100下会暴露其恶意行为。只有少数样本会触发运行时阈值调整算法,将修剪阈值提高到800。我们通过观察在不同默认阈值下的分析结果来手动验证运行时调整是否足够。具体而言,我们运行了7种不同阈值的实验:100、200、400、800、1,600、3,200和无限制。实验结果表明,800以上的阈值没有发现任何新的动态代码,这表明运行时阈值调整能够在不需要手动干预的情况下发现动态代码。
insight:控制流修剪(CFT)确保分析在合理的时间内完成,首先将循环限制在100次迭代以内,然后按2的倍数增加阈值,直到执行不再观察到任何失败的语句(例如,eval()使用包含无效代码的字符串)。通过动态调整阈值,MalMax可以有效且高效地发现恶意代码。
alMax提供了一个合作隔离的执行环境,用于(1)隔离程序的每个执行路径,和(2)合作地共享在每个隔离执行中解决的资源,以帮助发现动态加载的代码片段(例如通过include加载)。这些隔离的执行是嵌套的,对于程序中每个动态生成的部分,都会创建新的隔离。每个执行都是隔离的,以防止一个执行中的状态变化/错误意外影响其他执行。然而,它们也是合作的,以帮助发现更多的执行上下文(例如数据库连接、配置变量、函数/类定义等),这些可以导致暴露恶意行为(例如,恶意代码位于动态加载的外部模块中)。这种合作使我们能够发现更多的应用程序代码。
具体而言,如果没有合作隔离方案,MalMax仅能覆盖WordPress的36,034个语句,而通过合作隔离,MalMax可以覆盖58,786个语句(详情见附录B)。
合作隔离的作用是共享在一个隔离中发现的关于全局范围的工件(例如函数定义、类定义、常量、全局变量、环境变量等)。需要注意的是,动态语言(例如PHP)允许对函数和类进行重新定义。这样共享的洞察力是,PHP应用程序通常会利用全局范围的工件来实现动态加载的插件模块。例如,Joomla使用配置文件来决定加载其核心模块的哪个子集,而WordPress使用数据库值来确定哪些插件在安装中是活动的,并因此需要加载和执行。这些全局范围的工件可能会在程序执行过程中被修改,导致加载和执行额外的模块。具体来说,加载的WordPress插件可以使用自己的配置参数,并加载另一个插件,或重新定义核心函数/类(详情见附录B.1)。值得注意的是,合作隔离不会共享局部范围的工件,比如局部变量。直观地说,局部工件不应该在函数和模块之间共享,而全局工件通常是可以共享的。
Proof of Concept (PoC) 自动恶意软件检测工具:PhpMalScan。
在本节中,我们展示了我们的概念验证恶意软件检测工具PhpMalScan,以比较MalMax提供的恶意软件分析原语与现有最先进的恶意软件检测工具的有效性。选择PHP作为原型的目标语言,因为它被用于79%的所有网站,并且也占所有服务器端恶意软件的71%[66,71]。
需要注意的是,这个工具的目的是展示本节中讨论的概念的有效性和实用性,而不是提出一个恶意软件检测器作为本文的核心贡献。PhpMalScan是建立在MalMax之上的,利用了先进的恶意软件分析功能,比如合作隔离执行和对事实执行。然而,PhpMalScan与MalMax不同,因为它需要对给定的程序是否恶意做出决策。PhpMalScan采用了几种简单直接的启发式方法来做出这个决策。
衡量恶意性。PhpMalScan将PHP函数分为两种不同类型:潜在恶意函数(PMF)和安全函数(SF)。将可以改变系统状态的函数(例如system(),fwrite()和unlink())分类为PMF。将不影响系统状态的函数,例如程序状态内省函数,数据(例如字符串)操作函数(例如正则表达式操作和类型转换)和算术函数分类为SF。
我们为确定代码是否恶意或良性定义了两个度量标准:潜在恶意函数比率(PMFR)和恶意性得分(MS)。PMFR是代码中调用的潜在恶意函数数目除以总调用函数数目。该度量标准的阈值应该设置得很低,但不能接近0,因为良性应用程序也可以调用改变系统状态的函数(即PMF)。恶意性得分(MS)是基于潜在恶意活动的数量和强度计算出来的值。每个函数根据其参数和行为的不同,其恶意性得分在0到2之间。例如,file_get_contents()可以获取URL、文件或标准输入,对应的得分分别为2、0(如果文件在程序目录内)和1。
另一个重要的方面是,网络服务器恶意软件依赖于动态结构来解码和执行恶意代码,有时会嵌套多层编码和动态评估以逃避检测器。恶意性得分(MS)考虑了这些嵌套执行层。每个函数的MS与动态评估嵌套深度乘以10相乘。具体来说,每次代码使用eval()类似的结构时,动态评估嵌套深度增加1。例如,正常代码中对系统函数system()的单次使用将得到恶意性得分1,而在eval中使用将得到恶意性得分10。直观地说,更高的PMFR表明程序包含相对于良性行为的重大恶意行为,这表明程序很可能是恶意的。恶意性得分(MS)则有助于检测手术性恶意软件,即要么将自身注入到良性代码中,要么在执行显著量的良性工作(例如系统检查)之前执行手术性攻击(例如单个shell命令)。需要注意的是,PhpMalScan的度量标准是简单直接定义的,因为这个原型的目的只是展示分析技术在暴露恶意行为方面的有效性,未来的研究可以采用更细粒度的度量标准进行检测。
surgical malware, i.e., malware that eitherinjects itself into a benign code, or malware that does a significantamount of benign work (e.g., system inspection) before performinga surgical attack (e.g., a single shell command).
定义MS和PMFR阈值:PhpMalScan检测一个样本是否为恶意软件,如果MS或PMFR达到预定义的阈值:PMFR为5%,MS为20。这些阈值是通过分析来自一组良性和恶意样本的MS和PMFR获得的。具体来说,我们从已知的恶意软件库[6,44]中选择了509个恶意样本和来自良性Web应用程序[39,46]的良性样本。这两个恶意软件库是野外发现的恶意PHP脚本的独立集合,一共有619个样本(2016年4月至2019年4月),其中有509个样本被VirusTotal报告为恶意样本。
insight:为了评估MalMax提供的恶意软件分析原语与最先进的恶意软件检测工具的有效性,我们构建了PhpMalScan,一个基于MalMax的原型PHP恶意软件检测器。PhpMalScan使用两个度量标准,恶意性得分(MS)和潜在恶意函数比率(PMFR),并通过迭代地分析越来越大的真实数据集子样本,直到达到一个固定点,系统地确定了20(对于MS)和5%(对于PMFR)的阈值。阈值是可重新配置的,而且MalMax的功能不依赖于阈值。
带有ground-truth的数据集分类如下:
真实的良性PHP应用程序(数据集C)。我们选择了四个多样且受欢迎的代表性PHP Web应用程序来评估MalMax的误报率和漏报率:Wordpress、Joomla、phpMyAdmin和CakePHP。Wordpress是一种内容管理系统,是现存最流行的Web应用程序,支持全球一半以上的World Wide Web [10]。Joomla是第二流行的Web应用程序,支持超过1000万个网站[43],是最大且最复杂的PHP应用程序之一(有50万行代码,55个动态脚本功能)。phpMyAdmin是一个使用PHP的MySQL数据库管理Web应用程序[46]。它展示了通过系统级函数更改数据库服务器和系统配置等各种安全敏感行为。CakePHP是一个受欢迎的PHP Web应用程序开发框架[39],涉及各种第三方工具和脚本,使得程序的分析具有挑战性。
用于比较的恶意软件检测工具。我们收集了五种广泛使用的恶意软件检测工具,包括开放和专有工具,作为比较的基准。首先,Linux Malware Detector [57](或maldet)使用MD5和十六进制签名进行恶意软件检测。第二,backdoorMan是用于检测恶意PHP脚本的开源Python工具包[21],它可以解码混淆的PHP代码并识别恶意行为。第三,PHP Malware Finder [48](在我们的数据集中称为phpmaldet)专注于解混淆,然后通过Yara [70]识别恶意软件。第四,ClamAV是一个开源的防病毒软件[20]。第五,我们还使用VirusTotal [1],这是一个在线集成服务,可以通过50多个防病毒系统扫描文件。
还有在线的PHP恶意软件检测和解混淆服务,如unPHP [69]和shellray [49]。但是,我们没有将它们包含在我们的比较中,因为我们在使用它们测试基准时观察到不一致(即非确定性)的结果,并且它们通常会导致许多误报。
对比结果:
恶意软件类型和分布:为了更好地了解由VT检测到的样本,我们根据检测到的名称将它们按类型进行了分类。图7显示了结果。Webshell占了最大比例(40.45%)。第二大比例是混淆(30.80%),其中VT检测到这些样本是因为它们被混淆了。然而,正如在第4.3节中讨论的,实际上良性程序也经常被混淆,从而导致误报。后门和代理恶意软件(例如在系统中潜伏很长时间并传送未来的恶意软件或有效载荷)分别占14.55%和10.86%。其他类型包括垃圾邮件发送器(0.91%)、下载/上传程序(0.78%)、钓鱼网页(0.57%)和打包程序(0.41%)。请注意,良性程序也可以被打包,导致误报。
给出两个VT没有检出的样本