欢迎您访问科普小知识本站旨在为大家提供日常生活中常见的科普小知识,以及科普文章!
您现在的位置是: 首页  >  生活科普

数字空间的幽灵

科普小知识 2022-07-10 15:13:42
...

计算无处不在。

进入计算机房,听着服务器排成一排的墙之间风扇的噪音,你似乎可以闻到0和1在*处理器和内存之间的连续流动。从计数和计数到今天的计算机,我们用来计算的工具终于开始有质的飞跃。电脑可以做越来越多的事情,甚至超过它们的制造商。上世纪末,深蓝凭借其前所未有的搜索和判断国际象棋的能力,成为第一台击败国际象棋世界冠军的计算机,但它的胜利仍然依赖于人类大师丰富的国际象棋知识。然而,仅仅过了10年,沃森已经能够用自己的算法“理解”这个问题,然后有针对性地在大量数据库中找到相关答案。从长远来看,这种工具将在更多方面超越它的制造者。所有这些都来自越来越复杂的计算。

计算似乎无所不能,就像一个新的上帝。但即使是这个“上帝”也无法逃脱逻辑设定的界限。

图灵是第一个发现这个的人。

当罗伯特·托马斯(Robert Tomas)在1971年写下他的“小实验”中使用的代码时,他当然没有想到他写的爬行代码会在几十年后开启一个“黑色产业”。现在,在我们面前的电脑上,在我们手中的智能机器上,在广阔的互联网上,有无数的幽灵在四处游荡,寻找所有有价值的信息,操纵所有可以操纵的机器。这是一个巨大的产业,同样也是一个天生防范这些幽灵的守护者。电脑病毒和反病毒软件,这两者你追我,从未停止。这是一个数学定理,注定了两者的命运。

在计算机发展的早期,计算资源非常珍贵。只有军队或大学有电脑,而且必须排队才能使用。但是这些宝贵的计算资源有时会被浪费掉。电脑不需要休息,但是人们必须睡觉。当人们不在的时候,电脑经常是空的,这导致了不均衡的需求。有些计算需要特定的数据,但如果只传输一种计算,即不均匀的数据,那就太浪费了。为了将计算资源压缩到最后一滴,需要消除这些不均衡的因素。用现代术语来说,这就是负载平衡的问题。

1969年见证了一种新奇事物的诞生。为了共享资源,美国军方开发了ARPANET来连接分散在美国各地的军用计算机。那是互联网的石器时代。我们现在习惯的各种概念,如电子邮件和网络协议,在当时并不存在。程序员手中掌握的是几台大型计算机和连接它们的原始网络。

然而,缺乏条件不能阻碍程序员,他们是开拓新领域的先锋。由于信息可以通过网络流动,运行的程序本身可以在计算机之间传输吗?如果可行的话,一个程序可以在计算机忙的时候自动跳到一台空闲的计算机上,如果这台计算机上没有需要的数据,它也可以自动跳到一台有相应数据的计算机上执行。“自动程序转移”的想法可以同时解决需求和数据不均衡的问题,是不是很美?

那时,托马斯正和他在一家名为BBN的公司的同事们一起为阿帕网的计算机编写操作系统。这个操作系统被称为TENEX,它具有内置的网络功能。托马斯想知道他是否能使用相应的函数来编写一个可以自动传输的程序。

他成功了。

他写了一个叫做爬虫的程序。它的功能很简单:首先读取当前计算机上的文件,然后在网络上找到另一台计算机,打包并传输程序本身和附加文件,在当前计算机上删除程序本身,最后留下一句话:

如果可以,请过来抓我。)

-我?-走开,不是你!-我不高兴,我要爆炸了...(来自gamepedia的图片)

爬虫表明“自动程序转移”确实是可行的。然而,问题是发布的爬虫不是很整洁,在Apache上跳来跳去很烦人。

但最糟糕的还在后头。几天后,一个新版本的爬虫出现了。它不会在传输时从原始计算机中删除自己,也就是说,它会将自己复制到另一台计算机上。据说托马斯的同事雷·雷·汤姆林森是发起人。可以说,新版本的爬虫符合病毒的广义定义:在用户不知情的情况下自我复制的程序。

