基于污点分析的WebShell 检测研究

2022-07-11 01:17李娜
电子技术与软件工程 2022年7期
关键词:污点静态加密

李娜

(国家计算机网络与信息安全管理中心宁夏分中心 宁夏回族自治区银川市 750001)

1 引言

互联网的高速发展带来信息化的快速推进,随着《“十四五”数字经济发展规划》、《要素市场化配置综合改革试点总体方案》等国家指导文件正式发布,“东数西算”工程全面启动,我国正式步入数字经济发展时代,数据已成为核心生产要素,越来越多的信息数据实现了网络化,Web服务充斥于我们的生活中,随之而来的针对Web 服务的攻击也越来越多,其中最为著名的有Webshell。Webshell 凭借其灵活多变和强隐秘性成为备受黑客青睐的攻击后门之一,植入成功后攻击者可以随时通过被利用的Web 应用漏洞或“上传到其他受感染的系统”来启动,这就等于为攻击者在Web 服务提供了一个永久后门,可以随时注入恶意代码实现破坏用户程序、窃取用户敏感信息等操作,危害极大,因此Webshell 查杀历来都是Web 服务安全防护的重要领域之一。

当前应用Webshell 检测方法大多是基于规则匹配代码做检测,这样会存在大量误报和漏报,需要增加大量的人工干预来提升Webshell 检出效果,且不具备对未知Webshell 变种的检测能力。最近几年来,不少Webshell 检测研究都在尝试利用机器学习提高Webshell 检测效果,但机器学习模型训练耗时巨大且严重依赖样本的丰富度,而优质的Webshell正负样本很难采集到导致现有的模型检出Webshell 的准确率不高。

针对上述问题,本文结合现有的检测技术的同时提出一种基于污点分析的Webshell 检测方法,即在传统Webshell检测方法之上引入基于污点分析技术,全程跟踪数据处理过程并且记录整个数据处理过程中的所有流向信息,即通过标记污点数据、跟踪污点传播过程、污点检测实现Webshell攻击检测,进而提高Webshell 检测效果。

2 Webshell检测概述

2.1 Webshell定义

Webshell 是一种恶意后门,主要以jsp、asp 和其它Scripting language等网页文件形式存在于网站的运行环境中。攻击者在入侵网站之后利用Webshell 工具将其注入到网站的服务器中,为了使网站使用及维护人员无法发现,通常将Webshell 工具存储在网站服务器目录下,放置于正常的网页文件中,从而实现利用Web 服务访问该Webshell 文件,窃取用户数据、执行系统命令等操作,达到控制服务器的目的。目前应用最为广泛的Webshell 后门包括蚊剑、冰蝎、哥斯拉等,其中冰蝎、哥斯拉此类的Webshell 后门通信中流量使用随机填充字符后通过AES 等加密方式进行传输,这种加密流量的传输方式使得在通信过程中检测Webshell 异常困难。

2.2 传统Webshell检测方法

主流的Webshell 检测方法目前主要有三种:

(1)静态检测,可细分为正则、ssdeep 等方式,是通过匹配特征码和危险函数来检车识别Webshell,也可结合语法解析,剥离代码、注释、分析变量以及函数字符串等,缺点是因查Webshell 时不涉及函数执行时的动态行为,会带来一定的误报;

(2)基于行为的动态检测,类似沙箱方式,是对payload 的行为分析检测,重点监测Webshell 的访问路径、主机异常行为,访问特征(如IP、cookie)等;

(3)基于日志分析的检测,主要利用日志分析访问特征(如访问页面是否是孤立,日志中是否含有payload,页面访问次数等)并进行识别。

其中基于行为的动态检测和基于日志分析的检测方法,会在检测过程中产生大量的实时记录大幅度影响服务器性能,且只能在攻击者实施攻击后检出异常,因此基于源码的静态查杀相对使用更广泛。

2.2.1 基于源码的静态检测

基于源码的静态检测主要有基于正则、ssdeep、机器学习、统计学和基于语法分析这五种检测方法。其中基于正则的Webshell 检测,是对已经人为定义好的Webshell 关键特征进行扫描,匹配其脚本文件中的特征码字符串,如高危函数eval、system 等,从而判断文件是否为Webshell;基于ssdeep 的Webshell 检测,是一种基于模糊哈希算法的工具,通过文件的相似性比较发现其与源文件的相似关系。需要先获取已知Webshell 样本的ssdeep 哈希值然后设置相似度范围识别同一系列的变形shell;基于统计学的Webshell 检测,通过统计分析大量已知Webshell 表现出来的特殊统计特征,来综合判断当前脚本是否为Webshell;基于机器学习的Weshell 检测,通过对大量被披露出的Webshell 正负样本数据学习模拟建立Webshell 检测模型,这种检测模型还需要安全领域的技术人员通过以往积累的知识经验加以辅助。

