瑞星毒师:我如何创造一只“杀毒神兽”。周军,前瑞星内核团队负责人,火绒安全联合创始人。
这位“技术宅”的最大热情就是反病毒技术的研究。当杀毒软件之间进行暗黑攻伐的时候,他在研究病毒样本;当杀毒软件纷纷用免费方式流量变现时,他在研究反病毒技术;当杀毒软件纷纷成为“入室管家”时,他仍旧在专心致志地打磨杀毒引擎。
所谓天道酬痴,大抵正是如此。“毒师”周军和伙伴们用数年时间,饲养了一只“杀毒神兽”,在这只神兽眼中,所有的病毒都无处遁形。
周军
我是一个以杀毒为职业的人。
杀毒这件事,从来不像看上去那么简单。这就像数学,一切都源于简单的加减乘除,最终发展出的数学理论却浩瀚无比。也更像医学,庸医也许大动干戈,神医可能轻描淡写。病人,从某种程度上来说都无法判断医生医术的好坏。
自从电脑占据普通人的客厅或书房,病毒和杀毒软件就先后出现了。上个世纪末,杀毒软件甚至成为像我一样的年轻人认识 PC 的一个入口。
这些杀毒软件背后的人,大概被统称为安全研究员。他们的工作说来也简单:制造一套系统,让它能够识别尽可能多的病毒。
这套系统就是杀毒引擎。
如果用警察来做比喻的话,警察抓坏人的方法有两种:
1、通过通缉犯的照片和行人一一比对,找出在逃的坏人。这种方法有个弊端,那就是如果坏人乔装改扮,甚至去韩国整个容,去泰国变个性,警察就有点懵X。
2、通过观察人们的行为来判断——坏人总要犯案的。老刑警站在街角,通过神态和动作就能八九不离十地判断出人群中哪个是伺机下手的窃贼。只需要在他下手之时,把冰凉的手铐磕到他的手腕上。
杀毒引擎也是同样的道理,“根据已知的信息找到未知的所在”。只不过对我来说,我更倾心于刚才所说的第二种方法,用我们的行话来讲,叫做“特征+行为分析”。我的理想,就是不断完善我们饲养的这头“杀毒神兽”。
(一)
我生在北京。第一次接触病毒,是在高中的时候。和很多人一样,大名鼎鼎的 CIH 病毒闯进了我的视野。这是我第一次听说病毒这个词儿。一个小小的程序竟然可以搞垮一台电脑,其中肯定会有很特殊又很神奇的原理。当时我想,如果能够做病毒研究,这事还是挺牛X的。
所以,我报考了北京工业大学的计算机科学与技术专业。
但是,在技术研究这条路上,第一个坑却是我的老师。汇编课的老师在开学第一天就对我们说:“学这个东西没用。老实说不是学校非要开,我不爱讲。”听到这句话,我当时就走了。既然老师都是这种态度,那我何必浪费时间呢?
我并不相信这门课没有用。虽然在大学,但其实对于底层语言和编程基础,大部分都来自我的自学。
我的专业会接触相对宽泛的计算机领域,所以实际上在大学期间我做了很多不同的方向,甚至有相当长的时间,我在做图形学相关的。到了大三的时候我突然意识到,我必须找到一个我真正热爱的方向作为终身的选择。
我回想过往的经历,虽然接触过很多方面的计算机技术,但是当年的 CIH 病毒还是出现在我的思维里。围绕反病毒的逆向、驱动、代码这些底层技术,让我觉得可以在计算机上制造一个自由的空间。在这个虚拟又广袤的空间里和病毒制造者用数字和代码进行对抗,这种快乐恐怕只有像我一样的“技术宅”才能体会吧。
相比初见 CIH 时的无处下手,临近大学毕业时我已经掌握了足够的武器可以和病毒同台作战了,我觉得是时候加入反病毒专家的队伍了。
当时国内的安全公司寥寥无几,要做安全当然就要去最好的公司。我挑选了一个当时风头正劲的投去了简历。这家公司就是瑞星。我顺利通过了面试,不过由于我还在大三,公司告诉我只能以实习的方式来工作,没有工资。我说,没有工资我也干。
我开始了在瑞星的“毒师”生涯,这一干就是六年。
(二)
我是个搞技术的,所以不太会宣传自己。我总觉得人的精力是有限的,如果花精力在宣传上,真正做技术的精力就会减少。
在瑞星的时候,有一件事让我印象很深刻。
当时国外流行一种病毒,叫做“viking”威金。这种蠕虫病毒会感染用户的程序,通过文件拼接的手法“寄生”在宿主程序上进行传播。这种病毒虽然传播广泛,但是在技术上并不难对抗。
有一天我分析病毒样本,突然发现了一个感染手法和 Viking 类似的“过程感染型蠕虫”。在虚拟机上跑了一下,我发现这种病毒的制造水平很粗糙,感染过程也就是简单地进行文件拼接。从开始分析到把样本加入病毒库,只花了我不到半小时。
我觉得这个病毒也太简单了,随手在内部命名标签里写上了“nimaya”(你妈呀),表达了一下愤怒。
然而,就是这么一个简单的病毒,却很快肆虐了半个中国。
过了几天,市场部找到我,说要用这个病毒炒作一下,让我给病毒命个名。我看了下内部名称,好像不太雅观。我说,要不就叫“尼姆亚”吧。后来,这个病毒有了一个更广为人知的名字:熊猫烧香。
后来,我看到了市场部发出去的文章,大意是“我们的分析师用了三天三夜时间,废寝忘食地研究对抗策略,现在终于可以完全清除这类病毒了。”
看到这篇文章,我觉得很丢脸。瑞星的安全分析师很辛苦,圈内人会觉得连这么一个病毒你瑞星都要搞三天三夜,这实在让我脸上挂不住。
说白了,作为一个技术出身的人,我很看重自己和团队的技术声誉。在瑞星的日子里,虽然有时会遭到公关战的“高级黑”,我和同事们还是保持了杀毒水平的领先。并且我也认识了很多志同道合的朋友,这其中,就有当时瑞星的 CTO 刘刚、主机安全研究分部负责人毛钧。
我们三个都是技术出身。我们的爱好就是钻研反病毒技术,改进杀毒引擎。但是,我越来越发现,在瑞星有很多框架和历史包袱不是我们依靠一己之力能改变的。
与其可能在技术上受限制,不如我们几个人一起从零开始。当时头脑一热,我们一起辞职,和更早离开瑞星的市场总监马刚一起成立了“火绒安全”。
火绒安全团队(左起):产品经理李幸、联合创始人毛钧、联合创始人兼CEO刘刚、联合创始人周军、联合创始人马刚
(三)
我们买了一张桌子,几把椅子,撸起袖子开干。这张桌子现在还摆在会议室里。
能够按照自己的意图去做喜欢的东西,这种自由的感觉简直太好了。
终端安全,尤其是杀毒引擎需要大量的数据积累,而2011年我们成立火绒的时候,手上只有我们几个人的技术。于是我们决定,先不急着做杀毒引擎,先做个分析工具。
杀毒引擎会利用内置的病毒库和识别规则,精确判别病毒。而防御工具则是尽可能地把程序的进程关系和对电脑的动作步骤呈现出来,相当于对运行的程序做X光或 CT。
这个工具就是火绒剑。
火绒剑可以展示系统内部正在运转的详细情况,包括内核进程、驱动状态和网络状态。总之,可以辅助“电脑高手”来检查系统的“健康情况”。
我们把火绒剑放到了自己的QQ群里,也放到了卡饭论坛上,大家觉得这个工具非常实用,这些支持者也成为了我们的最早的用户。
火绒剑
有了火绒剑,显然就要有火绒盾。火绒盾一开始的功能也很简约,就是通过行为模式来判断一个程序是否存在恶意。
看一个程序是否有恶意行为,仅仅通过一个动作(单步防御)在很多情况下不能奏效,而是要把一个主体的多个动作串联起来才能判断。
举个例子:
一个人使用刀,并不是违法行为;
一个人站在人群中,也并不危险;
但是一个人在人群中握着刀,就很危险。
这个思路并不新奇。火绒盾做出的第一版产品也和“主流产品”很相似。但是由于可以直接接触到用户的反馈,我发现原来我们做多步防御的思路并不好。
过去的行为分析,主要看的是进程和进程的关系。每个分析器用独立的视角分析一个进程,这样就会造成子进程父进程等等多个进程分析之间的混乱。而我们发现,如果换一个视角,把每个行为和进程的关系作为一个矩阵来观察,事情就变得非常清晰了。
用这种方法,系统可以比较容易地总结出病毒的行为模式,建立起一整套基于行为的防护规则。这一套分析规则一直没有让人失望,至今为止还没有需要被“特殊照顾”的白名单文件。
做了这么多准备,我们终于准备开发自己的反病毒引擎了。
火绒安全截图
(四)
乔装改扮是病毒的基本技能。Win PE 系统中 80% 的病毒都有对杀毒软件的对抗代码。病毒今天穿蓝衣服,明天换黑衣服,杀毒软件就可能无法识别了。
所以在把目标文件放到病毒引擎查杀之前,有一个非常重要的工作,那就是先用“照妖镜”让文件现出原形。这个照妖镜就是虚拟沙盒。
简单来说,就是让文件在这个虚拟的环境里“释放天性”,自由地展示它的好和坏的本性。
这件事情的难点在于,如何让杀毒软件相信,自己不是被放在实验台上任人亵玩,而是真的进入了目标电脑。
很多病毒的脚本会用各种奇异的姿势来测试它是否在真实的系统中。例如向系统请求一些冷门的环境,在真实的系统里,无论病毒提出什么要求,系统一定会满足。但是在虚拟系统里,稍有不慎就会“露馅”。病毒一旦没有拿到理想的相应结果,便不再继续运行。
另外,有些杀毒软件使用开源代码制造脚本解释引擎,这些开源代码本身就可能存在漏洞,这些漏洞如果被病毒利用,则会被病毒逆袭。
举个例子:
upatre 木马家族会使用一种独特的方法,它会在自身外层设立一个混淆器,登陆目标之后先创建一个窗口,在里面建立文本控件,使用这个计算出一个长度,再拿出来为自己解密。这个方法的巧妙之处在于它调用了其他病毒很少调用的窗口和文本系统,这就使得一般的虚拟机很难“跑开”它。
如果不能跑开,就只能进行静态的代码审计,由于代码复杂度极高,人工方法几乎没办法完全审看。
于是,我们用了一种方法,那就是在引擎里直接嵌入了一个“windows 系统”,这个系统完全由我们开发,里面包含了注册表、窗口系统、进程调度等等功能。
病毒的目的是:看你和真实系统哪里不一样。
我们的目的是:让病毒相信我们就是真实的系统。
当然,Windows 系统极其复杂。理论上来说,我们如果模拟得一模一样,那么体量上也会和它一样大。我们希望不断抹平和最新 Windows 之间的差距,目标就是做到“病毒需要的,我们全都有”。
我们从成立一年半的时候开始做引擎,到现在为止对于虚拟沙盒的完善一直没停过。一旦发现病毒利用了新的系统特性,我们也会马上在虚拟沙盒里加入。
虚拟沙盒整体架构
(五)
最大快人心的,就是引擎杀毒这一步。
引擎杀毒的依据是病毒库。病毒库分为三个部分。
病毒文件哈希:特定病毒文件呈现的具体特征
病毒基因特征:被“跑开”以后的病毒样本里的关键数据
病毒行为特征:病毒所具有的一系列行为特征。
检验文件的哈希,是一种比较笨的方法。就像警察拿着通缉令逐一排查。然而由于病毒会不断变幻加密生成变种,所以可怜的警察要拿着同一个人穿着不同衣服的照片才能识别。一旦病毒买了一件新衣服,警察还是会漏过。
检查文件的基因特征,大概就像先把路人的衣服脱光,然后再对照片进行比对。这种情况下,病毒的真身就会赤裸裸呈现在面前,彻底杜绝了穿上马甲就不认识的尴尬局面。
对病毒行为的分析,是引擎最让我自豪的能力。因为它已经脱离了病毒的外貌,转而判断病毒的灵魂。外表再和善的人,只要伸手做坏事,都难逃“老刑警”的法眼。
我记得有一条行为模型,在对1900万病毒样本进行测试的时候,成功命中了47万样本,这样的单条检出率甚至超过了我的预计。
火绒安全对恶意代码采用的分类
但是,就像这世界的骗术在不断进化一样,病毒的行为“剧本”也在发生演化。所以我们正在尝试用一种新的方法来找到最新的病毒威胁情报。
火绒的用户大概在200-300万,这些终端很多都是类似网络管理员这样的“关键人物”。所有这些用户实际上散步了一张非常广泛的信息收集网。在用户的许可下,所有的可疑行为都会被收集,经过本地分析以后,汇总到威胁情报平台。这些数据达到一定的数量,就可以清晰地呈现出哪些新的行为模式正在产生。而我们仅仅需要对可疑的大量的行为进行人工审核,就可以判定这是不是一种新的病毒。
这就是“用威胁情报的方式做终端安全”。使用这个方法,我们发现了很多隐藏极深的木马病毒。
例如一个被我们命名为“Toxik”的病毒。
2016年4月,我们的威胁情报系统发现,一个知名软件的升级程序,居然在很多终端上“不务正业”地下载了许多其他软件,说白了就是软件推广。
经过我们的分析,发现了事情的真相。原来这个升级程序被各大安全软件列入了“信任白名单”,而“Toxik”病毒正是利用这个漏洞,先入侵升级程序,再恶意推广。最终,我们通过人工溯源,成功地定位到了病毒代码源头,直至找到病毒制造者本人。
用威胁情报系统发现的病毒还有:劫持流量的小马激活、能够“攻破” HTTPS 协议的净广大师、专门攻击盗版用户的 Bloom 病毒,等等等等。
Toxik 病毒感染全流程
(六)
有两件事让我很纠结。
第一件事,就是现在捆绑安装成为了一种“标配”。但是在“软件免费化”的洪流中,所有的软件几乎都在做这样的事情。
而在我们的观点中,所有静默安装捆绑推广都是对用户的侵害。只是在现阶段,我们没有办法把这些软件标定为病毒。如果按照严格的标准来说,很多日常在使用的,用户上亿的大软件,都可以被定义为流氓软件。
实际上,在我们的威胁情报系统后台,前十位软件侵权行为都是我们日常在用的某些来自 BAT 的流行软件。这让我们无法忽视。
所以,我们的做法是:至少让用户知情。如果一个软件捆绑安装了其他软件,那么在安装进行的时候,火绒会弹出询问框,让用户得知后台在发生什么,然后来决定是不是进行安装。
第二件事就是,在我们心里提供好服务的软件,尤其是杀毒软件,应该是收费的。
火绒的目标就是要用纯净的纯粹的服务,来换取用户合理的费用。从瑞星走出来之后,这些年我看到了杀毒软件市场的免费化带来了巨大的伤害。
本来是“保安”的安全软件不向雇主要公司,反而把雇主的信息泄露出去,用雇主的资源弄钱花,我不认为这是一条好路。
我和朋友们一手创建了火绒,我深知火绒还需要打磨。即使现在火绒仍然免费,但是没关系,我们可以用技术输出、定制开发项目的方法来养它。我不希望看到在火绒上有任何的捆绑,有任何的弹窗。我只希望这是一个纯粹的安全软件。
我期待,有一天这个商业世界允许用户为火绒安全买单,那将是对我这个“毒师”最大的褒奖。
埃及法老用一座座金字塔来标榜自己的辉煌。蜉蝣于尘世的我们同样希望创造自己的坚硬城邦。
对于周军来说,他的金字塔就是面前的火绒安全。我们总在焦急地追赶飞驰的岁月,他却站在飞逝的时光中细细雕刻着自己的“杀毒神兽”,任这个世界从平地高楼到大厦倾圮,从高山为谷到深谷为陵。
如果病毒代表了人性当中的恶,那我们至少应该庆幸,因为像周军一样的“毒师”存在,世界并没有想象中那么糟。
我们的岁月静好,来自这些痴人的永不回头。