像所有的病毒一样,新版本的爬虫会引起很大的麻烦:它会很快感染网络上的所有计算机,即使人们在一台计算机上清理它,他们也会很快被网络上的另一台计算机感染。也许出于人道主义的目的,汤姆林森很快编写了另一个叫做“收割者”的程序,它基本上是爬虫的一个变种,会以同样的方式感染网络上的计算机。然而,在感染完成后,汤姆林森将试图从计算机中移除爬虫,并最终自己关闭。

这是第一个计算机病毒。

在计算机发展的早期,从玩笑到犯罪,由于用户群相对较小,歹徒们还没有时间瞄准这个领域。当时,大多数病毒都是为了炫耀他们的技术或进行无害的恶作剧而编写的。因此,电脑病毒在当时通常不会造成多大的伤害,而且经常会带来一点幽默。例如,1982年出现的麋鹿克隆病毒,“伤害”会自动显示一首诗。还有1990年左右肆虐的级联病毒,它将“丢弃”终端命令行的字符(当时的界面几乎只是命令行)。这些病毒通过软盘传播,现在已经成为时代的眼泪。

其他病毒是坏运气和坏运气结合的结果。例如,第一个特洛伊木马病毒动物出现在1975年。本体是一个猜谜动物的小游戏。为了自动更新,作者编写了另一个小程序OPERATE,它会将自己和ANIMAL复制到当前用户可以访问的所有文件夹中,包括共享文件夹,以便与其他用户共享。每次用户运行动物游戏,它都会自动执行PERVADE程序来完成复制。通过共享文件夹,整个程序完成了从用户到用户的感染。现在,这应该被称为P2P自动更新推送。另一个例子是1986年出现的脑病毒。这原本是一种防盗措施,但在作者添加了自我复制功能后,它变成了一种名副其实的病毒。

随着计算机的普及,背信弃义的人也开始出现,病毒变得越来越具有破坏性。强行关闭计算机和删除文件是很自然的,人们已经通过加密文件来索取赎金。甚至直接破坏计算机硬件的病毒也出现了,如臭名昭著的CIH病毒,这是一个经历过20世纪90年代洗礼的人无法摆脱的噩梦。

进入21世纪后,犯罪分子编写病毒的目的逐渐发生了变化,从单纯的破坏变成了获利。有许多方法可以将感染转化为益处。最直接的是勒索软件。他们通过强大的加密“劫持”重要的数据和操作系统。只有在受害者支付“赎金”后,他们才能“赎回”正常使用的电脑。最近的万纳瑞就是一个例子。另一种方法是搜索和拦截信用卡账号和密码等有价值的信息,然后直接从这些重要信息中获利。另一种方法是操纵受感染的机器,并将其用于其他恶意目的,如DDOS。

得益匪浅的是,病毒的始作俑者也变得团队合作和全球化,对信息安全构成了重大威胁。只要是能运行程序的机器,它们就不会松手,比如新兴的物联网,一种家用电器网络。因为物联网上的设备通常不更新并且有后门,所以入侵非常容易。目前,Mirai未来组合最大的僵尸网络(在日语中是“未来”的意思)主要由物联网设备组成。就规模而言,这种模式似乎确实是恶意软件的未来。

除了小偷,还有士兵在追踪病毒。为了开展情报活动,主要国家在计算机安全研究上投入巨资,并编写了前所未有的复杂病毒。危险远远超过犯罪团伙。最近,美国国家安全局“储备”的大量漏洞和黑客工具被泄露,这进一步说明了国家权力可以造成多大的损害。其中的一个漏洞,“永恒的蓝色”,给我们带来了勒索软件WannaCry,瘫痪了世界各地的许多组织。

有了矛,就必须有盾,不管有没有盾,一个接一个。由于存在病毒,用户需要清除病毒并安装防病毒软件。可以说反病毒软件跟随着计算机病毒。杀毒软件的任务是识别和清除病毒。

面对如此棘手的病毒,人们自然希望一劳永逸地寻求解决方案。你能不能写一个完美的杀毒软件,不仅能杀死所有已知的病毒,还能杀死未来可能出现的任何病毒?

