rhett知乎文章摘要

本文探讨了从静态分析到动态分析的转变,强调了动静结合在检测机制中的重要性,如PHP webshell检测的六个阶段。同时,讨论了机器学习在恶意代码检测中的角色,指出特征工程的重要性,并提醒机器学习并非万能,不宜直接用于最终判定。此外,还提到了消除编译器噪声在二进制程序分析中的挑战,以及其在相似度比较和软件成分分析中的作用。
摘要由CSDN通过智能技术生成

源于静态分析的技术:控制流图,数据流分析,依赖图,支配树。

静态分析一个重要的发展方向是结合符号执行来提取动态信息。(从这里也可以看出来,特征抽取真的是核心部分),然而,符号执行不是真正的执行,一方面是符号计算的模拟能力不够,另一方面是遇到分支路径的时候,存在路径选择和分支爆炸的问题。

检测的前提是分析,样本分析是检测工作的基本功,检测工作是样本导向的,不具体的分析样本检测工作就会跑偏。类似编译器的优化,优化是先分析再转换,检测是先分析再检测。我经常跟团队里的同学说,当你不知道该干嘛的时候就去分析样本,样本会告诉你一切。其实这句话放到任何安全产品线上都是成立的。分析样本需要很多能力,比如逆向,脱壳,调试和反调试。这些技术在我看来,是很基础的技术也是拼刀子的技术。因为不管你了解多少上层的分析方法,在遇到个体分析的时候,你不会脱壳,不能解决反调试问题,不能对样本准确和无依赖的判定它是黑是白,其它都是无从谈起了。遇到高级的APT样本和漏洞分析的时候,这种硬碰硬的技术如果不具备,一切也是免谈。

用编译器的优化技术去混淆,用vm的技术抓取脚本执行信息

静态到动态

好的检测机制一定是动静集合的。以php webshell检测为例,我们来看什么是动静结合。

一、最初的检测必然是简单的字符串搜索和正则匹配,这是纯静态的。
二、然后是基于parser的AST提取和基于AST遍历的规则引擎,这还是静态的。但是已经从序列化的文本演进到结构化的文本。
三、基于CFG和数据流分析的污点追踪引擎。这一步算是对程序分析技术的经典应用。到了这步已经开始具备行为模式的匹配能力,而不是单纯的文本规则了。
四、基于编译优化的去混淆技术,比如这种简单的混淆是可以通过编译器的优化技术实现去混淆。这里的优化已经带了一定程度的符号执行,比如遇到base64decode会自动帮它执行decode。有了符号执行,代表从开始从静态迈向动态。
五、符号执行只能进行有限的模拟执行,很快会发现执行效果不够好。所以,一个基于真实web server环境的沙箱开始实施。这步以后就是真的进入动态阶段了。沙箱好处是显而易见的,比如样本使用自定义函数加解密,沙箱只需要让它自己解密就好了,从而无视它的加密复杂度。问题也是明显的,针对沙箱环境的探测和分支逃避问题不好解决。
六、RASP开始登场。当离线的检测模式走到尽头,那么将检测和判定放到业务第一现场做侵入式检测就合乎情理并且势在必行了。

机器学习

鉴于大家都很关注机器学习在恶意代码检测领域的融入和发展问题,单独拎出来说一下我的观点:

一、今天的机器学习跟智能没有一点关系,本质上是统计拟合。前面说了,手写的规则是文法表达式,走的是匹配路线。机器学习训练出来的模型是多参数的结构化表达,走的是拟合路线。前者是可解释的one by one的积累,后者是借助机器的算力批量化处理。
二、机器学习生成的模型是否可以放到最前端直接判定告警?这本质上取决于对模型的误报和不可解释性的容忍度。我个人不喜欢也不推荐模型直接告警。在世界范围内,二进制文件检测方向上,没有一个模型可以脱离白名单的兜底去直接告警。每当我看到机器学习的检测引擎报警成 confidence xxx,score xxx,我其实很想骂街的。安全领域有其特殊性,机器学习做判定最困难的领域可能就是安全。比如推荐类的模型,推荐错了无伤大雅,因为推荐是一种奖励机制,可以允许出错;而判黑告警是惩罚机制,惩罚机制下不能解释清楚原因那问题就大了。
三、机器学习不能处理对抗问题。安全问题总是从易到难,解决了基本问题后就会遇到困难的问题,也就是高端对抗问题。到了对抗阶段对专家的依赖性又凸显出来了。
四、算法不重要,特征工程才是根本。而特征工程还是依赖于安全专家和引擎专家。这就是我前面讲的特征定义和特征抽取是重点,特征分类只是水到渠成的结果。
五、不存在针对全集样本的普适性检测模型。要想得到召回率和误报都相对可接受的模型,也是需要先聚类,然后针对特定集合来训练模型。
六、机器学习不适合做最后一步的判定,而适合放到前面的流程里,比如样本筛选,流量提取,分类聚类,相似度搜索 则是非常合适的。本质上,今天的机器学习就是大数据处理,所以分析收敛数据,辅助加速运营就很合理了。
七、一个善意的提醒,如果你遇到一个人,他说机器学习是检测技术的未来,要淘汰规则和安全专家,那么你最好离他远点。

如何消除编译器噪声?

在二进制程序分析领域,相似度比较,同源性分析,成分分析,这几个问题有悠久的历史,在技术上也有很大的相关相通性。简单的说,如何对二进制程序进行特征提取,如何量化区分,如何识别关联性和引用关系,这些都是问题。更深层次的,不同的体系结构,不同的编译器,相同编译器的不同版本和不同编译选项下,如何识别和剔除这些外在不同因素导致的噪声,将精力集中在真正要分析的内容,也就是程序固有的逻辑和结构上,这是一个困扰业界很多年至今没有完美解决的问题。

一、相似度比较是样本聚类的基础,聚类是任何一家做文件检测的公司的基础手段。而好的聚类需要消除编译器噪声
二、函数签名同样是基础能力,基于函数签名做软件成分分析,这样可以识别程序是否包含有漏洞的Lib库。基于函数签名还可以做样本家族分析,同源性分析等。函数签名同样需要消除编译器噪声。
在这里插入图片描述
一、Binary到ASM这一步是中规中矩的反汇编,一般编译器都自带这个功能。这一步是一个纯粹的byte code到汇编代码的过程,没有花样可以玩儿。
二、ASM到IR没有固定的套路,一般也没人这么干。当然,后面的步骤一般也都没人干,除非反编译这种奇葩的需求。
三、IR到AST这步是最复杂的,前面提到的难题基本都在这一步。
四、AST到源码就比较简单了,语法树走一遍,dump出来就是源码了。
这里面最难的就是步骤3,随着后续的展开你会发现,这个世界本质上没有反编译技术只有编译技术,因为步骤3主要用的还是编译相关的技术。

原文链接:
基于code lifting的二进制差异消除
https://zhuanlan.zhihu.com/p/341448835
恶意代码检测的本质性思考
https://zhuanlan.zhihu.com/p/341448835

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值