题图:美国国家航空航天局格伦研究中心配备的IBM 370 Mainframe计算机,1981年
文/Beta-TNT
本系列文章原文写于2024年中,原本作为播客稿件编写,由于一些客观因素未能完成录制,现将稿件重新编辑整理之后作为连载文章发布。原稿发表在机核网,现重新整理校稿之后重新发表在个人博客。讲解技术历史无可避免地会涉及具体的技术原理,这部分我会安排在连载的最后,读者可自行选择是否阅读。
从公众认知角度来看,提到计算机和网络安全,第一个浮现在脑海中的可能就是计算机病毒,连载的第一期咱就聊聊有关计算机病毒的历史。
病毒、蠕虫和木马
概念
计算机“病毒”(Virus)这个概念显然是从微生物学里借鉴过来的,在计算机领域里指的是一类具有自我复制能力和破坏性的程序或代码。有一个观点认为计算机病毒的理论来自冯·诺依曼在1966年发表的论文《可自我复制的自动机理论》(Theory of Self-Reproducing Automata),这篇论文基于他在1949年的一篇演讲。在论文里冯诺依曼设想了一种可以实现自我复制的自动机。而计算机病毒的传播行为就是在软件层面实现的“可自我复制的自动机”。冯·诺依曼这个名字在后边还会继续提到。
《可自我复制的自动机理论》,冯·诺伊曼 著。这篇论文可以免费查阅,有德文和英文两个版本
而后在1969年。美国科幻作家Gregory Benford发表了一篇名为《The Scarred Man》的科幻小说。在这个小说里第一次明确提到了“计算机病毒”(Computer Virus)这个词以及它可以自我复制的特性。这个作家写计算机病毒可不是瞎写的,和后来那些写赛博朋克的作家不同,Benford在科幻小说作家之外的另一个身份是物理学家。
Gregory Benford(1941年1月30日- ),美国科幻作家
1969年他写The Scarred Man这篇小说时正在加州的劳伦斯放射实验室(Lawrence Radiation Laboratory,现劳伦斯伯克利国家实验室,奥本海默也曾经在此工作)当博士后,使用Fortran语言编写程序来模拟等离子体现象。当时还在使用打孔卡片作为数据和程序的介质,计算机还是中心化架构(即Mainframe),用户使用终端机访问中心大型计算机。当时他在想,如果有人写代码的时候不小心写错了,这段代码就会执行非预期的指令。但如果万一有人故意这么做呢?甚至为了扩大影响,让这些“故意的”代码具有传播功能呢?
打孔卡片。在磁性存储介质普及之前曾经作为当时的计算机存储介质
为了验证这个想法,他在自己写的Fortran代码里加了几行,功能很简单:将这些附加代码再附加到其他的代码里。然后只过了几个小时,这段附加代码就开始传播,等到第二天传播就已经失控了,一些毫不相关的文件也被“感染”了。于是他不得不联系其他受到影响的人,将影响消除。事后他把这次事件报告给了计算机专家,提醒他们这种行为可能会被用于更有恶意的用途。而后他继续思考,如果另外有一个“疫苗”程序可以处理这种传播,那是不是可以从中牟利呢?后来他把这些想法写进了小说《The Scarred Man》,并在1970年五月发表在科幻杂志《Venture》上。
小说集《World Vast And Various》,本文提到的《The Scarred Man》就收录其中
关于Benford最后多说一句,他的作品翻译和引进的不多,主要写硬科幻。1980年凭借《Timescape》获得星云奖和约翰·坎贝尔奖。他和大卫·布林是好朋友,两人曾经合作写过小说并发表。国内读者能接触到他的作品可能是阿西莫夫《基地》系列的《第二基地》三部曲,这三部曲是阿西莫夫去世之后他的遗孀委托其他三位作家续写的,另外两位作家是葛瑞格·贝尔(Greg Bear)和我们都很熟悉的大卫·布林(David Brin)。Benford编写的那本叫《基地的恐惧》(Foundation’s Fear,1997年出版,国内好像还没有引进),计算机病毒以及病毒传播的情节也出现在这一部小说里。
《Foundation’s Fear》,1997年出版
“蠕虫”(Worm)这个概念也起源于科幻小说,出自1975年的一本题为《The Shockwave Rider》(冲击波骑士)的科幻小说。书中提到的“Worm”的概念上类比的是现实中的猪肉绦虫,这种恶意程序由一个负责总控的头部和渗透传播进入网络各个角落的海量的破坏性程序构成。而现实中的猪肉绦虫由一个头部和成百上千个节片(也叫妊娠节)构成。正如绦虫的妊娠节从母体分离的时候会生出更多的绦虫一样,每一段破坏程序都有自传播能力。
猪肉绦虫生活史示意图,各位应该在各种卫生宣传材料上都见过
在小说中,这种蠕虫几乎是不可能被清除的,因为即便可以将单个节点下线清理,但只要网络上还有一个蠕虫存活,它就仍然可以在短时间内再传染遍整个网络。甚至书中还提到了另一个人用和蠕虫相同的方式去杀死蠕虫。而所有以上这些事情后来在现实中全都发生过。所以现在我们用“蠕虫”这个看起来有些奇怪的名字来指代这一类通过网络传播的高传播性的恶意程序。
三个版本的《The Shockwave Rider》小说封面,原文其实是一本反乌托邦科幻。这本小说的作者John Brunner曾经荣获雨果奖
最后是“特洛伊木马”(Trojan Horse),这个词更多的是描述恶意程序的伪装方式:通过伪装或者潜藏在正常的程序里的方式骗取用户的信任,从而获得执行的机会。1974年“特洛伊木马”这个术语在就已经出现在美国空军对于计算机系统安全性和漏洞分析的报告中。
1974年6月美国空军发布的题为《多工信息与计算系统安全评估:脆弱性分析》的报告,其中提到了“特洛伊木马”(Trojan House)这个概念。顺带一提,MULTICS是MULTiplexed Information and Computing System的缩写
这份报告中提到了“特洛伊木马”,但并未对其进行解释,推测这个概念在更早的时候就已经被业界广泛认知和接受了
现在”木马“这个概念一般特指远程控制木马(Remote Access Trojan,RAT),作为网络安全行业从业人员,远控木马闭着眼都能报一堆菜名:netspy、灰鸽子、中国菜刀、冰蝎、哥斯拉、蚁剑、Cobalt Strike……这些木马不仅有针对桌面系统的,还有基于Web服务的,后者也被称为Webshell。
一个古老但功能齐全的ASP Webshell。从地址栏的路径可以推断它是通过应用的”上传漏洞+数据库备份“这一经典组合上线的
病毒、木马和蠕虫,在当今时代它们的边界变得模糊了,一般都会被统称为“恶意软件”(Malware)。一般认为,无法独立运行,需要感染操作系统或者附加到其他可执行程序的恶意程序是病毒;着重通过网络大量复制传播,而且可以独立运行的是蠕虫;使用伪装手段骗取用户信任或绕过检测手段,在目标系统里运行并接收来自外部指令的被称为木马。这种分类方式是根据恶意程序的传播方式进行区分的。而现在恶意软件的形态几乎完全取决于其目的,不再拘泥于特定传播方式,传统分类方式现在也逐渐不再使用了,现在主要根据恶意软件的目的进行分类。
接下来我打算聊聊一些开创性或者有影响力的恶意程序。
Creeper
首先是公认的世界上第一个蠕虫名叫Creeper(爬行者),它诞生于1971年,通过ARPANET传播。ARPANET就是当今互联网的前身,由美国国防部高级研发计划署资助,最初用于连接军事目的(连接北美防空网络)研发的。
1970年的ARPANET节点分布,主要是大学和科研机构
Creeper有两个版本,最初的版本只是通过ARPANET在各个大型机之间移动。计算机学家Ray Tomlinson对它进行了一些修改,让它不仅能够移动,还会在经过的大型机上留下一个自己的副本并继续传播,这个改进的版本被认为是世界上第一个计算机蠕虫。Creeper是为了研究计算机程序自我复制和传播可能性而被创造出来的(这又回到刚开始冯·诺依曼的自我复制自动机理论),它只会在经过的计算机的终端上留下一行字,叫“I’M THE CREEPER : CATCH ME IF YOU CAN”,除了留下一行字之外并没有破坏性。
被打印到纸上的屏幕回显内容,最后一行就是Creeper的“留言”
因为是用于研究目的,Creeper的传播是受到控制的。它只感染了最多28台计算机,而且是经过管理员许可之后才这么做的。Creeper还催生了世界上第一个反病毒程序。第二年,也就是1972年,还是Ray Tomlinson,编写了一个叫Reaper程序,专门用来在ARPANET上清除Creeper程序。
Ray Tomlinson(1941年4月23日 – 2016年3月5日)
关于Ray Tomlinson这个人还可以再多说两句,他现在主要以电子邮件之父的身份被大众认知。现在我们用的电子邮件地址的格式“用户名@主机名”就是他发明的。为了纪念Ray Tomlinson对于计算机和网络技术的贡献,2022年,美国将每年的4月23日——Ray Tomlinson的生日——定为电子邮件国家纪念日(National Email Day)。不仅是电子邮件,他对于计算机和网络领域另一个贡献极为重要但可能并不为公众广泛认知,那就是他设计了TCP建立连接时的三次握手机制(SYN-SYN/ACK-ACK)。
TCP协议建立连接时的三次握手,有学过计算机网络相关课程的朋友一定不陌生
无名的“空间占据者”
然后是第一个被有意开发出来的恶意计算机程序,它没有名字,是1971年一名伊利诺斯大学的研究生写的。它的作用就是循环检测计算机上的可用存储空间,然后建一个和这块空间一样大的文件,把可用空间全部占满。如果此时用户往磁盘上写文件,系统就会报告存储空间不足,请求删除部分文件。而用户要是真的删除了一些文件腾出空间,它会立刻继续把这部分空间也占满。但这个恶意程序它没有传播能力和驻留能力,系统重新启动它就不再运行了。
无限繁殖的“兔子”
时间来到1974年,这一年诞生了一个名叫“兔子”(Rabbit,或者Wabbit)的恶意程序。它只做一件事:利用操作系统的fork指令在死循环里创建海量的进程分支,直到把系统资源耗尽。这个恶意程序取名“兔子”寓意其像兔子那样可以快速增殖。
动画电影《疯狂动物城》里快速增长的兔子镇人口数,象征着兔子超强的繁殖能力,不知道当看电影的时候有没有Get到这个点?
fork是unix系统里创建进程分支的命令,Windows操作系统不支持这个功能。我年初在机组发过一个类似原理的玩意,也是通过递归的方式无限创建进程,可以在一分钟之内把计算机的资源耗尽。
也算是某种新型“赛博灯泡”吧
运行效果
恶作剧“麋鹿”
就目前我查到的资料来看,事实上的第一个同时具备传播能力和破坏功能,也就是真正意义上的“计算机病毒”,已经不太可考了。但第一个在大学和科研机构之外的社会面传播的计算机病毒是知道的,叫Elk Cloner,是由一个15岁的高中生在1982年写的。这是一种感染APPLE II电脑的APPLE DOS操作系统的引导区病毒。
它的原理大概是这样的:由于APPLE II电脑没有硬盘,依靠操作系统软盘启动。系统启动完毕之后操作系会驻留内存,此时就可以更换装有其他软件的软盘进行工作。Elk Cloner运行之后会随着操作系统常驻内存,一旦检测到插入了没有被感染的软盘,就感染这张软盘的引导区。而如果这张软盘后来再被用于引导计算机,它又可以继续运行并常驻内存,继续感染其他软盘。
这小孩最初就是为了好玩,把自己写的这个病毒和一个游戏捆绑到一起,当这个游戏累计运行了50次的时候病毒就会触发,在电脑屏幕上显示一首他写的诗。这个病毒本身除了感染引导区和显示这首诗之外其实并没有更进一步的破坏行为,但感染引导区的行为会覆盖软盘的保留扇区,导致数据丢失。这个病毒的历史意义在于它是第一个社会面传播的计算机病毒,再加上当时根本就没有所谓杀毒软件这个玩意,导致Elk Cloner病毒造成了相当大范围的传播。
ELK Cloner病毒触发之后的屏幕输出,显示了病毒作者创作的一首糟诗
“欺骗”计划
计算机病毒也被用于政治对抗。1982年,CIA主导了一个名为“欺骗”的计划(The Deception Program)。CIA利用了KGB渗透到北美的间谍,任由他盗取了由加拿大开发的包含逻辑炸弹的天然气管道控制软件。这个逻辑炸弹的作用是在特定的条件下会将管道的压力提升一倍,但依然显示正常读数。1982年六月,西伯利亚天然气管道发生了严重的爆炸事故,这起爆炸事故被认为是当时“有史以来最猛烈的非核爆炸和火灾事故”(据说甚至可以从太空轨道上看到爆炸的火光)。美国方面一些人认定这次事故是“欺骗”计划的成果,但CIA并未对此予以证实,苏联方面则予以否认,相关人士表示当时苏联境内的天然气管道全部都是人工控制或者模拟系统控制的。苏联方面还宣称爆炸并未造成严重后果,造成的破坏在一天内就得到修复。不过无论成功与否,这次行动标志着针对计算机系统的攻击和计算机病毒早已被用于政治目的。
这件事被记录在《At the Abyss: An Insider’s History of the Cold War》一书中,作者托马斯·里德曾在里根执政期间担任总统顾问
意外泄漏的“大脑”
第一个能够感染现代个人电脑的计算机病毒诞生于1986年,名为Brain(大脑),它可感染IBM PC安装的MS-DOS操作系统。在一些资料里称Brain是世界上第一个计算机病毒,但实际上它只是世界上第一个感染IBM PC个人电脑的病毒。Brain也是一种引导区病毒。根据编写者的说法,它最初是用作一款医疗监控软件的防盗版措施,本应只感染使用了盗版软件的电脑。但可能是程序逻辑不严密,导致发生了意料之外的传播。
Brain电脑病毒的二进制内容
十三号星期五
DOS时代早期的另一个知名的计算机病毒叫耶路撒冷,我们更熟悉的是它的别名:黑色星期五。顾名思义,病毒的触发条件是当前系统时间是13号而且是星期五,首次发作是在1988年5月13日,效果是用户每运行一个文件,病毒就会删除这个文件,还会大幅拖慢系统运行速度。
病毒本体以.COM文件(DOS可执行命令)的形式存在,运行后常驻内存,无回显
病毒常驻内存之后,会感染每一个在此期间运行的可执行文件,可以看到被感染的文件在运行前后的长度发生了变化
.COM和.EXE文件都会被感染,长度增加
将系统时间修改为满足13号且是星期五之后,再次运行被感染的文件时,该文件会删除自身
风靡一时的“CIH”
然后就是我们熟悉的“CIH”病毒。这个病毒一般被提到的时候会被称为“第一个可破坏计算机硬件”的病毒。最初版本的CIH被设定为每年4月26日触发恶意行为,和切尔诺贝利核电站事故是同一天。它感染Windows95/98/Me系统下的可执行文件,并采取了一个规避检测的手段:它将自己分成若干片段,写入PE文件的全零字节的填充段里,因此被感染的文件的长度不会发生变化。CIH有两种破坏手段,首先是用零字节覆盖硬盘0号扇区的前1MB内容,直接将分区表抹除;其次就是“恶名远扬”的破坏BIOS芯片的功能。它会用垃圾数据填充BIOS芯片的FLASH ROM存储,直接导致计算机无法启动。但实际上CIH抹除FLASH ROM的功能仅限特定的芯片,并非在所有的硬件上都可实现。
CIH病毒是当年计算机行业的一件大事,几乎所有科技媒体和刊物都在关注。因其设定为每年4月26日执行破坏功能,刚好和切尔诺贝利核电站事故是同一天,也被称为“切尔诺贝利病毒”
因CIH病毒强大的感染能力和隐蔽能力,当时主流杀软都推出了CIH专杀工具。不知道当年你的电脑是不是中过招呢?
Office宏病毒的始祖
时间来到1995年。这一年微软的办公软件Word的新版本Word 95随着Office 95正式发布,同一年也诞生了世界上第一个广泛传播的Office宏病毒(Macro virus):Word concept。先说说什么是宏(Macro),这是一个自动化功能,在1989年被引入Word 5.0版本。它可以“录制”并“回放”用户的操作,宏的底层实现是一套基于BASIC语法的Office应用专用的编程语言,就像Quake C那样。在Office 97之前这个语言被称为WordBASIC,Office 97开始更名为Visual Basic for Applications(VBA)并一直使用至今。
Visual Basic for Applications
说回Word Concept,这个病毒没有恶意或者破坏行为,只会在文档打开的时候弹出一个消息框,显示一个数字“1”。如果打开这个病毒的代码,会发现在主函数里只写了一行注释:“That’s enough to prove my point”(这足够证明我的想法)。它的传播方式是感染Word的模板文件normal.dot,这样任何通过“另存为”功能保存的doc文档都会携带这个病毒。由于之前没有先例,Word Concept在当年造成了相当广泛的传播,甚至曾经出现在微软发送给其他公司的Windows 95兼容性测试光盘里,1997年还一度占了报告的病毒事件总数的一半。从此至今,使用VBA实现并通过Office文档传播的宏病毒成为病毒类型中的一个大类,在其后造成了很多重大的病毒传播事件,或者作为攻击渗透的重要环节。
VBA可以看作是微软OFFICE软件的“控制台”,通过编写代码来控制OFFICE文档和其他内部对象来实现自动化。但我真的好奇,它的便利性到底能不能和这将近30年间它引发的安全问题相抵
“冲击波”和“反冲击波”蠕虫
随着互联网的普及,千禧年前后诞生了很多传播范围很广造成很大危害的蠕虫,比如爱虫、求职信、HAPPY99等,但我想挑其中我认为最有意思的一个来说。可能一些“老网虫”还有印象,2003年的时候有一个很有名的蠕虫病毒叫“Blaster”(冲击波)。
莫里斯(Morris)蠕虫,被认为是世界上第一个通过Internet传播的蠕虫病毒,诞生于1988年,利用了两个服务的缓冲区溢出漏洞以及弱口令传播
“ILOVEYOU”蠕虫(国内称为“爱虫”),通过邮件附带的恶意VBS脚本文件传播
“HAPPY99”蠕虫,通过直接修改目标主机的Winsock库文件实现传播,比较粗暴
“Blaster”蠕虫是一个很典型的“N-day”漏洞利用范例:它利用的其中一个漏洞是通过对微软发布的Windows补丁包进行逆向分析发现的——通过对补丁进行逆向分析,对比补丁修补替换之前和之后的库文件的差异发现的。这是一个DCOM RPC服务的可实现远程执行(Remote Code Execution,RCE)的缓冲区溢出漏洞。也就是说,在蠕虫传播的时候,它利用的漏洞实际上已经被官方修补过了。但大家也都知道,2003年的时候网络远没有现在这么发达,一般用户不太会用宝贵的拨号上网时长去微软官网下载补丁,所以互联网上还有大量的主机存在这个漏洞。
Blaster蠕虫的二进制内容,包含了一段“写给比尔盖茨的信”
“Blaster”蠕虫会利用这个漏洞将自己上传到受害主机上并运行,通过写入注册表开机启动项实现驻留。和当时广泛利用邮件传播的蠕虫不同,“Blaster”蠕虫通过扫描本地局域网的其他主机实现传播。它的危害手段是控制受害主机在设定的时间段向微软的Windows Update网站发起DDoS攻击,导致网站无法访问,从而进一步阻止用户获得能修补漏洞的更新。
有意思的地方在于这件事的后续,国内有人利用和“Blaster”完全相同的漏洞和传播手段,做了一个“反制Blaster”的蠕虫。这个“反Blaster”蠕虫首先会清除本地已经感染的“Blaster”病毒,从指定的网站下载一个简易的修补程序,然后尝试从微软官网下载漏洞修补补丁。之后它也会像“冲击波”病毒那样,扫描本地网络,使用相同的漏洞传播到其他主机,做完这些之后这个反制程序会删除自身。在编写本文期间我找到了这个“反Blaster”蠕虫的业务控制部分代码。
“反Blaster”蠕虫的部分代码,会检测本地操作系统使用的语言“看人下菜碟”
听上去似乎很美好,但实际并非如此。原版的“Blaster”病毒的攻击功能有所节制,仅在每天下午发动DDoS攻击,而且会设置长达数分钟的间隔;而这个反制修补程序会开300个线程疯狂PING扫描内网网段以及尝试从微软官网下载补丁,造成了比原“Blaster”蠕虫更严重的网络带宽占用和DDoS流量,这一点明确写在了代码里。而“利用和蠕虫病毒相同传播方式的反制蠕虫”精确应验了1975年那本小说里提到的情节。
“反Blaster”蠕虫代码片段,作者设置了300个并发线程用来扫描本地网段
还有一个有趣的事情是,在“反Blaster”蠕虫的代码里有一句带有拼写错误的英文:“Welcome Chia”,作者想写的其实是“Welcome To China”。所以这个蠕虫在英文世界里被命名为“Welchia”而不是“Anti-Blaster”“Kill Blaster”之类的。
熊猫烧香
2007年初,在国内的网络上有一个现在我们很熟悉的蠕虫开始流行,那就是熊猫烧香。受到感染的计算机的图标都变成了一只烧香叩拜动作的熊猫。熊猫烧香蠕虫在当时造成了相当范围的传播,但它其实并没有利用任何系统漏洞(所以当时的黑客圈子都很鄙视这个病毒的作者)。
还记得这只熊猫吗
熊猫烧香使用三种方式实现感染和传播:
在驱动器根目录建立autorun.inf文件设置自启动,如果在资源管理器里直接双击点开硬盘,病毒就会自动运行,这也是最常用的U盘病毒传播方式;
病毒运行后会利用Windows共享服务在局域网内横向移动。用自带的口令字典扫描局域网内的其他主机。如果能够使用弱口令成功登录,就将自己复制到远程计算机上实现扩散;
病毒除了感染本地的可执行文件,还会感染.html和.asp等Web页面和Web应用文件,将病毒的下载链接注入到这些文件中,实现“挂马”。如果被感染的主机是一台Web服务器,那么所有访问该服务器的客户端都会被感染,这也是熊猫烧香最为强力的传播方式。
此外,熊猫烧香还采用了多种手段对抗杀软。比如在操作系统中搜索运行中的杀软进程并尝试将其关闭。病毒作者还架设了专门的升级服务器用于更新,每当杀毒软件捕获了病毒特征,他就在服务器上部署新的免杀版本,最频繁时一天更新八次。
“熊猫烧香”案宣判的新闻报导。主犯李俊等人出狱之后又由于开设网络赌场而“二进宫”
今天,计算机和互联网较千禧年那会儿已经发生了很大变化,病毒、木马、蠕虫等这些能够破坏计算机系统的程序,其目的也不再仅仅是破坏,而是有了更复杂的目的。在后边我们还会再提到这些。
反制措施
杀毒软件
首先要明确一个事情,就是“杀毒软件”和“防病毒软件”本质是两个东西,在行业早期只有杀毒软件,它只能清除已经感染的病毒,并且在一定程度上修复病毒造成的破坏(比如修复被感染的可执行文件以及被破坏的引导区)。早年用过江民KV200或者KV300的朋友可能还有印象,这套软件分为两张软盘:一张盘用于启动系统,另一张盘是杀毒工具以及病毒库。后来软盘空间不够,增加了一张光盘。之所以需要用自带的软盘启动,就是为了消除可能的潜在的引导区病毒的影响。
KV300+的时候还只是一张软盘,包括了无毒引导、杀毒、病毒库和反盗版功能,实在是难为了这1.44MB的容量
到KV3000的时候就升级成了两张软盘加一张光盘的配置,其中两张软盘中一张盘是无毒启动盘兼密钥,另一张是杀毒工具和病毒库。光盘的内容则是Windows平台的防病毒软件
杀毒软件实际上的工作原理很简单:比对文件内容是否匹配已知的病毒库特征,一旦匹配,就使用相应的清理功能将病毒代码删除,修复被感染的文件,或者使病毒失能。而这个特征大多数情况下是一段具备独特性的数据或者字符串,也可能是整个文件的哈希。
在DOS下的KV300+杀毒软件运行界面
这里还有个有意思的事。2003年,当年还是初生的我拿VB6写了一个恶作剧小程序,作用是将自己复制到system32文件夹下,并加上/d的启动参数添加到开机启动项里。功能就只有一个:关机。写完之后我拿exe捆绑机把它和当时很流行的皮卡丘打排球的小游戏捆绑到一起,发到论坛上去了。
我估计那会儿上微机课的小孩儿应该都玩过吧?
然后过了一阵子,我发现升级完自己电脑上的KV3000病毒库之后杀毒软件把我硬盘上编译好的这个恶作剧程序当做病毒杀了,还给了一个分类码:joke.vb6.destroy(destroy是当时我给这个玩意起的名字,但没用作文件名,只出现在模块名里)。想来应该是有人把它作为样本上报给杀毒软件了。我就忽然很好奇杀毒引擎的原理,因为自己就有这个程序的源码,我就在其中随便添加了几行无关的垃圾代码,再编译之后杀毒软件就认不出来了,由此推测当时杀毒软件扫描这个文件时应该是通过整个文件的哈希来判断是否是病毒的。现在的杀毒软件一般会从多个维度做判断和检测(例如PE文件的导入表哈希),减少误报和漏报。
防病毒软件
在说防病毒软件之前可以先聊一聊2024年七月份微软整的大活儿。2024年7月19日,世界范围的Windows系统开始批量蓝屏。导致这一现象的是一个名为csagent.sys的驱动文件,这是企业版(主要是外国企业使用的)Windows预装的CrowdStrike公司出品的主机防护软件Falcon的监控驱动。而错误代码是PAGE_FAULT_IN_NONPAGED_AREA,我一看再熟悉不过了。十年前我们做Windows主机监控驱动的时候经常遇到这个问题,这是由于驱动在内核层读写了错误的内存地址造成的。
由于CrowdStrike的这款软件对华禁售,所以这次蓝屏事件并未对国内造成冲击。事后第三方机构分析复盘推测是由于其中的一个正则表达式测试不完全导致的程序BUG
但是这就有了一个问题:为什么防病毒软件的监控一定要运行在内核层呢?这出了问题电脑直接蓝屏连用都没法用了不是耽误事么?我们日常用的Windows以及大部分操作系统分为用户层和内核层两层。绝大多数正常的应用程序运行在用户层(在Windows里也叫ring3),一般情况下无需关心系统底层原理和硬件层的资源是什么样的,只需要通过系统提供的编程接口(API)调用就行了。但这也限制了应用程序的权限以及能够获取到的信息。如果需要获得系统更底层的状态,或者需要和硬件打交道,那就需要进入内核层,或者也叫驱动层(在Windows里也叫ring0)。
近年来随着直播和电竞的兴起,游戏外挂产业日渐膨胀。最初的外挂还只是在应用层模拟键鼠输入以及篡改网络数据包,而随着检测和反检测手段的演进,以及保护和破解的对抗,在PC单机上的对抗早已进入操作系统内核空间。目前主流的反外挂软件都有内核级监控,并要求洁净引导,以防止bootkit级外挂
以窗口服务打比方的话,应用层程序相当于来窗口办理业务的顾客,所有的请求都需要通过窗口业务员(也就是应用层API)沟通,通过他们申请和调配所需的资源和信息,窗口业务员能够提供的服务和内容是相对有限的,而且会屏蔽一些细节,比如操作系统的内部状态;而驱动层程序则相当于顾客跑到柜台后边,想要什么直接自己拿,这样就可以获得更多应用层API无法获得的操作系统内部信息以及其他顾客的信息。
由于在应用层难以获得同时运行的其他进程的信息以及操作系统内部状态信息,杀毒软件必须进驻操作系统的内核层才能获取到维护系统安全所必须的监控数据,比如应用程序的网络连接、域名访问、文件操作、注册表操作以及对其他进程的行为(是否存在可疑的进程注入等)。而恶意软件也同样会通过各种手段进入操作系统的驱动层,以获取更大的控制权和敏感信息。
在本文发布期间,微软“宣布对Windows的安全性和弹性进行重大改进”,其中就包括逐步收回防病毒软件的内核权限。去年7月全球范围的蓝屏事故正是这项改进的推动力
由于杀毒软件的存在,使得病毒的开发者也要想办法避免被杀软查杀(现在一般叫“免杀”),比如通过变换、加密、压缩以及“加壳”等方式抹除数据层面的静态特征,让杀毒软件无从判断。因此防病毒软件应运而生。这类软件会监视系统的运行状态,并且会对重要的目录、文件和内存空间实施保护,一旦有进程产生了危险或者可疑行为就会触发告警。
这里可以做一个实验:试着在电脑上用浏览器访问这个URL:
https://iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com
如果你的电脑装的是卡巴斯基,访问的时候很可能会提示你检测到恶意行为或者访问可疑网站。这个域名是在2017年爆发的利用“永恒之蓝”漏洞的勒索软件Wannacry的kill switch,目前已经被网络安全公司接管,不包含任何有害内容。第一版Wannacry病毒会先尝试请求解析这个域名,如果无法解析成功,就会实施接下来的加密勒索行为。
卡巴斯基会阻断访问该网址的请求
当时英国的一名安全研究员在分析样本的时候发现了这个行为特征,于是就自己把这个域名注册了下来,让它能够被解析成功,缓解了wannacry的第一波破坏行为。这个实验的目的是想告诉大家,防病毒软件的监控是全方位的,在本例里就是通过对DNS请求内容的监控捕获到带有病毒特征的域名请求行为。在wannacry病毒刚刚爆发,漏洞还没有修补的时候,各大杀毒软件公司都临时更新加了类似这条域名请求特征触发的检测规则。后来随着漏洞修补和病毒特征进一步明晰,大部分安全厂商都撤掉了这条规则,但少数厂商的病毒特征库中还保留着。
第一期我们介绍了关于计算机病毒的发展史,第二期将关注网络攻防相关的知识。
参考资料
https://en.wikipedia.org/wiki/Computer_virus
https://en.wikipedia.org/wiki/Computer_worm
https://en.wikipedia.org/wiki/Trojan_horse_(computing)
https://en.wikipedia.org/wiki/ARPANET
https://en.wikipedia.org/wiki/Gregory_Benford
https://en.wikipedia.org/wiki/The_Shockwave_Rider
https://en.wikipedia.org/wiki/Creeper_and_Reaper
https://en.wikipedia.org/wiki/Ray_Tomlinson
https://en.wikipedia.org/wiki/Fork_bomb
https://en.wikipedia.org/wiki/Elk_Cloner
https://en.wikipedia.org/wiki/Morris_worm
https://en.wikipedia.org/wiki/ILOVEYOU
https://en.wikipedia.org/wiki/Happy99
https://en.wikipedia.org/wiki/Melissa_(computer_virus)
https://en.wikipedia.org/wiki/Welchia
https://www.youtube.com/watch?v=u3k-8kJ54sg
https://tech.sina.com.cn/soft/2000-04-14/141.html
https://tech.sina.com.cn/i/2007-09-25/02191759477.shtml
https://www.secrss.com/articles/72594