然而,判断计算机程序特定行为所涉及的问题基本上不可能完美解决。正如我们以前看到的,没有一个程序能够判断任何代码在执行时是否会出错。同样,也没有这样的反病毒软件,它可以完全区分任何计算机病毒,无论是已知的还是未知的。这实际上是弗雷德里克·科恩在1987年证明的定理。他也被称为计算机病毒防御技术的创始人。对于本系列的读者来说,这个定理实际上是关机定理的一个推论,这可能并不出人意料。

因此,对于任何反病毒软件,至少会出现以下两种情况之一:要么正常程序作为病毒被清除,要么病毒在眼皮底下被释放。前者被称为过失杀人,后者被称为过失杀人,两者互为因果。当然,缺乏完美的杀毒软件并不妨碍我们改进和制造越来越复杂的杀毒软件。除了无休止的犯罪,可以说反病毒软件产业永远不会停止发展。

那么,人们如何一步一步改进杀毒软件呢?杀毒软件的目标是区分普通程序和计算机病毒。不同的病毒检测和杀死技术实际上是区分病毒和正常程序的不同方法。

最早的反病毒软件可以追溯到1987年。当时,病毒非常简单,数量非常少。将它们与普通程序区分开来也非常简单。当时病毒通常有一些特定的程序代码来执行感染和攻击的步骤。安全研究人员可以从不同的病毒中定位并提取这些特征代码(也称为“特征码”),并将它们放入防病毒软件的数据库中。防病毒软件的工作是检查每个文件是否有相应病毒的签名。如果是这样,十有八九文件包含病毒。

很难辨认出虚幻的结局,但是路比它高一英尺,魔法比它高一英尺。当然,病毒制造者也观察到了这种现象。他们开始尽最大努力制造不同的变体并改变病毒代码,例如添加在病毒体内没有实际效果的所谓“花指令”,或者将不同的指令转换成具有相同功能的指令,以避免被防病毒软件检测到。然而,这种方法,即使它愚弄了反病毒软件一段时间,在新病毒被研究者捕获和分析之后,反病毒软件可以被更新以检测和杀死新的变种。

自然,病毒制造者不会放过它。由于签名指的是病毒代码的固定部分,如果每次病毒传播时特定的代码都发生变化,那么它就不能逃脱签名杀死的例行程序吗?沿着这种思路发展的病毒也被称为自我修饰病毒。

最早的自我修饰病毒出现在1260年,最早出现在1990年。它由两个模块组成:代码模块和解密模块。代码模块通常是加密和压缩的。当病毒被激活时,它将首先运行解密模块来解密包含真实感染和破坏指令的代码模块,然后执行代码模块。当病毒感染其他文件时,它会随机干扰解密模块的一些内容,形成一个新的解密模块,然后用它来重新加密代码模块。这种复杂的结构可以确保每次感染时出现的病毒体与过去完全不同,大大增加了检测和杀灭的难度。这种相对简单的自我修饰病毒也被称为多态病毒。

然而,这项小小的技能并没有难倒安全研究人员。就像自然界中真正的病毒一样,即使多态病毒变异很快,仍有一些关键部分保持相对稳定,即解密模块。研究人员很快学会了使用解密模块的特性来识别多态病毒。迫使多态病毒采取更多措施来破坏它们自己的代码,例如自动添加插花指令和替换等价指令,或者自动重新排列它们自己的代码。然而,安全研究人员很快就想出了对策。毕竟,这些变化不会太大,测试也不会太难。

最后,病毒制造者只有一个希望:写一个病毒,几乎病毒的每一个代码在每次被感染时都会有很大的变化。这样,就不可能在代码级别检测到病毒。

说起来容易,但具体怎么说呢?

黑客们想出了一个孤注一掷的计划:每次他们想感染一个新文件时,他们首先将病毒本身转换成某种“中间代码”,然后以另一种完全随机的方式编译中间代码,得到一个全新的病毒代码。这个中间代码可以用无数种方式编译,但是结果代码在执行时表现完全相同。以这种方式编写的病毒也被称为变形病毒。通过首先转换成中间代码,然后编译,它们“变形”成各种特定的代码,但是它们的特定行为是完全一致的。

