火绒安全软件

安全技术探讨
发新帖
打印 上一主题 下一主题

【转贴】动态启发逃逸大法

[复制链接]
5626 5
楼主
发表于 2017-2-5 20:43:11 | 只看该作者 |正序浏览 |阅读模式
跳转到指定楼层
判断一个程序是否有恶意行为,最常见的方法之一就是欺骗它——制造一个虚拟的环境,让它开始使坏并显出原形。之前介绍过ESET基于二进制翻译的仿真和启发,这里面主要的技术难题有两个1)如何在适中的系统占用前提下仿造出一个和真实系统并无二致的环境2)如何根据收集到的行为进行打分判识。其中1)是2)的前提,而很多逃逸方式集中在1)上
前两天无聊翻安软文章的时候发现了一些有趣的逃逸方法,这里归纳一下 (来自Emeric Nasi写的Bypass Antivirus Dynamic Analysis)

传统厂商的自动化分析环境

杀软扫描(仿真出来的)环境(图片来自16年USENIX WOOT的AVLeak资料)

由于种种限制,杀软的仿真环境很难和实机一样,通过侦测这些不同就可以逃过扫描(例如检测出是杀软的仿真环境就自动结束执行,反之进入恶意程序解密的分支)
排除掉注入等高级手段,对抗扫描的基础方法就已经多种多样。原作者还列出了经过这些方法免杀后VT扫描的结果
1.        拖时间
为了不拖累性能,很多杀软的仿真引擎会跳过钉子户,从而给恶意程序可乘之机
例如:分配并填充大块内存(例如划拨一块100MB的内存并填0) VT结果:0/55
出于性能考量,很多动态启发看到这里直接停止仿真了。而且由于malloc函数之类的和正常程序差不多,提取特征也很困难
例如:初始化一个计数器,计数一亿步…… VT结果:0/55
火绒白皮书里就提过这种方法,很多基于解析的仿真看到这种基本可以歇菜(貌似BD就用interpreter)

2.        有求必应
为了简化虚拟成本,有时候杀软会对待测程序的一些无理要求有求必应从而露出马脚
例如:打开系统进程(OpenProcess)  VT结果:11/55
有的AV引擎简化了这种情形的仿真(例如对系统函数直接返回0)。在检出的AV当中,仅有少数真正检出了隐藏的恶意程序,而其他一些只是通过静态启发看到了OpenProcess认为是后门(实质上算误报)
例如:访问一个不存在的网页  VT结果:2/55
大部分AV仿真环境中都不会让被扫描的程序联网,但为了仿真的完整性可能就返回了一个自己的静态页面。因此如果恶意程序发现自己的访问居然成功了,就很可能是在AV仿真环境中(只有一款杀软成功地模拟了这个行为,另一个是误报)

3.        定向攻击
例如:当你知道攻击对象具体用户名的时候,可以通过检测用户名来决定是否进行恶意行为(例如硬编码一个路径,然后尝试访问,失败则结束执行) VT结果:0/55

4.        臣妾做不到啊
由于windows太复杂,杀软的仿真很难涵盖到所有函数。当恶意程序调用那些冷门函数的时候仿真就失败了。
例如:调用FlsAlloc()……你不知道这是什么函数?没事,很多杀软仿真器也不知道
VT结果:8/55  其中扫出来的一些杀软已经能通过返回错误来仿真这个函数
例如:调用VirtualAllocExNuma……你还是不知道这是什么函数?没关系,很多杀软虚拟环境也还是不知道_(:з」∠)_ VT结果:0/55

5.        环境检测
检测虚拟环境的特征,抑或虚拟环境和真实环境的差别,从而达到逃逸目的
例如:检测当前进程workingset体积,异常大的则终止(杀软在扫描的时候会划拨更多内存,而正常运行时不会) VT结果:1/55 (唯一检出的还是个误报)
例如:检测时间偏移。针对拖时间的方法(例如有的程序会让自己先休眠100秒再开始运作),有的杀软有专门的反制措施(比如绕过这些休眠函数),但忘了在虚拟环境的时间上进行仿真   VT结果:8/55
例如:检测自己的进程名。仿真环境中对应进程名往往不会是恶意程序自己的名字(早年BD虚拟机中始终把待检测进程命名为TESTAPP……) VT结果:0/55

6.        其他
例如:检测父进程。当父进程不是自己的时候自己再呼叫子进程。这么做主要是因为不少杀软都不扫描子进程   VT结果:1/55
例如:检测互斥体。当互斥体不存在的时候,创建互斥体并释放子进程,子进程检测到互斥体后进入解密分支  VT结果: 0/55