2.2.2 基于行为的动态检测

基于行为的动态检测又称为沙箱检测,是指Webshell 在运行过程中进行的一种检测方式,通过监测其在运行过程中的状态,对比运行过程中执行的系统命令、产生的流量等内容综合判断是否存在异常情况,一般来说,Webshell 为了躲避静态特征的检测会提前将其加密,但攻击者如若想控制数据库和系统,就需要远程运行Webshell 工具,这时只要监测到系统存在异常调用的情况,就可以检测出Webshell,拦截攻击者对系统下达的命令,保障正常网页文件的安全性。

2.2.3 基于日志分析的检测

基于日志分析的检测,是指通过对服务器日志记录进行提取、分解、过滤、删除和合并进行分析,尤其是访问、操作数据等记录,网站系统被植入Webshell 脚本工具后,利用算法通过对日志分析判断是否为正常行为或者Webshell行为,常用的算法如K 近邻算法。

2.3 传统Webshell检测方法优劣分析

Webshell 具有多变性、复杂性、隐秘性的特点,任何一种检测方法都无法实现Webshell 全类型的检测覆盖,经过调研分析,所有传统Webshell 检测方法都各有所长,优劣分析对比如表1 所示。

表1:

3 基于污点分析的Webshell检测实践方案

3.1 污点分析基本概念与定义

污点分析是对数据流进行分析的技术,工作原理主要是追踪所有数据处理相关操作,并记录数据全程的流向情况从而寻找源数据与对象数据之间的依存关系。污点分析一般包括以下几个环节,其一对污点数据进行标识,其二是传递污点属性,其三对污点进行检测。一般来讲,整个污点传播的过程主要分为以下两个步骤:第一步,将数据标记为污点之前,需得判断外源数据是否值得信任;第二步,算术、逻辑等运算扩散被标记的源污点数据,通过运算得到的新结果数据依赖源数据,这样通常认定其不可信,即依旧将其被标记为污点。污点检测一般是检测脚本程序中包含的变量是否具备污点,在分析过程中根据应用状态分为存在两种:一种是需要使脚本程序处于运行状态,被称为动态污点分析;另一种是静止状态,被称为静态污点分析。

3.1.1 静态污点分析

静态污点分析的对象是程序代码或中间表示(Intermediate Representation,IR),此过程中既不运行目标程序也无需修改代码,通过分析非运行状态下目标程序的数据、控制依存关系,确定其从源传播到汇聚点的整个过程。对数据依赖进行分析时,主要分析程序特性函数间内的污点传播,包括调用、赋值等依赖关系;对控制依赖进行分析时,一般是选用递归的算法:对基本块进行A 分析,然后对后续基本块B 和C 进行识别并增加到控制流程图中,之后重复的对B 和C 进行相同递归分析,直到所有基本块都被识别以及全部添加到控制流程图中。静态污点分析是基于程序源代码或IR 基础,分析程序所有执行路径,污点传播规则清晰容易识别,但是静态污点分析的过程并不运行目标脚本、程序,缺失其运行时的特殊信息,所以从分析结果上看不够精准。

3.1.2 动态污点分析

动态污点分析是通过插桩的方式实时跟踪和监控程序的运行过程,记录跟踪和监控过程中产生的过程数据值,进而确定污点数据从源A 传播到汇聚点B 的行为。但频繁的插桩操作会导致占用过多的系统资源,相较于静态污点分析,其执行效率不高并且无法覆盖到所有路径,有概率产生漏报。

3.2 基于污点分析的Webshell检测

Webshell 最根本的恶意行为就是任意执行外部命令,而要执行外部命令则不可避免要获取外部数据,因此如果发现脚本中的外界变量通过不断传递,最终进入危险函数,就可准确识别Webshell。结合污点分析在数据流分析中的优势,本文提出一种设计思路,即在传统Webshell 检测方法中引入污点分析技术,综合静态污点分析、动态污点分析和深度还原技术,多管齐下实现Webshell 攻击检测。

3.2.1 整体实现架构

在传统Webshell 检测中,增加动静态污点分析、动态污点分析技术以及深度还原技术,以PHP 样本为例,整体架构图如图1。

图1

PHP 脚本常用$_GET,$_POST 等变量接收http 请求,利用污点分析来检测这类变量传递行为,将外界变量视为污点源,将eval,system 等危险函数视为污点汇聚点,全过程涉及字符串处理、条件分支等操作,这就需要全程跟踪污点传播过程,判断污点变量是否被洗白,最终是否进入污点汇聚点。一旦获取到相关变量后通过不断传递,进入危险函数中执行命令,则判定Webshell。