最著名的变形病毒明喻于2002年首次出现,给安全研究人员带来了很大的麻烦。因为它可以“转换”成完全不同的代码,这使得签名提取方法基本上无效。幸运的是,变形病毒的开发非常复杂,尤其是“变形”所需的代码(明喻中90%的代码专门负责变形),因此变形病毒的数量相当少。然而,即使变形病毒的门槛很高,随着技术的进步,它最终也会被普及。即使未雨绸缪,我们也应该想办法开发新技术来对付这种新病毒。

在听了他说的话并观察了他做的事之后,安全研究人员想出了两种方法。他们的核心思想非常简单。变形的病毒会改变它们的“外部”代码,但是它们的“内部”行为,即病毒具体做什么,不会改变。如果有一种方法可以揭开特定代码的面纱,检测它们的“实际行为”,也就是语义,那么成功地检测并杀死这些病毒难道不是可能的吗?

第一种方法是尝试恢复变形病毒的“变形”过程,并尝试将它们修复成相同的形式。研究人员首先分解变形病毒的代码,然后用程序分析其逻辑结构。不管病毒有多畸形,它的功能都不会改变,所以具体的逻辑结构不会改变太多。只要它能识别其逻辑结构的相同部分,它就能识别相同种类的病毒,不管它们是如何变形的或者代码是如何不同的。当然,分析一段代码的逻辑结构并不容易。研究人员可以利用当时编译器的一些优化编译功能来消除无用指令,并区分那些本质上等价的代码。最终结果相当成功。通过分析逻辑结构本身,可以有效地检测和杀死变形的病毒。

研究者提出的第二种方法更直接。既然我们想检测病毒的“实际行为”,为什么不让它实际“运行”并看看它会做什么呢?当然,我们实际上不能在用户的计算机上运行可疑文件,否则,如果可疑文件确实是病毒,那么麻烦就大了。研究人员所做的是模拟一个病毒可以运行的环境,也称为“沙箱”,然后模拟病毒在这个环境中的运行,观察它的行为并记录下来。病毒通常有一些特征行为,例如多态病毒访问和重写自己的代码,而变形病毒执行“变形”步骤。对于防病毒软件,对于可疑程序,它可以首先在沙箱中模拟程序。如果观察到的行为符合病毒的特征行为,那么程序很可能包含病毒。这项技术也被称为砂箱压井技术。但是因为在沙盒中运行程序需要大量的计算资源,所以它们只能用于一些特别重要的位置或特别可疑的文件,如系统文件和内存。

“沙箱”最初是一种供儿童玩耍的设备。不管有多乱,这只是沙箱的内部问题。

事实上,沙盒杀死技术的使用并不限于此。因为它检测的不是特定的代码,而是程序的行为,理论上,这种技术可以用来检测未知的病毒,领先于病毒编写者。不同的病毒有不同的特征行为。一些病毒检查操作系统的语言和当前时间,然后决定是否感染它。一些病毒会试图将自己注册为操作系统的底层驱动程序来隐藏自己。一些病毒会试图列举所有程序并准备感染它们。有些病毒会列举特定的文件并对其进行加密,这是敲诈的必要步骤。不同的行为有不同的风险。面对可疑文件,防病毒软件可以首先在沙箱中运行它们并记录它们的行为。如果这些行为通常类似于已知的病毒,则该文件可能包含病毒。即使没有检测到相应的病毒,如果记录的行为过于危险和可疑,防病毒软件也可以标记并隔离它,以便进一步研究。这就是所谓的“启发式杀戮技术”。具体来说,沙盒使用动态启发式技术,但也有所谓的静态启发式技术,它只需要观察文件的代码,不需要特定的执行。随着最近机器学习技术的兴起,安全研究者可以进一步提高启发式技术的可靠性。