去年年底谷歌的Darren Bilby曾经表示杀软的扫描和入侵检测已死。上文中就可以看到就这些非常基础的混淆手段足以让不少安全软件的扫描引擎歇菜。
当然你可以说以上问题中有很大一部分是因为性能限制导致的——要不是出于性能考量,很多仿真可以做的更好。特别是其中一些绕过手段, 在基于虚拟机的沙盘中有针对性的侦测,而这些行为一旦被侦测出来差不多就是不打自招。但这些侦测在客户端上跑的可行性太小,这也是为什么安软疯狂推广云安全鉴定的原因之一,将性能压力交给自己,将鉴定结果反馈给客户
但别忘了就算是虚拟机也有各种反侦测手段(事实上真正要防止恶意软件采集安全厂商的沙盘指纹需要做不少特殊处理,有空再写)。此外,虚拟机的分析极其耗时——导出大量函数和网络记录进行归纳、扫描和特征比对极耗费资源。这也是为什么很多在线沙盘分析很慢的原因。总的来说,就算是在原生层级上进行的分析,性能仍然可能是个瓶颈。在当代计算机性能越发进入瓶颈期的大前提下,未来的安全究竟如何保障?很明显至少它将不再是单纯启发扫描一下就能搞定的问题了。

Bonus:
出于好奇写了一个小程序测试了一下。主要行为是访问我自己的一个ddns网址,如果访问成功就弹窗(时间所限没有整合加密的shellcode,所以是个无害程序),如果访问不成功自动退出。因为听说VT上有几家厂商能模拟这种网络访问行为,于是上传VT看了一下,结果没有任何访问服务器的行为

其实有访问服务器的行为才恐怖,不经过tor的话用户的IP位置对黑客暴露无遗,这点杀软厂商也不想负责吧……有点好奇扫描引擎怎么应对这种猥琐的检测
顺带一提,就算是这样一个10行不到的小程序,还是有神奇的杀软报毒了:

误报王江民不算的话,QVM呵呵。后来想想报downloader还算是准了,但这么简单的访问行为都报downloader,很多程序是不是都别活了(当然,如果是因为我的程序发起的是agentless的访问因而报毒,还勉强算情有可原)。这再次体现出恶意程序鉴定的核心——恶意程序和正常程序究竟区别在哪里?某些水货厂商这点处理不好的话就可能出现在程序正常部位提取特征的现象,不误杀才怪

console版更神奇。CrowdStrike,Symentec的ML,还有QVM——VT上三大明确以机器学习为卖点的引擎都对这种无聊小程序报了毒。而这些引擎在以往新样本检测中均很亮眼(QVM更是被hybrid-analysis当成是可信赖扫描引擎,只要扫描报毒就认为是有害),但真要说误报的话就呵呵了。对统计引擎或者某些机器学习算法来说,或许我这个程序的确在众程序中算outlier,但仅凭这种特性来报毒的话是否合理呢?有时候我还是喜欢ESET这种严格控制误报的策略。一旦用户失去了对杀软的信任,社工攻击就更容易钻空子(还记得早年那些恶意程序怂恿你关掉杀软避免误报的字样吗?如果用户在日常中发现自己用的杀软误报很高,就更容易被说服关掉杀软去冒险)

杀软扫描鸡肋吗?以植物大战僵尸来比喻这种攻防的话,扫描引擎估计就是豌豆射手……虽然不能干掉所有僵尸,但能提前干掉一些总比一大堆僵尸直接攻击大后方的堡垒好一些,这也是纵深防御的意义所在


原帖:
http://bbs.kafan.cn/thread-2075547-1-1.html

评分

参与人数 1金钱 +5 收起 理由
huorongfans2013 + 5 内容超赞!!!

查看全部评分

回复

使用道具 举报

5626 5
6#
发表于 2020-6-6 08:38:19 | 只看该作者
360误报率也挺高的啊
回复

使用道具 举报

5626 5
5#
发表于 2017-2-7 22:17:58 来自手机 | 只看该作者
看看!!!
回复

使用道具 举报

5626 5
地板
发表于 2017-2-7 11:48:00 | 只看该作者
精细追踪程序行为加回滚的主动防御最实用
回复

使用道具 举报

5626 5
板凳
发表于 2017-2-6 23:39:07 | 只看该作者
本帖最后由 nat 于 2017-2-6 23:40 编辑

强大的行为分析能力很重要。
回复

使用道具 举报

5626 5
沙发
发表于 2017-2-6 23:07:54 | 只看该作者
这样看来,还是需要强悍的行为分析啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | [立即注册]

本版积分规则

快速回复 返回顶部 返回列表