其中涉及到的静态污点分析技术主要是将各种主流脚本语言进行词法语法分析,将其转换成一种统一的中间标识。得到中间表示后,构建数据依赖图和控制依赖图,并在图上跟踪外界污点变量的传递,如发生使用外部变量且执行高危函数,则判定为Webshell。

动态污点分析技术的加入是为了更好的关注攻击行为的发生,在内部设计了一个安全精巧的虚拟执行解释,可以将Webshell 在安全、稳定的前提下执行并触发恶意行为,同时利用动态污点跟踪技术,对恶意行为进行检测。动态分析会监控样本中读取外界变量并对这些变量做污点标记,监控执行中的各种函数调用和赋值操作,确保这些污点变量如何传递都能被跟踪。最后对eval,system 等高危函数进行拦截,分析其是否使用了污点变量实现WebShell 检测。

除了静态污点分析和动态污点分析以外,为了分辨各种加密后的样本和代码,对于加密混淆流量引入深度还原技术用于部分加密流量的解密还原。首先利用传统脱壳技术,对已知的加密混淆方案进行专项处理实现对常见加密混淆进行“脱壳”,另外还利用虚拟执行器进行虚拟执行,将混淆加密的代码进行动态还原,实现“解密”。针对多次加密的样本还会进行多次解密,深度还原。解密后的明文可用于特征识别和动静分析,可以在提高检出率同时降低部分加密正常样本的误报率。

3.2.2 污点分析模块

上文架构中提到的污点分析模块是整个检测方法的核心部分,其主要通过预先设定好污染源、沉降点和污染传播策略,对代码或程序进行标记、追踪和分析。下面阐述污点分析模块的工作原理及污点分析模块初始化流程图(图2)。

图2

(1)首先定义HashTable 类型符号表sy_tb,将全局变量GS、预定义变量$_C00KIE,_POST_等保存在sy_tb 表中;

(2)在整个污点分析模块初始化过程中,预先对变量结构体中的flag-stu 空闲位进行标识,将保存在sy_tb 表中的值_POST_、$_C00KIE 标记为污染,同步传入关键函数并触发关键函数的安全检查代码FCALLD、ICALL;

(3)劫持FCALLD、ICALL 来Hook 函数调用,获取调用的函数和参数后,利用ZSUOHandle 来hook 代码FCALLD、ICALL 监控敏感函数;

(4)当函数通过上述FCALLD、ICAL 调用时,在函数表中查找指定的函数名,然后返回function 类型的指针;

(5)获取z_function 指针,判断z_function 结构体中的类型,这时分为两种情况,第一种为内部函数,通过z_internal_function.handler 来执行这个函数,第二种为用户自定义的函数,调用z_execute 执行函数中包含的z_op_array,触发”handler”,在自定义函数中编写污点记录及启用污点检查策略。

污点分析的精准性依赖于污染传播策略的制定,污点检查策略的内部的函数其实就是污染在全部过程中的传播,污点检查策略的严格或宽松会导致最终监测结果的差异,如漏报或者误报,人为设定的污染传播策略具有一定局限性,如何在污染传播策略中引入机器学习,继而从大量、随机且不完全、杂乱的污点数据样本中获取需要的信息,进而形成更高效的规则策略机制,是下一步的研究方向。

3.3 效果测试与评估

采用黑盒(不透明)的方式,随机黑箱监测搜集的3285 个样本,对比基于污点分析的WebShell 检测与某商业Webshell 检测引擎在样本集中的检测能力。测试结果如表2所示。另外,两种检测方法同时告警2127 个,占比67.6%;同时漏报83 个,占比2.5%。

表2:

从测试结果分析不难看出,引入污点分析后的WebShell检测方法检出率明显提升,漏报率明显下降,且对于特殊Webshell 具备较高的独报能力,其检出效果要明显优于某商业Webshell 检测引擎。

4 结语

本文针对目前存在的大量webshell 变种无法识别的情况,探索基于污点分析的Welshell 检测方法,即在传统的Webshell 监测手段中引入污点分析技术,通过提出新的设计思路重新构建检测机制,结合静态污点分析、动态污点分析和深度还原技术,多管齐下实现Webshell 的检测。同时也选取了真实环境总的样本数据做测试,相比传统的Webshell检测方法,本文设计的方法给出了较为满意检出结果。接下来将测试更多样本,力求完善优化判定规则、提高检测准确率。

猜你喜欢
污点静态加密
基于代码重写的动态污点分析
最新进展!中老铁路开始静态验收
一种基于熵的混沌加密小波变换水印算法
猜猜他是谁
使用Lightroom污点去除工具清理照片中的瑕疵
认证加密的研究进展
我国“污点证人”刑事责任豁免制度的构建
基于ECC加密的电子商务系统
具7μA静态电流的2A、70V SEPIC/升压型DC/DC转换器
基于格的公钥加密与证书基加密