“暗物质”(Dark matter)是理论上提出的可能存在于宇宙中的一种不可见的物质,它可能是宇宙物质的主要组成部分,但又不属于构成可见天体的任何一种目前已知的物质。大量天文学观测中发现的疑似违反牛顿万有引力的现象可以在假设暗物质存在的前提下得到很好的解释。
安全的世界里也存在这样的“暗物质”,即我们说的“威胁”(Threat)。它真实存在,却又几乎不可见,它可以来自信息本身,也可以发源于人类。因为它的出现,让信息世界变得混乱,所以有人称之为“安全熵”。过去三十多年,人们对威胁的终极认知是威胁最终是可以消亡的,所以那时候提出了“天下无毒”的商业口号。但是现在,人们已经清醒地认识到,威胁已经成为信息世界的一部分,是标准的“暗物质”,它们将会随着人类文明和信息文明永远存在下去。
前面谈到安全的本质是“威胁对抗”,那么威胁是什么?这个问题看似简单,但是事实上在整个业界还没有统一的答案。
这里的“威胁”指的是信息世界里产生的有害“物质”。“威胁”与“风险”(Risk)是安全界非常常用的两个词汇,由于这两者有关系,因此在很多场景下威胁和风险是混用的。例如有的人把没有发生的威胁称为风险,这种用时间尺度来区分定义的说法是有问题的,举个例子,勒索病毒在没有爆发的时候它也应该是一种威胁,就像一个没引爆的原子弹,其存在本身就是一个极大的威胁。
再看看微软的定义:威胁是指一个系统被危害的可能性。后来微软研究员Talhah Mir又做了补充:威胁是攻击产生的,攻击是漏洞产生的,前提是在它们还没有被缓解之前。通过微软的定义可以看到,微软认为威胁就是我们常说的“黑客攻击”,这种定义也不完整。举例来说,计算机病毒也是一种威胁,很多时候它没有系统危害,而像DDoS攻击也并不是由漏洞产生的。计算机病毒和DDoS都是利用了系统的特有机制。
威胁和风险其实不是同一维度的概念,威胁是一个定性的概念,而风险是一个定量的概念。对威胁的正确认知是首先要将威胁进行分类;而对风险的正确理解是要对风险进行分级。可以把风险当作威胁定量分析的工具,或者把风险当作威胁产生的后果之一。因此,我们可以把 风险 定义为:小概率发生的或低等级的威胁事件。
讲清楚了威胁跟风险的关系,下面的篇幅里主要讲一下什么是威胁,以及威胁的本质是什么。
早期,这些威胁从信息世界里产生,只能作用于信息世界,给计算机等信息系统带来危害。而现在,信息世界不断融入人类社会,而人类意识不断融入信息世界,比如万物互联的发展就是这样的现状。接下来很显然的一个事实就是,这些从信息世界里产生的威胁不但会危害信息世界里的信息系统,同时还会危害物理世界的物理设施,甚至是人,这就是威胁从产生之初到现在为止性质上发生的最大变化。
威胁虽然没有生命,但却拥有智能,要想搞清楚威胁的本质,就要从计算机智能开始说起。在这里,我们要简单谈谈前面提到的信息文明的四大奠基者跟智能的关系。
神童维纳的《控制论》里有一章叫作“能学习和自我复制的机器”(On Learning and Self-Reproducing Machines),在该章里他论述了机器可以像生命系统那样进行学习和自我复制。
而学霸香农则在1951年的一个学术交流会议上展示了一只名叫“忒修斯”(Theseus)的走迷宫的磁性老鼠,忒修斯是希腊神话里解开米诺斯迷宫的雅典国王,而这只老鼠被称为“香农的老鼠”。它能够在随机的25×25格的迷宫中通过记忆和试错找到迷宫的出口,如果把老鼠重新放回到起点,它会直接沿着正确的路走到终点。
数学天才冯·诺依曼最大的成绩虽然是发明了计算机和博弈论,但是他在1948年就提出了物理上的非生物自我复制系统的详细建议,而后在他的遗作《自我复制自动机理论》( Theory of Self-Reproducing Automata )里详细阐述了复杂自动机的进化增长理论和实现,该理论被公认为最早的计算机病毒理论。
对于图灵来讲,1943年初,虽然正值第二次世界大战,但是香农和图灵就经常在贝尔实验室里谈论机器是否可以思考的问题。1950年,38岁的图灵发表了论文“计算机和智能”(Computing Machiery and Intelligence),提出了关于机器思维问题,引起了广泛的注意并产生了深远的影响。同年他提出了著名的“图灵测试”模型,它是一种用于判定机器是否具有智能的试验方法,即如果第三者无法辨别人类与人工智能机器反应的差别,则可以论断该机器具备人工智能。只是可惜到目前为止,还没有人工智能可以通过该测试。为了纪念图灵对计算机科学的巨大贡献,美国计算机协会(ACM)于1966年设立了一年一度的图灵奖,该奖项被喻为“计算机界的诺贝尔奖”。
这里谈的无论是自动机的老鼠,还是自我复制的程序,或者图灵设想的人工智能,我们可以笼统地称为计算机智能,这些计算机智能理论也直接孕育了威胁。因此, 威胁 是一种恶意智能,它可以是根据当前的环境情况自动进行判断和感染的计算机程序 —病毒 ,也可以是不断发现系统脆弱性、突破系统脆弱性的人类智能 —黑客 ,还可以是未来根据智能算法进行自我演化的人工智能 —黑AI 。
如果我们再深究一下计算机智能的本质,事实上它们是计算机科学里最核心的东西—“算法”(Algorithm)。算法其实就是一个逻辑系统,给定信息的输入,能产生新的信息输出。因此, 威胁 本质上可以理解为一种能够产生破坏行为的算法,这个算法可以由程序自动执行,也可以由人工手动执行。如果再仔细想想,算法就像生物界里的DNA一样,输入和输出都可以无穷变化,但是算法执行的逻辑总保持一致。因此可以说,算法就是信息世界的DNA,而DNA就是生物世界的算法。
如果对安全有所了解的话,会发现每年都会有大量的威胁事件,而随着对这些威胁事件的处理,就形成了一个庞大的安全产业。针对威胁行为、威胁事件和安全建设,业内抽象出很多理论化的模型,就连大家熟悉的微软的STRIDE模型,其本质是针对“攻击”(Attack)而非“威胁”(Threat)的建模,这些我们会在后面的章节中专门论述。到目前为止,还没有人专门研究过威胁本身是由哪些基本要素构成的。
为了更好地理解威胁,这里提供一个威胁与安全的关系图(如图2-2所示)。
图2-2 威胁与安全的关系图
如果站在安全的概念角度来看,因为安全是威胁对抗,所以会同时产生威胁视图和安全视图两个视图的结构。
先说左侧的威胁视图,它本身又可以分为威胁角色、威胁要素和威胁形态。为什么要把威胁分为角色和要素?是因为威胁在某些场景下指的是人,但是在某些场景下指的又是一种有害行为。如果把产生威胁事件背后的角色拿出来看,这些角色是VXer、Hacker和Cracker(这三个词其实都是自造词)。“VXer”的含义是“Virus eXchanger”或“Virus Maker”,即计算机病毒制造者,不过却没有标准的中文名字;“Hacker”指的是发起网络攻击的人,中文叫“黑客”;Cracker是指破解计算机软件版权限制的人,也没有标准的中文称呼。之所以威胁角色有三个,主要是因为不同角色的技术路线和需要的知识积累是完全不同的。
再看看威胁要素与威胁角色的关系。VXer本身并不是威胁,但是“病毒”(Virus)是由这种角色创造的。特殊之处在于,病毒被创造出来之后,就成了一种能够根据所处环境自动繁衍与危害的独立体,对于安全来说,对抗的目标就从VXer本身转移到了病毒身上,因此在威胁要素里,VXer就被“病毒”这个独立主体替换。
而黑客是物理世界里真实的人在信息世界里的一个数字身份投射,黑客实施的一个个威胁动作被称作“黑客攻击”(Hacking)。在黑客出现之初,基本都是通过信息世界里各种系统的未发现或未修复的漏洞来实施攻击的,“尽早发现漏洞,尽早缓解漏洞对系统产生的影响”就成了安全的另外一个任务,因此“漏洞”(Vulnerability)就成了另外一个威胁要素。
Cracker实施的威胁动作被称为“破解”(Cracking)。虽然Cracker是威胁实施的另外一个独立角色,但是他本身除了对软件版权做破解、造成企业经济损失之外,并不会对企业的正常运营产生不良影响,因此从对抗角度来看,Cracker已经不能算是一个要素了。
在威胁要素里,病毒和黑客攻击既可以通过漏洞来对目标实施危害或不良影响,也可独立产生危害或不良影响。
当这些威胁要素处于活动状态时,它们就会产生威胁行为,这些威胁行为被称为“特征”(Signature),这些行为作用于目标系统,就会成为威胁“事件”(Event),这是威胁的两种形态。
我们再看右侧的安全视图,与威胁角色相对应的是安全角色,包括AVer、Hacker、Cracker三种角色。可能细心的读者已经发现了,除了第一种角色与威胁角色不同外,其他两个英文名称跟威胁角色是一样的,与病毒对抗的安全从业人员被称为“AVer”,其英文含义是“Anti-Virus people”,中文可以叫“反病毒工作者”或“反病毒工程师”,但是事实上这是一个职业称谓,并不是名字。为什么会有这样的区别?是因为反病毒技术跟病毒技术在本质上是有差异的,病毒技术研究的是操作系统的自动化机制,而反病毒技术主要研究病毒文件的结构,以及用什么样的方式来更快、更全地识别和清除病毒和病毒带来的影响。
安全领域里的“Hacker”,虽然英文名称与威胁里的“黑客”一样,但是中文名称是不同的,安全领域中Hacker的中文名称是“白帽子”。两者英文相同的原因是,这两种角色除了价值观不同外,技术本质是一样的。威胁角色里的“Cracker”,也是因为技术本质一样,在安全领域的英文名称才相同,中文一般叫“逆向工程师”。
在安全视图里,跟威胁要素对抗的是安全技术,反病毒技术用来对抗病毒,防攻击技术用来对抗黑客,漏洞缓解技术如今也属于黑客对抗技术的一种,逆向技术用来对抗破解。逆向技术又被称为“驱动技术”或“内核技术”,在安全领域,更多的是把这些技术应用于数据安全的场景。
简单地讲,有了与威胁对抗的安全技术,就衍生出了各种安全手段,它们的主要形态就三种—安全软件、安全硬件和安全服务,这三种形态也就成了今天看安全市场格局的一个主要视角。
下面谈谈威胁的产生原理。
1.恶意软件与病毒
病毒就是危害计算机的程序,英文被称为“Virus”,最早是通过感染操作系统的可执行文件进行传播的,后来又出现了通过网页下载传播的特洛伊木马(Trojan)、通过网络协议漏洞传播的蠕虫(Worm)等数十种类型。
一般来讲,病毒会不断消耗操作系统的内存资源,并感染所有可执行文件。可执行文件是操作系统本身提供的,可以在CPU中被执行的指令型文件通常叫程序文件;相对应的是数据文件,数据文件往往不可被CPU直接执行,而是通过程序文件间接被调用。木马就是偷盗计算机上的有价值信息,如账号、密码等;蠕虫就是消耗掉用户的网络带宽资源。再后来,又出现了后门程序(BackDoor)、有害程序(Harm)、玩笑程序(Joke)、捆绑程序(Binder)、广告插件(Adware)、间谍软件(Spyware)等更多的形态,当这些都被称为病毒时,又会和通过感染可执行文件进行传播的“Virus”混为一谈,为了避免歧义,后来整个安全行业又把以上有害程序的集合,称为“恶意软件”或“恶意代码”,英文创造了一个词“Malware”(malicious software的组合)。但是平时大家还是习惯称之为“病毒”,为了避免产生歧义,就把原来的“Virus”称为“感染式病毒”。恶意软件目前只会出现在较正式的场合,而私下里大家还是以病毒相称,为了照顾说话习惯,下面也用病毒来指代恶意软件或恶意代码。
值得一提的是,安全行业曾经有一个广为流传的说法:杀毒软件厂商总是先造毒再杀毒来保证自己的杀毒软件好卖。这种说法似乎符合逻辑,却不是事实,这就和“玻璃商为了玻璃好卖总是雇人砸别人家窗户”的假设一样,近似于荒诞。
从本质上看,VXer研究的是操作系统内核工作机制和可被利用的能力,而AVer研究的是病毒提取什么样的特征码才能被更快、更好地识别,用什么样的方法才能更安全地将病毒从系统中清除。这两种人的能力方向和思维模式是完全不同的,虽然有一些能力强的AVer也有编写病毒的能力,但是大部分AVer跟VXer没有任何关系。
另一方面,病毒数量激增的现状也导致正常病毒都处理不完,更不用说去造毒了。一般厂商都有一个待处理的被称为“BackLog”的病毒样本池,反病毒工程师每天工作的内容就是不断地从这个池里捞出样本并把它标识为黑或白,然后放入“黑样本列表”(Black List)和“白样本列表”(White List)里供杀毒软件当作知识库来使用。
2.入侵、漏洞与黑客
入侵 是指对远程系统进行非法攻击并尝试控制该系统的过程。英文称为“Hacking”,中文俗称“黑”。当你听到“某某又黑了某某系统”的说法,指的就是这种网络入侵和系统控制行为。跟病毒界的VXer和AVer一样,安全行业里专门进行入侵的人被称为“黑客”或“骇客”,英文都是“Hacker”。早期互联网的出现就是为了信息共享,所以早期的黑客信奉“互联网上一切平等、自由”,他们入侵系统也只是为了打破围栏,实现这种平等与自由,这就是早期的“黑客精神”。随着互联网从“工作的工具”变成“生活的支撑”,这种追求平等自由的精神就成了对企业利益的危害和对个人隐私的侵犯。
漏洞 是指系统中存在的能被入侵或控制的缺陷代码。一些有计算机软件开发基础的读者,经常把“漏洞”跟“Bug”弄混。其实“Bug”是软件编程中的错误,而“漏洞”是软件编程中的缺陷,即不严谨的编码习惯,而非错误。
比如说正常情况下,在一个程序中输入中文用户名,名字长度是不会超过4个汉字即8字节的,因此软件工程师在编程过程中就默认设置“名字”这个字段的长度为8字节,并且不对名字字段长度做检查,当该程序执行时,就会在内存中申请一个长度为8字节的“缓冲区”(Buffer)。这种编码习惯在绝大多数情况下是不会出问题的,但是一旦有人发现了这个漏洞,就会精心构造一个超长的字符串当作名字输入,由于没有做长度判断和截断处理,就会导致这段超长的字符串直接在缓冲区中溢出,并在内存中覆盖掉程序的正常代码,导致这段精心构造的字符串被当作指令执行,如果该程序拥有系统的最高权限,那么这段代码就也同样具备了系统最高权限,这种情形就是经典的“缓冲区溢出攻击”。
漏洞如果在硬件系统中被发现,则称为“硬件漏洞”;如果在操作系统文件中被发现,则称为“系统漏洞”;如果在其他软件系统中被发现,则称为“二进制漏洞”;如果在We b服务程序中被发现,则称为“Web漏洞”或“脚本漏洞”。
业内对漏洞按严重性进行了分级,一般分为0-Day漏洞、高危(严重)漏洞、中危漏洞和低危漏洞。低危漏洞一般可以理解为风险,不修复对安全的影响也不大,所以客户往往会选择忽略;高危漏洞是指能够获得操作系统最高权限并造成最大程度破坏的漏洞;而0-Day漏洞则是指那些还没有修复方案(俗称“补丁”)的高危漏洞,一旦这样的漏洞被黑客发现并利用,就如入无人之境,没有任何防护办法,因此0-Day漏洞也称为“网络军火”,一个0-Day漏洞在黑市上价格是非常高的。
之所以会把入侵和漏洞放在一起说,是因为黑客往往会利用漏洞来实施入侵。他们利用漏洞,可以进入任何一台存在漏洞的服务器中,控制并拿到这台服务器上的最高权限和所有数据,这个过程又称为黑客攻击、网络攻击、网络渗透等。
但是如今在不同的语境下,Hacker有黑客、白帽子和红客三种不同的称呼。随着各种非法入侵事件的曝光和非法入侵给企业带来的损失增大,黑客就变成了一个贬义词。后来,安全领域里需要专门研究如何识别入侵行为和阻止入侵行为发生的人,为了与带有贬义的“黑客”区别开来,就发明了“白帽子”这一称谓。因此,一般情况下,干坏事的“Hacker”被称为黑客,正义的“Hacker”被称为白帽子,爱国的“Hacker”则被称为红客。
如今,黑客动作具备明显的“人与人对抗”属性,因此又被称为“攻防”,黑客技术又被称为“攻防技术”。
3.逆向与破解
破解是指对商业程序本身的一种非授权修改行为,使用的技术手段被称为“逆向”(Reverse),学名叫作“反汇编”(Disassembling)。研究破解之道的人,有一个有趣的英文名字,叫“Cracker”,但是中文名称并不叫“拆客”或者“破解者”,而是直接称为“逆向”。一般专业人士互相交流时,Cracker往往会这样介绍:“我是搞逆向的”“他是破解高手”等。现在,也有人把“Cracker”翻译成“骇客”,其实这是不准确的,因为早期骇客和黑客都是指“Hacker”这个群体,只是“骇客”这个词在感情色彩上更具破坏性而已。
我们知道:世界上有一半的程序是通过将源代码编译成二进制可执行文件的形式在操作系统下直接运行的,这种过程叫汇编;二进制可执行文件是机器码,人类无法直接理解;正常情况下,人们没有源代码就无法修改程序的行为。但是Cracker利用反汇编工具和自身的知识,能够将二进制文件可逆地翻译成人们能理解的伪源代码的形式,从而在没有源代码的前提下对程序的行为进行修改。
Cracker的信条是软件免费,所以逆向最直接的作用就是去除软件的商业化限制,产生盗版。破解者或者直接修改程序(这被称为“暴力破解”,通过暴力破解手段得到的软件被称为“破解版”),或者通过分析软件的版权验证机制,得到软件的版权验证信息,如“注册文件”(Key File)或“序列号”(Serial Number)。
在互联网发展起来之前,软件都是收费的,而且价格很高,所有正版软件都用序列号的验证方式来保护自己的版权,你要正常使用,就得去软件店或互联网购买软件序列号或激活码。在互联网上销售的商业软件,那时被称为“共享软件”(Shareware),共享软件都是通过试用的方式来达成最终的销售,而在互联网上免费使用的软件,则被称为“免费软件”(Freeware)。在共享软件繁荣的时期,涌现了大量的Cracker,他们破解软件要么自用,要么分享,要么制作盗版。1995年到2005年是盗版软件最疯狂的十年,后来,盗版软件成了病毒的温床,免费的盗版光盘中往往掺杂着病毒。
随着互联网免费模式的兴起,所有面向个人用户的软件都免费了,Cracker这一群体也就迅速衰落了。后来,随着智能手机的普及、移动互联网的兴起和早期安卓市场的混乱,大量移动App被通过逆向的方式进行二次打包,即表面上看是一个正常App,其实内部已经捆绑了恶意软件,不明真相的用户下载到本地运行时会同时激活病毒。因此,App加固就成了移动安全行业里一个特殊的生意。
由于Cracker这一群体拥有很好的操作系统原理知识,对操作系统内核的工作模式非常了解,而操作系统内核都是由被称为驱动程序的文件构成的,因此程序逆向和驱动编写,并称为两大内核能力。如今大部分的Cracker都在做内核研究工作,而一个公司里写底层驱动的软件工程师则往往是逆向高手。
随着互联网安全的崛起与IoT时代的到来,一些兼具攻防思想和破解能力的安全研究人员开始针对智能设备安全展开了新的研究,并进行了大量的破解工作。这类特殊的人群被冠以一个新的名字—“安全极客”(Geek)。极客这个名词在IT的其他领域是指那些专业的超级发烧友,而在安全领域,特指这些智能硬件的攻防高手,他们每年还会举办各种安全极客大赛。