启发式技术是好的,但是它不是无懈可击的,因为它不能完全确定测试结果是对还是错,并且可能错误地杀死正常的程序。毕竟,许多正常的程序,尤其是系统底层的驱动程序,也会做出一些类似于病毒的行为,但它们不是病毒,对计算机的正常运行至关重要。对这些文件的意外伤害会导致许多问题,并且碰巧病毒倾向于感染靠近底部的这类文件以避免被发现。我们有时会听到这样的消息:某个防病毒软件在更新后突然杀死了关键的系统文件,这种情况时有发生。更极端的是,在演习期间,甚至解放军的武器系统也被反病毒软件入侵。然而,随着技术的发展,这些事故越来越少,反病毒软件的功能越来越强大,检测和查杀技术也越来越精确。

在反病毒软件和病毒的斗争中,沙箱技术和启发式查杀技术具有重要意义,因为它首次使安全研究人员能够部分领导病毒制造者。在它出现之前,反病毒软件只能跟随病毒,但是有了这项技术,病毒制造者将不能随意编写新的病毒,并且必须对市场上的反病毒软件进行一些研究,以确保他们的新病毒不会在沙箱中被启发式地杀死。事实上,相当多的病毒现在只有在被检测到并被杀死时才被识别为“普通病毒”,因为它们被启发式技术阻止,并且不需要被明确地识别为它们的类型。

病毒制造者现在面临的问题是:我们如何避免沙箱技术?换句话说,有没有什么方法可以让病毒在执行时“意识到”它是在沙箱中而不是在真正的计算机中?

解决方案不是没有。因为沙箱是一个需要大量资源的模拟,为了减少资源的使用,反病毒软件的沙箱必须有一些缺陷。例如,如果沙箱对于模拟系统时间没有特殊处理,因为沙箱的模拟比实际执行慢,病毒可以通过测量执行一段代码所需的时间来知道它是否在沙箱中。一旦安全研究人员发现利用这一缺陷的病毒,他们就可以纠正该缺陷并重新获得领先地位。在这个战场上,追随同样趋势的不是安全研究人员,而是病毒制造者。

但沙箱毕竟是一个模拟环境,总会有缺陷。病毒还可以在攻击前等待一段时间,以避免检测到防病毒软件。一些安全研究人员有一个大胆的想法:为什么不让被测试的程序*运行,并等到可疑行为发生后再终止它呢?毕竟,要复制和传播病毒,有必要做一些特定的操作,如读取其他程序或调用一些特殊的系统功能。只要病毒在进行这些操作的时候截获,就不会有问题。这是行为检测技术。为此,防病毒软件需要使用特殊技术(Rootkit)来监控所有应用程序的每一个动作,并在它们请求操作系统执行任何任务时拦截和分析特定的请求。这项技术最初是由病毒开发来隐藏它们的踪迹,但现在它已经成为反病毒软件的武器。

当然,无休止的斗争,无论杀毒软件的技术有多好,也不能保证绝对的安全。杀戮技术越好,通常使用的资源就越多。如果对每个文件采用最先进的查杀技术,肯定会大大降低系统的运行速度,所以在具体编写软件时,安全研究人员需要做出适当的选择。既然有权衡,就有漏洞可钻。此外,病毒制造者也可以先下手为强,在被感染时先想办法杀死杀毒软件,或者利用操作系统本身的漏洞来获得对整个系统的控制,直接架空杀毒软件。随着互联网技术的发展,杀毒软件制造商可以让杀毒软件自动报告可疑文件,并尽快获得新病毒的信息。病毒制造者也可以让病毒自动更新,避免杀毒软件的查杀。病毒和反病毒软件的攻击和防御线非常广泛和不寻常。从磁盘到内存,甚至显卡,它们都是战场。然而,进攻和防守策略太多了,无论列出多少,都只能一个接一个地列出来。

然而,尽管反病毒软件现在已经成为一种非常成熟的技术,但病毒仍有其他方式感染计算机。毕竟,操作电脑的是人。与杀毒软件相比,人们有更多的“漏洞”,更容易使用。有多少人因为太麻烦而无法更新系统来填补漏洞并给病毒一个机会?有多少人看到“请检查文件”的电子邮件后,没有检查文件的来源和性质就匆匆打开附件?有多少人仍然使用密码123456,或者点击他们在网上看到的任何链接,不管它有多可疑?系统的安全性取决于最薄弱的环节。如果没有信息安全意识,无论反病毒软件有多好,都无法阻止人类死亡。