00:00
呃,各位视频号和腾讯产业互联网学堂的网友大家晚上好,欢迎来到今天的公开课。呃,我们今天要分享的主题是如何采用新的技术手段提升的攻防能力。我们都知道web相比于二进制的病毒,它有很多特点。比方说它体积小,易变形,无需编译,所以它不需要额外的程序就可以在目标系统上运行,进而去执行一些攻击行为,比如说执行系统命令,窃取用户数据或者修改主页等等操作。对于企业的安全人员来说,这是一种易攻难守的攻击方式,可能他的攻击的成本很低,但是你要防御它所要付出的代价是很高的。那么在一些实际的高强度攻防对抗中,很多高级黑客通过将的加密。进行加密来绕过一些检测,所以我们很多传统的检测方案效果会大打折扣。那么在这种情况下面,我们作为安全的防守方,我们有没有什么新的技术手段或者方案可以帮助我们去提升这个web的检出效率啊?今天我们就请到了腾讯安全反病毒实验室的两位高级研究员王和赵忠斌,他们将会做一个主题的分享,结合我们腾讯星T引擎12年来的一些攻防对抗经验和我们的技术优势,跟大家分享一下工具的应对之道。
01:29
呃,今天的分享结束之后呢,我们会有大概十分钟的答疑时间。所以各位网友如果有关于这个话题的任何问题,可以随时在评论区去留言呃,在分享结束之后,我们会请两位老师来解答呃,如果大家也想要做进一步交流的话,也可以扫描我们屏幕右边的二维码,加入我们的交流群。呃,下面呢,我们就把时间留给两位讲师吧,那欢迎赵中斌和王征。哦。
02:01
大家晚上好,这次由我和我的同事赵中斌一起分享一下我们在web攻防对抗中摸索出来的一些实践经验。报告主要由四部分组成,先简单科普一下web shell,然后说明一下传统检测方案的不足,重点在第三部分,详细介绍我们的检测方法,最后会概括一下腾讯云上目前的外部能力。先简单介绍一下什么,它在腾讯上是一个什么水平。Web shell,它本质就是PHPSP脚本语写的纯文本代码,体积小,功能强大,可以直接被服务运行起来。web shell的特征就是执行部命令。无论如何呃无它,无论如何变形,最终都会接收外界参数,用命令执行数运行起来,如PHP的PP的数,Web的很大,一旦web成功上传了,服务器就可以执行任意的黑客命令,完全控制服务器,从而获取用户数据,上传任意文件,进行勒索挖矿,继续向其他服务器横向扩呃传播病毒等等。
03:07
由于she它不像二进制病毒,它不需要编译,可以直接以脚本形式运行,因此它体积小,易变形,可以轻松绕过传统恶意软件的检测方法,黑客入侵云服务器的绝佳武器。Web一般由PHPJJSP等形式,据统计的话,腾讯云上脚本文件中PHP占了70%多,JSP占15%,P占8%,因此PHP的B是我们重点关注的对象。不巧的是,P也是这几种脚本语中最的。首先我们来看一下传统方法检测web的效果如何。传统方法一般有三种,首先是规则特征,它需要投入大量的运营人员去收集样本,添加特征。但因为web不需要编译,不像二进制病毒那样结构固定,黑客可以不断的修改来绕过已有的特征。特征虽然可以拦住90%的脚本小子,但是在面对高强度的攻防中,人为刻意构造的样本它总是可以绕过去的。
04:07
然后又是机器学习在,但是在实际线上环境中,我们发现机器学习的检测效果也差强人意,首先就是它的误报不可控,一旦机器学习出现了误报,就很难精确的关呃就很就很难精确关闭产生误报的功能,从而需要将很多相关的功能一起下线。而且机器学习高度依赖大量标定的样本,但对抗中黑客使用的都是从未开的web she,机器学习没有这方面的大量验知识,他根本无法检测。最后就是依赖云查能力,将可疑样本人为上传,然后人为分析,标定黑白之后的话都可以用MD5进行查询,但这样的话能力滞后了,可能已经开始运行了,过几天然后检测结果才出来,而且攻击者只要把脚本稍作修改,MD5改变以后,云查就会失效。这里再详细展开一下传统规则特征在攻防对抗中的局限性。首先的话是标准的一句话是。
05:05
嗯,PHP的话,它利用函数执行界命令,如果我们需要加特征的话,可以直接用一个正则去判断get是否在一行里就行了。而且和get的先后顺序有要求,这样的话就可以避免一些误报。当然实际的特征肯定不会像这个例子中,呃,肯定要比这个例子要复杂很多。这里的话只是举一个例子,因为就算是特征也要有一定的泛化能力,不然特征只能查一种,Web是要特征库也会被撑得很大,效率会降低。GSP的一句话,Web要会稍微长一点,用run的,用run对象的EXE方法。然后执行传的外界命令,虽然语法上长的跟PHP不一样,用的是法的这种面向对象的语言。但是在特征层面的话,它是完全不管这种语法的,他会把所有的代码当做一个字符串来处理。
06:00
所以它的特征跟PHP差不多,只要判断request是否在一行就行。然后我们来看一下这个例子。稍微利用PHP的语法进行了一下,变形了一个test对象出来。呃,然后的话,呃,然后然后然后然后调用一个对象的方法,但这个对象的对象跟一个方法都是都是一个变量,是一个字符串。然后的话,进入这个方法之后,然后才会去调用这个这个这个恶意函数。嗯,像这种web的话,特征就很难检测了,当然如果硬要加特征的话,也是可以处理的,只不过用性会很差,黑客可以随便换一种写法就可以绕过。再比如这个例子,它使用了加密,可以在运行时动态解密出恶意代码。在这个例子中,我们可以先看到最关键的代码是这个调用了max变量的一个函数。这个mix变量的话,可以看到这边是一个16进制字符串,转化完以后可以发现它是一个function function是PHP中的一个动态创建函数的功能,它是一个PHP动态特性,无需声明,可以在程序运行中创建一个用户自定义函数。
07:14
我们再来看一下这个uri的内容,这个uri是由date函数date变量经过处理以后产生的,而这个date变量是一串已经加密过的一段的一段密文。呃,我们我们现在不需要深究这个U,这个U最终转解完之后是什么内容,大概可以看出这个date加密的东西经过一系列的操作,字符串处理之后获得U,然后通过U去给它创建一个,用function创建了一个动态的函数,最后把这个函数调用起来。嗯。如果只看这一段代码特征是无法是完全无法下手的,因为如果我们给这个加密框架加特征的话,如果解密出来的内容是白文件,那就会产生误报,但如果直接给这个密文加一个特征,就会完全失去泛用性。
08:03
特征加的太死的话会没有泛用性,但也不能加太松,因为容易出现误报,误报对我们来说是一种非常重要的指标,因为线上一旦出现误报,如果发生在深夜,对客户将是一个非常困扰的问题。我们把一句话we web shell的特征如果放松一点,搜索全文的get来判断web shell,就有可能会发生误报。下面两个样本中虽然都出现了A和get关键字,但他们都不受shell左边代码中A的参数外,它并不是一个外界指令,而是一个写死的一个LS或者是一个空字符串。右边呢,因为是FL分支,导致V函数调用,呃,调用的这个Y,它和这个Y的复值函数并不可能同时发生。呃,不过需要注意的是,虽然我列举了很多传统特征不好的例子,但特征运营仍然是安全中最重要的一个环节,因为特征永远是最高效的,而且能大幅提高黑客的入侵门槛,脚本小子在网上找到的web shell都能被特征轻松查杀。
09:02
大部分人可能尝试了几次,被检出以后,他们就会放弃了。在实际对抗场景中,还有各种各样的绕过手段。就像下面这些例子,因为PHP实在是太灵活了,绕过手段可谓是五花八门,我们刚刚举办过一次攻防赛,选手们的绕过方式真是让我们大开眼界,把PHP玩出了。因为PHP的灵活性,随便一个动态特性都能成为黑客的武器。对黑客来说,PHP确实是世界上最好的语言。有工就房,传统检测方法做不到的,我们该怎么补上呢?先简单介绍一下tab引擎,Tab杀毒引擎由腾讯联合安全实验室旗下的反病毒实验室研发。汇聚了十多年恶意软件的对抗经验,目前是腾讯内部的核心杀毒能力,服务于多款C端、B端安全产品。针对web攻防的难题,Tab引擎不仅包含传统检测方法,还研发了静态污点分析、虚拟执行、动态污点分析三种全新的检测手段,多管齐下在各个维度检测web she。
10:08
首先,静态污点分析会对各类脚本文件进行一个词法语法解析,转换成中间语言后再进行污点分析。如果脚本中带有加密混淆虚拟执行功能,则可以还原出原始代码。动态污点分析实现了一种类RP的检测方案,使用动态污点技术检测脚本的真实运行逻辑。先介绍一下静态污点分析。首先杀毒引擎是无法理解脚本的,我们需要先把代码转化成一种方便操作的数据结构。学过编译原理的同学都知道,代码进行编译前需要进行词法、语法分析,我们也不例外。先进行此法语法解析,得到一个抽象语法数,就是ast,在遍历ast得到进一步转化成中间语言IR,最后在IR上提取控制流图和数据流图,进行五点分析。Pab引擎支持将PHPJSP等脚本语言转化为同一种IR,这样的话就可以用误点分析逻辑保证每一种语言的检测能力都是一致的。
11:06
污点分析的话,搞安全搞呃,搞安全的同学应该都已经听说过,应用到web检测中,我们会将外界变量视作污点源,比如说PHP的get变量,危险函数视作误点的汇聚点,比如各种命令执行函数。在控制流图和数据流图中跟踪污点传播,如果发现点变量进入了汇聚点,就可以判断为为web shell,就比如右边这个图中。污点原理的,呃,污点原理的污点一,它经过了污点传播,最终变成了污点五,到达了污点汇聚点,这就是一次完整的污点传播。5.6在传播过程中被洗白了,最终是以普通变量三的形式进入了污点或雨点,所以它就不是一个we。简单来看一下web shell是如何转换成ast,然后再进一步转换成的ast。我们可以简单,一棵树每一个节点都是都有N个子节点。首先我们会默认建立一个root根节点,代码中的所有的内容都会是根节点子节点。
12:04
呃,看代码中的第一行,它是一个FL语句,我们会将一个FL整一个结构视作一个整体,转化成ast上的一个F节点。它包含了三个子节点,条件处分支和false分支。它的它的条件就是这个X变量,然后就转换成一个变量节点。它的呃处分值节点下是一个赋值与B节点对应代码中的这一句话,把default字符串赋值给了变量A赋值节点的话,它有两个子节,分别是等号左值跟等号右值,这个的话就是变量A节点跟一个字符串节点。False分支下面是另一个复制语句节点对应代码中的else分支。在这个分值里把get变量赋值给了A,所以在这个在在这个赋值与在这个赋值节点下,呃,左值左节点跟右节点就是变量A和一个get边get数组。最后的话调用了函数表,现在as上就是一个函数调用节点,有函数名跟参数列表两个子节点。
13:06
得到as后,我们可以深度优先便利这个as。把对应的节点转换成IR。AR的话可以简单理解为是一种汇编的3D码,只有操作符,两个操作数和一个结果。目的是为了方便后续的分析,并且LR会把所有的循环条件分支都统一成处理成跳转的形式,方便后续对控制进行精确的分析。嗯,就像这样电量,呃。变量X。进行呃,根据变量X进行跳转,有两个分支可以进行一个跳转,分别是LABEL1和label label0和LABEL1,呃,就像这样,然后这两个分支分别对应F的处分支跟false分支,当这两个分支自己分别执行完毕后,都会跳转到一个A2分支,就是这里最后去执行一个那个函数调用节点。呃,其实在ast上就可以做到简单的误点分析了,比如说这个ast,我们进行深度优先,便利先进入F的第一个分支,发现没有物件传递行为发生。
14:09
进入第二个分支,发现污点变量get被赋值给了变量A,因为get变量是一个初始化的后就是一个污点,所以我们可以把A也标记成一个五点。继续遍历到函数调用节点,发现它是一个危险函数,呃,危险函数,它的它的参数A因为已经被标记为五点,所以就说明这是一个web she。既然as已经可以胜任误点分析了,那我们为什么还需要转换成I呢?我们来看一下这个例子。这个PA,这个web shell,它是一个V循环,当I小于五的时候,会把这个外界变量get赋值给A,当I大于五的时候,它会在它才会把A赋值给B,然后实现了一个把get赋值给B的一个传递,最后的话在A函数调用B,然后证明这是一个web she。但如果我们忽略掉这些物,要循环跟这些条件分支直接顺序的往把这个代码从上往下看,就会发现这个B变量先被A变量赋值,然后A变量才被那个这个变量赋值,这就导致B无法成为一个无点变量,就无法判断这个F,这这个是个web she。
15:17
反映在as上的话,呃,就是发,就是发现,由于深度优先变利,B变量先被A赋值,然后后K的变量才把A赋值,就无法检测,就是就无法在ast上实现一个检测,如果硬要实现的话,我们就需要实现这个well节点的一个语义,让它有一个循环的一个功能在里面,这个在as上是很麻烦的,因为你不仅要实现这个well,你还需要实现for,然后Switch break continue,一些很复杂的一些跳转。而IR的话,就会把所有的循环条件分支统一处理成一个跳转,可以方便构建控制流图,然后方便后续的一个精确分析。目前tab静态分析支持了很多运算,比如说函数调用。这个web的本质是用system函数来。
16:04
运行get接变量,System字符串是由拼接而成的,然后和这个get变量一起传入了test方函数,在test里分别赋值给函数名跟一个参数来实现一个system的调用。tab静态分析支持对这种函数,呃,支持这种函数调用,可以跟踪传入那个函数的字符串跟变量。还支持这种简单的字符串拼接。还有前面提到过,循环分支tab也是可以支持的。再比如说还有对象属性,在这个例子中用了两个2OG对象,但是通过赋值搞出了ABCDE5个对象,他们之间还互为对方的属性,完全纠缠在一起,就算是人工看也很难一眼看出问题。但ta引擎可以精确分析出每个对象的具体内容,从而得出这个对象的value属性就是这个get变量。所以可以判断它是web。还有利用反射,在这个例子中,利用反射创建了test的一个反射类,然后再用反射创建出test类的对象。
17:07
最后的话用反用反射还创建出了test的一呃的一个放的一个方法,最后用invoke方法把这个对象跟这个反那个反射方法关联起来,去调用这个这个这个方法。然后,然后,然后去把这个get传入到那个中,变成,所以它是一个web,但他这样的一个方式仍然逃不过tab的静态检测。呃,GP的话也有反,不过因为我们会把GSP和PHP统一一种IR处理,所以处理反的方式也差不多,这也是之前提到过统一的一种好处。还有回调引用、魔术方法等等,PHP动态特性我们都有支持,这里因为时间关系就不一一举例了。虽然静态分析已经补上了一些对抗能力,但面对复杂字符串运算和加密时仍然无能为力,所以接下来就由我的同事赵中斌来介绍一下tab引擎中的动态能力。
18:07
嗯,好的,大家好啊,我搭档呢,刚刚已经给大家讲了,我们是如何利用那个静态分析技术来检测web,那么接下来由我跟大家一起探讨一下动静结合的另一面,也就是动态检测的一个思路。在提到动态分析的时候,我们大多数人第一反应应该都是沙箱,确实啊,毕竟传统沙箱在PE等二进制病毒木马检测领域有个非常不错的应用。传统刀枪确实是用来检测恶意检测的有效方法之一,但是放在web这里,它仍然是最适用的吗?根据我们的研究认为传统烧箱还是存在一些问题,以至于它不是那么适用于端上的外部系统检测的。比如第一点。逃逸风险,我们知道PP语言是非常灵活的功能性,功能非常的丰富,它有大量的系统操作函数和方法。如果我们直接在杀伤里运行恶意代码,我们需要花极大的力气去思考如何防止恶意代码逃逸,而且大多数情况下,我们很难堵住所有的逃逸径,风险始终存在。
19:09
第二点,沙箱的性能通常较差,更遑论PVP的性能,大家应该都是了解的,所以传统砂箱检测很难在毫秒级做出一个检测反馈。那么以上两点其实就已经决定了,沙箱很难放在端上进行检测。当然还有一些其他的问题啊,比如这里列举的PHP版本,版本之间的差异啊等等,我们这里就不逐一展开了。对tav是如何去做动态分析的呢?我们基于OPQ的虚拟执行机制,自研了一套PP的虚拟执行解解释器,至于什么是O扣的,我们后面会再引入讨论。总之他现在就知道我们这个。是执行环境就是基于op的就行了,我们在这套那个虚拟执行解释器中呢,实现了PP所有的核心运算功能。所有实验的功能都是安全可控的,恶意程序呢,它无法对引擎外的环境造成任何影响。
20:03
并且说我们优化了大量与检测无关的运算,在性能上能完全能够做到毫秒级的一个检测响应。而且由于我们实现了o code的集的那个虚拟虚拟执行机制嘛,我们也可以兼容大部分PVP版本特性带来的问题。那么接下来我们就从那个脱壳接吻作为一个切入点,来探讨一下虚拟执行引擎的一个优势。我们先来看一下我们一般会如何处理这种经过加壳混淆的复杂PVP样样本。以右图为例啊,在遇到这种经过价格混淆的复杂P样本的时候,我们传统的思肯肯定就是说想办法去拓个混淆吧。那么脱壳去滚药的方法呢?通常就是说去收集这类加壳样本,对它进行一个调试和分析,解析它在逐步执行过程中是如何一步一步解密的,最后执行到一个目标源代码的。那t AV目前已经支持网络上许多主流的加壳混淆的拓客处理,比如右图的这个样样样本,在经过我们的拓客算法处理之后呢,完全可以得到一个肉眼直观就能够分析的一个代码。
21:11
静态脱壳驱蚊胶的优势在于,只要分析这类样本的这这类壳的一个少数样样本,就能够脱掉同一类的所有的夹壳样样本。但其实它的劣势也在于此,当我们遇到没有见过的壳的时候,没有见过这类混淆手段,引擎没办法进行脱壳,也是针对新壳的处理,往往不具备时效性。而且部分可可混淆手段相当复杂,调试起来难度极大。这个时候我们就我们,我们就会去想,我们能不能不去主动的调试每一类可混淆呢,而是让他们自主的在我们的虚拟执行环境里面,按照既有逻辑执执行。只要他们想要按照原有的逻辑去顺利执行的话,那么最后一定会执行到源代码的。当然当然是可行的,虚拟执行就是应该在这个时候发挥它的作用,我们利用之前提到的资源虚拟执行引擎进行一个动态的一个执行,分析可以实现什么功能,能可以实现一复杂代码等价还原功能,也就是说样本的一个解密、脱壳、虚混淆处理,咱们可以通过这个虚拟动态虚拟执行来处理。
22:15
以及我们之后会提到的更高级的动态污点分析技术。我们先来看一下这两个样本。第一个样本,它经过了一个加密之后,肉眼已经无法辨别,我们就是已经根本看不出它的原有逻辑是什么了。我们利用虚拟执行引擎进行运算之后,提取出它最后一个的真实代码。等价替换之后呢,就可以得到右图的结果。可以看出,在等价替换之后,代码已经非常清晰和直观了,这个时候我们便能再利用特征特特征匹配,还有那个静态污点分析技术,对样本进行一个检测。第二个样本也是非常明显的一个加密,这个样本利用了大量字符串拼接和字符串运算,它隐藏了代码的原本意图,而在经过虚拟执行引擎的那个等价还原之后呢,就能得到右图的一个结果,很明显就是一个。
23:05
此时,这个不管是在特征还是静态污点都能够非常轻易的检测。到这里,大家应该已经基本理解了那个虚拟执行引擎是如何协助我们去检测web的,总结成一句话就是给静态分析提供复杂运算的能力。将复杂运算的结果输出出去,帮助静态分析完成检测。但是呢,协助检测只是虚拟执行引擎的第一个应用。虚拟执行虚拟执行引擎还有第二个更重要的应用,还有就是动态污点分析技技术。同样的,我们先从一个简单的对抗样本来入手。这个样本很直观,利用反序列化函数把system这个高维函数藏在了多A当中,如果我们不进运算的话,就基本上没办法得到出这个样本执行了system函数。那么我们从ST的角度来看一下。我们把这个这个样样本解析成ASD之后,大概是这个样子,我们对比的代码看一下。
24:03
首先啊,它的第一行代码是一个赋值复复制语句,那么就是一个复值节节点,它的左值就是多A,右只是一个调用函函数的一个节节点,调用函函数的那个调用函数的下面呢是一个数据化这个函函数。然后它的它的一个参数呢,就是这里传入进来一个字符串。那么第二,它的第二行带代码就是一个调用函数的一个节点,那么它的同样的它的函,它的左值就是它的函函数名,那么就是Dollar a0,那么它的右子呢,就是那个Dollar gate啊Dollar gate下面的一个那个变变量。那么这大家可以从这个就能看出啊,由于我们的这个反区的函数没有办法运行,对吧,那么我就说没有办法标记说这个A到底是什么。我是没有办法识别这个A是不是风险的,当我在这个A这个函这个函数的时候。我们在扣这个A这个函数的时候。我们就不知道它到底是跑了什么函函数,比如说对于静态分析来言而而言,这个样本它最后就是得到一个结论,就是这样跑了一个未知的函函数,它的参数是一个无点,那这个时候自然没办法判断它是否已经泄露了。
25:13
这类样本基本就是那个静态分析经常会遇到的问题啊,不知道程序到底执行的什么函数函数,有什么函数,没办法判断。都没办法判断的东西,我们总不能都给它标为黑吧,对吧。那为了解决这类问题呢?我们在刚刚虚拟执行引擎的基础上,研发了动态污点分析技术。动态窝点分析,比如说我们刚最最开始提到的一个类RP的模块,它的运行逻辑就如图所示。我们在虚拟引擎执行引擎中复合了所有的外界参数的一个读取行为。并且把这些所有出现的外界参数呢都标记为五点。同时我们也对整个虚拟执行,适合整个虚拟执行过程当中的那个污点的变,那个变量传递,还有赋值以及运算这些相关逻辑进行一个监控,对这个污点传播进行跟踪。
26:05
最后,一旦在虚拟执行引擎中发现高危函数,就我们拥有库了嘛,我们就可以发现它是否执行了高危函数,如果一旦有高危函数执行的话,我们就可以按照我们预设好的一个规则对参数进行判断,以此来检测一个样本是否是为。我们回到刚刚那个样本来看一下,这个样本在虚拟执行过程中执行到反序列化函数执行之后呢,得到A。因为反序列化函数执行之后就得到多A等于含有system字符串的一个数组,也就是多A0等于system。那这个时候呢,A0这个,然后这个扩这个函数呢,是不是就可以等于system,因为这个时候已经被我们运算出来了。就是说在这个时候,我们那这个时候虚拟执行引擎在执行system的时候,我们就对它的那个参数进行判断啊,发现是一个污点,那这个时候根据咱们预设的一个规则就可以判断这个样本就是一个VI。
27:05
当然这个时候可能会有同学有疑问啊,这个跟刚刚的虚拟资金等价替换有什么区别?其实区别非常大。因为等价替换主要应用于一些加密混淆的处理。代码在经过加密混淆之后呢,特征和静态分析已经几乎不可用了,我们需要把混淆样本真正的执行度还原出来。才能协助静态分析去检测。但是在对抗场景当中啊,这个加密混淆仅仅是黑客的一种绕过手段。他们很多时候呢,也会利用函数回调,字符构造类的模式方法等等手段来绕过检测。这些绕过手段呢?往往与正常的业务代码逻辑几乎一致。这个时候我们就很难判断说这一段代码到底需不需要去运算和还原。比如这个反序的话,难道我们要去把所有的反序的话,运算产生的这个值等价替换到每个变量里面去吗?不管从性能上看还是检测上看,其实都不是一个非常好的方案。虽然虽然可以这样去做,但不是不是很好的方案。
28:03
所以这个时候呢,动态污点分析是我们最优的一个选择,我们在动态执行过程中就对他进行一个污点分析,尽可能检就直接得出一个检测结果,如果没有只检测到那个恶意行为呢,虚拟执行过程中产生的这些混淆,还原的一些片段,我们也可以输出给静态分析相互补充。其实到这里大家有没有发现一个问题啊?因为我们我们所有的东西都是文件检检测嘛,那我们在我们的虚拟执行引擎在进行文件检测的时候,是没有办法获取到外界参数的,比如说这个多,这个值到底是什么,我们是不知道的,我们只知道它是一个点。而是说可能是说在有些情况下可能跑不下下去。我们来看一下下一页。如这个样样本。这个样本其实它就是用set来判断了这个多get a是否被赋值。只有被赋值的情况下,他才会走到恶意代码。比如说没有被复制的情况下是走不到的,那这个时候我们最要对照这种样样样本,如果说正常大多数情况下,我们如果说不做处理的话,那这里面的只跑不到,那动态分析自然就没办法,这这个恶行为都没有产生,那我怎么恶意恶意分析怎么去那个动态分析怎么去检测呢,对吧。
29:14
黑客都是用这种手段来绕过咱们的一个动态检测技术。那我们考虑一下这种样,就是业内啊,遇到这种样本比较流行的做法是什么。其实大多数情况下就是给所有的这种外界参数啊。填预预设了一个那个F变量,将这个F变量呢,填充给这些什么don get啊,多post,甚至多global以及其他超级变量当中中去。如果,如果这里的这个样本里面不是don get a,而是什么don get0,多GET1 don get2,这样以索引的方式来取得值,那么F变量方式相是相当有有效的。我们只需要预先在这个数组当中去。按照索引填充几个FA值。不管他是什么,他都会执行到会代码。
30:01
那问题就是它不是索引啊,而且大多数情况下,其实这这这这地方可以是A,可以是零,可以是X,可以是Y。很多时候黑客就是把这种东西当做是一个密码来判断的,就是当我这个传输参数不对的时候,他是不会跑的。那么我们怎么解决这种问题呢?其实就是我们最最开始提到的,我们的那个检测引擎是基于OB的,OB扣的就是解决这类问题的最好方法。所以这个时候呢,我的我的搭档刚刚最开始已经给大家引入了那个as和IR的概念,那么在这里呢,我要引入一个那个PP里面有的概念就是code。怎么是O的?我我们知道啊,PP是一门解释型语言,代码并不会直接编译成机器语言来执行,而是编译成一种中间代码。这部分中间代码呢,通过软件虚拟机技术来执行,这个中间代码就是。TP在运行过程中主要分为两个部分。编译和执行。
31:01
在编译模块中必须通过词法分析。逐个字符扫描,根据扫描结果识别出各个词数,比如是各个token,最终将输入的P代码解析成token list,再抛给语法分析器,解析成刚之前提到的ASD,然后呢,这个抽样语法数呢,这个ST,再解析成OB Co。最后加载进咱们的那个虚拟机,完成虚拟性。就大家可以从大家这样听下来,是不是就会觉觉得说这个OB code其实跟我们之前提到IR有点类似,那确实有点类似,大家可以把它理解为那个。Pap官方的L。那个不当的类别,其实它其实也以这个OB code也可以理解为P的汇编代码。Op code也是我们引擎实现虚拟引擎最关键的一个概念。那么我们以最这里随便写两行最简单的P代,代码就如图所示了,那么他在经过那个P拟执行引擎处理之后呢?
32:04
会变成什么样呢?就变成如下的一个的序列。那么这个OB,比如说第一个赋值。那它就是个o Bo code就是值,那么它两个操作操作就就是。0SYSTEM就是把付给零这个变量。然后第二行呢,就是它就是开始第二行这里嘛,它是一在里面,它是一个那个扩函数的一个节点,但是在在OB code里面,它就是那初始化一个动态的扩一个扩函函数。然后呢,去这个这个。这个的变量,然后呢,把这个变量C给咱们的这个扩这个函数的一个那个。呃,作为它的参参数。比如说这个时候大家看初化的时候,这个数据初始化的个C这个函数,然后把外作为参数进去,然后最后在那个调用这个函数。那这就把上就把这个代码解析成了这个O扣的,比如说真正其实咱们那个PP在执行的时候都是执行的直接oq的序列。
33:10
好解,那个解释完后的,我们再回来。我们该如何给这种一些就是需要。那个特定参数的这些值,给它填充一个F值呢。举个例子啊,左边这个样本。它需要传入一个那个名为AR的一个数组,而且类类型必须还得还得是数组才可以得到,说那个多A等于CC自对吧,因为传了一个数嘛,然后它的一个元素就C,这个时候我取它的一个这个位它就是C。比如当我的这个边这个参数不对的时候,那这个A是没办法投入等于C。那么我们怎么处理呢?我我们其实就在OB code的集完成这个污点标记的话,这种所有的取不,只要它是许多人get当中的任意的值,我们都可以给它标记为污点。
34:00
比如说这个。这个函数最后它是都A,它不管什么执行什么函数,如说这里system可能最后还是等于是什么E什么的,它最后只要这个风险函数,它我们就把它成为污那个污点函函数,那污点函数的值时性自然也是一种极高的风险。这是这种需要这种参数参数那个。值的证证据才能跑的,还有一种就是说这种这种在一些函数,它的参数必须要是特定的参数类型,比如说它的参数呢,就必须得是一个数组类型,才能保证样本的一个正常往下执行。那么我们针对这类函函数参数,由于我们在code进行处处理啊,所以说这个当它需要那个数组参数的时候,我们就可以把这个参数设为那个数组类型。这样的话就能够让整个那个我们就可以实现了,在没有外界参数输入的情况下,把所有的这些输入都标为五点元。然后进行一个正常的那个运算和分析。
35:00
就最后因为我们知道他传递的东西大多是风风风险嘛,这里可能是可能是别的,但是只要风险函数执行了,那就是一个。一个比较有含有风险的一个样本了。好了,我们再来看一下其他几个样本啊,其实思路都差不多,比如说第二个这个字符串拼接,其实它也是它的目的啊,也是为了让你这个运算不出来,这个多A等于C。那么他怎么做的呢?他其实这里比如说他就是通过这个运算。呃,因为我们这个它是把S码转为那个字符嘛,那么这它由于由于我们没有这个静态分析里面是不会做这个运算的,那我们就没办法得出这个值等于T,那自然就没办法得出这个A等于CC4,但是在我们的那个动态点分析里面呢,我们会。把它真正的算出来。然后这里就能执行了C45点,那它就那它就它就是一个那个黑样本一个VIP。同样的,这里也是一样的,这个就是扣的这个解,解出来也是一个system,你如果说没不做这个运算的话,也得不出这个结论的。
36:02
那讲一个稍微稍微有一点,有一点那个少见的一些样本吧,比如说这个样本。这个函数啊,Get classes,它的那个作用呢,就是说我们整个P执行的生命的生命的所有的类。那我们知道它其实我们P环境里面自己带了很多类。那么这个时候我只要在那个我的样本里面,我的这个代码里面。给它新建一个类,类名叫system。那它应该就是说这个生命的最后一个类,那我们再通过o pop给它把这个类名弹出来了,弹出来之后就得到多B等于C,那么自然也可以执行这个风险,这个风险的恶意代码了。这些都是说都都都说明了,说这个动态分析是能够帮助我们去做出很多的静态分析的运算,然后并且说咱们在动态执行的过程当中,就已经带了五点分析这样的一个技术。就能够实现这个动态污点分析了。就我们再从宏观视角回顾一下啊,V检测引擎针对一个样本是如何进行检测的?
37:05
首先我们拿到一个JP样本之后。会利用比如说什么多摩多摩匹配之类的算法进行特征分析,还有那个咱们刚刚提到的一些静态,静态的分析。然后进行处理完之后呢,我们会判断他是否有恶意行为,如果说是的话,那自然就是外泄,如果说没有检测到恶意行为的话,那他自然就会走到咱们的那个P的P执行解中去,然我们在这个执行执行的过程当中又带了那个动态点分析。通过动态污点分析呢,去判断它是否有有恶意行为,如果这个时候也没有恶意行为的话,我们会把这个执行过程当中所所产生的那个去混淆,去加密后的那个P片段重新输出到第一步,比如说特征和静态里面。再去辅助他们去完成这个,呃,恶意行为的检测比,就是比如说刚刚我们最开始提到的加密,这种加密如果说在最后那个动态五点不机里面没有检出恶意行为的话,那么他就会把等价还原之后的值再输出给特征和静静态,让他们去做这个分析,这个分析。
38:06
以此我们就实接实现了那个动静结合,让ta在web检测领域呢,实现了比较高的一个检测率,还有一个超低的误报率。讲完了引擎在web检测领域是如何动静结合的,我们再来看一下那个腾讯云整体的web能力体系。在技术研发之外,其实VI web检测非常重要的一点,也是运营体系的一个建设。腾讯安全拥有极为庞大的全球文件样本库,IP信息库、D信息库,还有域名信息库这些等等等等,在这些的支持下呢,我们能够感知最新的外特性和方法,不停的完善和提高外秀检测能力,毕竟非职工胭脂房,我们同时也与国际一流的新鲜团队科恩实验室保持高频的攻防演练,不停的从工艺的视角来完善我们的检测和防御方案。而且近期呢,我们也与T2C云顶实验室合作举办了vib秀挑战赛,去验证和丰富了我们的检测能力。
39:03
我们同时会欢迎各位观众在后续的一些比赛活动当中啊,积极参与进来,一起跟我们一起推动那个B检测技术的一个进步。好了,以上便是我们分享的一个全部内容,感谢各位的观看与支持。
我来说两句