9.1 共担责任(shared responsibility)
共担责任是安全设计的原则,表明任何机构都不是孤立运行的。
相反,它们与世界有着千丝万缕的联系。我们使用相同的基本技术,遵循相同的通信协议规范,在同一个互联网上漫游,共用操作系统和编程语言的基础,我们的大部分IT/IS都靠解决方案现货(无沦是商用的还是开源的)实现。
因此,我们与世界的其余部分自动交融在一起,共同承担建立和维护安全的责任。
我们必须履行这种共担责任,在这种情况下认真扮演好自己的角色。
这一概念的以下几个方面值得着重思考。
•机构里的每个人都负有一定的安全责任。建立和维护安全是CISO和安全团队的职责。
依照安全规定执行自己的任务是正式员工的职责。
监控环境是否存在违规行为是审计员的职责。
•机构对利益相关方负有作出周密安全决策以保持机构可持续发展的责任,否则,可能无法满足利益相关方的需要。
•与第三方合作时,尤其是与云提供商合作时,每个实体都要清楚自己在执行正常操作和维护安全方面所应承担的那部分共担责任。
这就是人们常说的云共担责任模型,第16章将深入讨论该模型。
•当意识到新漏洞和新威胁的存在时,我们应该负责地将信息披露给相关供应商或信息共享中心(也叫威胁情报来源或服务),即便这并不是我们的职责。
—————————————————————————————————————————
提示:
迹象自动共享(automated indicator sharing, ATS)是美国国土安全部(DHS)的一项举措,旨在促进美国联邦政府与私营部门以一种自动化和及时的方式(被称作“机器速度”)公开、自由地交换危害迹象(IoC)和其他网络威胁信息。
迹象(indicator)在这里指一种可观察的情况以及有关存在威胁的推断。
可观察的情况(observable)是指被识别出来的已经出现的事实,如恶意文件的存在(通常自带一个哈希值)。
AIS充分利用“结构化威胁信息表述“(Structured Threat Information eXpression,STIX)和“可信情报信息自动交换”(Trusted Automated eXchange of Intelligence Information, TAXII)来共享威胁迹象信息。
AIS由美国国家网络安全和通信整合中心(NCCIC)管理。
—————————————————————————————————————————
既然我们参与共担责任,就必须利用安全设计原则研究、实施和管理工程过程。
9.2 评价和弥补安全架构、设计和解决方案元素的漏洞
计算机架构是涉及计算机系统在逻辑层面的设计和构建的一门工程学科。
可通过计算机架构执行的技术机制就是可被系统设计师纳入其系统的机制,
包括分层、抽象、数据隐藏、可信恢复、进程隔离和硬件分隔。
—————————————————————————————————————————
提示:
系统越复杂,所能提供的保证就越少。
更高的复杂性意味着存在漏洞的区域更多,需要抵御威胁的区域也更多。
而更多的漏洞和威胁意味着系统后续提供的安全性更不可靠。
—————————————————————————————————————————
9.2.1 硬件(hardware)
硬件这个词包含计算机中可以被实际触摸到的任何有形部分:从键盘和显示器,到CPU、存储介质和内存芯片等。
需要特别留意的是,存储设备(如硬盘或闪存盘)的物理部分虽然属于硬件,但是这些设备中的内容(由“0”和“1“集合构成的软件以及存储在其中的数据)不属于硬件。
1. 处理器(processor)
中央处理单元(central processing unit, CPU)通常被称作处理器(processor)或微处理器(microprocessor),是计算机的神经中枢——这块芯片(或者多处理器系统中的多块芯片)控制着所有主要操作,直接演奏或协调使计算机得以完成预期任务的复杂计算交响曲。
令人惊讶的是,尽管CPU使整个计算机系统得以执行非常复杂的任务,但CPU本身却只能执行一组有限的计算和逻辑操作。
操作系统和编译器负责把高级编程语言转换成CPU可以理解的简单指令。
之所以故意这样限制CPU的功能范围,是为了使CPU能够以超快的速度执行计算和逻辑操作。
2. 执行类型
随着计算机的处理能力不断提高,用户需要更高级的功能来使这些系统以更高的速率处理信息,同时管理多项功能。
—————————————————————————————————————————
提示:
“多任务处理”“多核”“多重处理”“多程序设计”和“多线程'这些词乍看上去没有什么不同,但它们描述的却是解决“同时做两件事”难题的极为不同的方法。
强烈建议你拿出时间来了解这些词语之间的区别,直到你完全懂了为止。
—————————————————————————————————————————
•多任务处理(multitasking) 在计算中,多任务处理是指同时处理两个或多个任务。
过去,大多数系统并非真的在执行多任务处理,因为它们只是通过精细排列发送给CPU执行的命令顺序,依靠操作系统模拟多任务处理而已(参见“多程序设计”)。
单核多任务处理系统倒是能够在任意给定时间把控多个任务或进程。
然而,只要CPU是单核的,系统在任意给定时刻依然只执行一个进程。
这就好像抛接三个球的杂耍,你的手在任何瞬间都只接触个球,只是你通过协调自己的动作掌控了三个球的抛接而已。
•多核(multicore) 今天,大多数CPU都是多核的。
这意味着CPU如今已经成为一块包含两个、四个、八个、几十个或更多可以同时或独立运行的独立执行内核的芯片。
现在甚至还有内含一万多个内核的专用芯片。
•多重处理(multiprocessing) 在多重处理环境中,一个多处理器系统驾驭多个处理器的处理能力来完成一个多线程应用的执行。
—————————————————————————————————————————
提示:
一些多处理器系统可能会把某种进程或执行威胁分配或指定给某个特定CPU(或内核)来处理。
这就是所谓的亲和性(affinity)。
—————————————————————————————————————————
•多程序设计(multiprogramming) 多程序设计类似于多任务处理。
它是指由操作系统进行协调,假性地在单个处理器上同时执行两个任务,以提高操作效率。
大多数情况下,多程序设计属于一种批处理或序列化多个进程的方法,可在一个进程因等待外设而停下来时,把它的状态保存下来,由下一个进程开始进行处理。
直到批处理中所有其他进程都轮到机会执行,然后陆续因等待外设而停下来时,第一个程序才会重新开始进行处理。
仅就任何单个程序而言,这种方法会导致任务完成时间明显延迟。
但是就批处理中的所有进程而言,完成所有任务的总时间缩短了。
多线程(multithreading) 多线程允许在一个进程中执行多个并发任务。
与处理多个任务时占用多个进程的多任务处理不同,多线程允许多个任务在一个进程中运行。
线程是一个自包含的指令序列,可与属于同一父进程的其他线程并行执行。
多线程往往用于因多个活动进程之间频繁的上下文切换而导致开销过大且效率下降的应用程序。
在多线程中,线程之间来回切换所产生的开销要小得多,因此效率也更高。
3. 保护机制
计算机在运行的时候操控着一个由操作系统与任何活动的应用程序组合而成的运行时环境。
必须将安全控制集成到这个运行时环境内,以保护操作系统本身的完整性,管理用户访问特定数据项的权限,准许或拒绝对这些数据进行操作的请求,等等。
运行中的计算机在运行时执行和实施安全保护的方式大体上可被称作保护环、操作状态等保护机制的集合体。
保护环(protection ring)
从安全的角度看,保护环把操作系统中的代码和组件(以及应用程序、实用程序或在操作系统控制下运行的其他代码)组织成如图9.1所示的同心环。
在圆环内所处的位置越深,与占用特定环的代码相关的权限级别就越高。
虽然最初的多路存取计算机系统(Multics)执行方案最多允许7个环(编号为0到6) ,但大多数现代操作系统使用4个环的模型(编号为0到3) 。
作为最内层的环,环0具有最高级别权限,基本上可访问任何资源、文件或内存位置。
操作系统中始终驻留在内存中的部分(方便其根据需要随时运行)被称作内核(kernel)。
它占用环0并可优先占用在任何其他环上运行的代码。
操作系统的其余部分(即作为各种被请求的任务、被执行的操作、被切换的进程等进出内存的那些部分)占用环1。
环2也有一定特权,是I/O驱动程序和系统实用程序驻留的地方;
它们能访问应用和其他程序本身无法直接访问的外围设备、特殊文件等。
应用程序和其他程序则占用最外层的环3。
图9.1四层保护环模型
环模型的本质在于优先级、权限和内存分段。
计划执行的任何进程都必须排队(等待的进程队列)。环号最低的进程总是先于环号较高的进程运行。
环号较低的进程可比高环号进程访问更多资源,其与操作系统的交互也更直接。
在编号较高的环中运行的进程通常必须向编号较低环中的处理程序或驱动程序请求它们所需的服务(即系统调用),这有时也叫中介访问模型(mediated-access model)。
在实践中,许多现代操作系统只使用两个环或两个分区:
一个用于系统层面访问(0~2),通常被称作内核模式(kernel mode)或特权模式(privileged mode),
另一个用于用户层面的程序和应用(环3) ,通常被称作用户模式(user mode)。
从安全的角度看,环模型可使操作系统保护自己,并把操作系统与用户和应用程序隔离开来。
环模型还允许在高权限操作系统组件(如内核)与操作系统的低权限部分(如操作系统的其他部分,以及驱动程序和实用程序)之间实施严格的边界限制。
进程占用的环决定了进程对系统资源的访问级别。
进程只有在对象驻留于自己的环内或某个环外时才可直接访问对象。
不过,被调用的环在准许任何此类访问请求之前必须先进行检查,确保调用进程具有正确的凭证和授权以访问数据和执行满足请求过程中涉及的操作。
环与层级的对比
保护环概念的许多特性也适用于多层或多级系统(参见第1章)。
多层或多级系统的顶层与保护环方案的中心环(即环0)相同。
同样,分层或多级系统的底层也与保护环方案的外环相同。
从保护和访问概念的角度说,级、层、域和环基本上同义。
进程状态(process state)也叫操作状态(operating state)
进程状态是指进程运行的各种执行形式。
就操作系统而言,它在任何给定时刻都处于以下两种模式中的一种:
以被授予权限、可完全访问模式运行,也就是所谓的管理程序状态(supervisor state);
或者在与用户模式相关的所谓问题状态(problem state)下运行,此时权限较低并且所有访问请求必须经过授权凭证检查才会被准许或拒绝。
后者之所以叫问题状态,倒不是因为问题肯定会发生,而是因为用户访问的权限较低,这表明可能会发生问题,所以系统必须采取适当措施保护安全性、完整性和保密性。
进程在操作系统的处理队列中排队等待,当处理器空出来时,这些进程会被安排执行。
大多数操作系统只允许进程以固定增量或成块的形式占用处理器时间;
一个进程如果在用完整块处理时间(称为时间片)后仍未结束,它将返回处理队列,等到下一次轮到它时再继续执
行。
此外,进程调度程序通常让最高优先级的进程先执行,因此,即使排到队列前面,也不一定能保证立即实现对CPU的访问(因为进程可能会在最后一刻被另一个优先级更高的进程抢了先)。
根据进程是否正在运行,可将其分为以下几种状态:
就绪状态(ready state)
就绪状态是指进程已经做好准备,被安排执行时可立刻恢复或开始处理。
进程在这个状态时如果有CPU可用,将直接转换到运行状态;
否则,进程会一直在就绪状态下,直至轮到它为止。
运行状态(running state)
运行状态或问题状态是指进程在CPU上执行并持续运行的状态,直到完成运行,时间片用完或者由于某种原因而被阻塞(通常是因为进程对I/O产生了干扰)时为止。
如果时间片用完但进程还没有结束,进程将返回就绪状态;
进程如果因为等待I/O而被暂停执行,将进入等待状态。
等待状态(waiting state)
当进程处于等待状态时,它已经准备好继续执行,但在可以继续处理之前需要等待I/O提供的服务。
I/O完成后,进程通常返回就绪状态,在处理队列中等待CPU再次为其分配继续进行处理的时间。
管理程序状态
当进程必须执行一项操作,而这项操作要求权限(包括修改系统配置、安装设备驱动程序、修改安全设置等)必须大于问题状态的权限时,进程就进入管理程序状态。
未在用户模式(环3)或问题状态下出现的任何功能基本上都会在管理程序模式下执行。
尽管图9.2 没有展示这个状态,但是当一个进程要以更高级别权限运行时,它可以有效取代运行状态。
停止状态(stopped state)
当一个进程结束或必须终止(因为发生错误,需要的资源不可用或者某项资源请求无法满足)时,它将进入一种停止状态。
这时,操作系统将收回分配给该进程的所有内存和其他资源,并根据需要把它们重新分配给其他进程使用。
图9.2 展示了这些不同状态是如何相互关联的。
新的进程永远会转换成就绪状态。
当操作系统决定下一个运行的进程时,它会检查就绪队列,然后执行己做好运行准备的最高优先级作业。
图9.2 被执行进程的生命周期
4. 操作模式
现代处理器和操作系统在设计上可以支持多用户环境,在这种环境下,单个用户不会被授权访问系统的所有组件或存储在系统中的所有信息。
出于这一原因,处理器本身支待两种操作模式。
用户模式
用户模式是CPU在执行用户应用程序时使用的基本模式。
在此模式下,CPU只允许执行其全部指令集中的部分指令。
这样做是为了防止用户由于执行设计不当的代码或无意中误用这种代码而意外损害系统。
它还可保护系统和其中的数据,使其免受恶意用户和恶意代码的攻击。
特权模式
CPU还支持特权模式,这种模式的设计旨在使操作系统可以访问CPU支持的所有指令。
这种模式还被称作管理程序模式、系统模式或内核模式。
出于安全性和系统完整性的目的,只有那些作为操作系统本身组件的进程才被允许在特权模式下执行。
—————————————————————————————————————————
提示:
不要把处理器模式与任何类型的用户访问权限混淆。
高级处理器模式有时被称为特权或管理程序模式,这一事实与用户的角色没有任何关系。
所有用户(包括系统管理员)的应用程序都以用户模式运行。
当系统管理员用系统工具更改系统配置时,这些工具也以用户模式运行。
当用户应用程序需要执行某个特权操作时,它会用系统调用把请求传递给操作系统,由系统调用对请求进行评估,然后拒绝或批准请求,并用用户控制范围之外的某种特权模式进程执行请求。
—————————————————————————————————————————
5. 存储器(内存)
系统的第二个主要硬件组件是存储器,也叫内存,是用来保存计算机随时需要调用的信息的存储库。
存储器有多种不同类型,每一种都用于不同的目的,下面将一一详细介绍。
只读存储器(read-only memory, ROM)
只读存储器是可以读取但不能更改(不允许写入)的存储器。
标准ROM芯片的内容是在工厂里“烧入”的,最终用户根本无法更改。
ROM 芯片通常含有某种“引导“信息,计算机在从硬盘加载操作系统前通过该信息得以启动。
引导信息包含每次引导PC机运行时的开机自检(power-on self-test, POST) 系列诊断。
ROM的主要优点在于其不可修改性。这一属性使ROM极适用于编排计算机的最内部工作。
有一种类型的ROM可在一定程度上更改。
这就是可编程只读存储器,它又分为若干种子类型。
•可编程只读存储器 (programmable read-only memory, PROM)
基础芯片在功能上与ROM芯片类似,但有一点不同。
PROM芯片的内容不像标准ROM芯片那样在制造过程中被工厂“烧入”。
相反,PROM具有特殊功能,允许最终用户日后烧入内容。
但是数据一旦写入PROM芯片,就不能再更改。
•可擦除可编程只读存储器 (erasable PROM, EPROM)
由于PROM芯片成本较高而且软件开发人员在编写代码后不可避免地需要修改代码,人们开发出可擦除PROM 。
EPROM主要有两个子类UVEPROM和EEPROM(参见下一项)。
紫外线EPROM(ultraviolet EPROM, UVEPROM)可以用光擦除。
这些芯片有一个小窗口,被特殊紫外线光照射时,芯片上的内容将被擦除。
擦除后,最终用户可给UVEPROM烧入新的信息,就像以前它从未被写过一样。
•电子可擦除可编程只读存储器 (electronically erasable PROM,EEPROM)
是UVEPROM更灵活、更友好的替代方案,它用传递到芯片引脚的电压来强制擦除芯片上的内容。
•闪存 (flash memory)
是EEPROM的衍生概念。它是一种非易失性存储介质,可通过电子方式擦除和重写。
EEPROM与闪存的主要区别在于,EEPROM必须完全擦除后才能重写,而闪存可按块或页擦除和写入。
NAND闪存是最常见的闪存类型,广泛用于存储卡、优盘、移动设备和SSD(固态硬盘)。
随机存取存储器(random access memory, RAM)
随机存取存储器属于可读写存储器,其中包含计算机在处理过程中使用的信息。
RAM只能在持续供电期间保留内容。与ROM不同,计算机断电后,RAM存储的所有数据都会消失。
因此,RAM只能用于临时存储。关键数据绝不应只存储在RAM中,相反,任何情况下都要在另一个存储设备上保存备份拷贝,以防突然断电时数据丢失。
以下是RAM的几种类型。
•真实内存(real memory)也叫主内存(main memory or primary memory)
通常是计算机可用的最大RAM存储资源。
它通常由许多动态RAM芯片组成,因此必须由CPU定期刷新(有关这一主题的详细信息,请见下面的专栏“动态RAM 与静态RAM”) 。
•高速缓存RAM(cache RAM)
计算机系统包含许多缓存,当可以重复使用时,这些缓存从较慢的设备提取数据并把它们临时保存到较快的设备中,以提高性能:这便是高速缓存RAM。
处理器通常包含一个板载超高速缓存,用于保存它将运行的数据。
高速缓存RAM也叫L1、L2、L3乃至L4缓存(L为级别的缩写)。
许多现代CPU包含高达3级的片上高速缓存。
一些高速缓存专用于单个处理器内核(通常为L1或L2),而L3则充当内核之间共享的高速缓存。
一些CPU还含有L4高速缓存,它可能被安置在主板/母板上或GPU(图形处理单元)上。
同样,真实内存往往也包含可从存储设备提取或读取信息的高速缓存。
许多外围设备也配备了板载高速缓存,以减轻它们给CPU和操作系统带来的存储负担。
许多存储设备,如硬盘驱动器(HDD)、固态驱动器(SSD)和某些优盘,都包含缓存,以帮助提高读写速度。
但是在这些高速缓存断开连接或切断电源之前,必须将其中的内容清理到永久或二级存储区域,以免高速缓存驻留数据丢失。
—————————————————————————————————————————
真实场景:动态RAM与静态RAM
RAM主要有两种类型:动态RAM 和静态RAM。
大多数计算机都包含这两种类型的组合,并将它们用于各种不同目的。
为存储数据,动态RAM使用了一系列电容器,即可保持电荷的微小电子设备。
这些电容器要么保持电荷(代表存储器中的比特1) ,要么不保持电荷(代表比特0) 。
然而,由于电容器会随着时间的推移而自然放电,CPU必须花时间刷新动态RAM中的内容,以确保比特1不会在无意中变成比特0, 从而改变存储器的内容。
静态RAM使用了更复杂的技术—— 一种名为触发器的逻辑装置。
对于任何意图和目的而言,触发器都只是一个必须从一个位置切换到另一个位置以将比特0 改成比特1(或者反过来)的ON/OFF 开关而已。
更重要的是,只要不断电,静态存储器就会保持其内容不变,而且不会因为定期刷新操作而给CPU带来负担。
电容器比触发器更便宜,因此动态RAM比静态RAM成本低(动态RAM:价格低)。
但是静态RAM的运行速度要比动态RAM快很多(静态RAM:快)。
系统设计人员需要将静态RAM与动态RAM 模块结合起来使用,并在成本与性能之间取得适当平衡。
—————————————————————————————————————————
寄存器(register)
CPU还包含一种名为寄存器的数量有限的板载存储器,可为CPU的大脑——算术逻辑单元(arithmetic-logical unit, ALU)提供执行计算或处理指令时可直接访问的存储位置。
寄存器的大小和数量会因系统的不同而异,但CPU一般有8到32个寄存器,大小通常是32或64位。
实际上,ALU将要操控的任何数据,除了那些作为指令的一部分而被直接提供的,都必须加载到寄存器中。
此类存储器的主要优点在于,它是ALU本身的组成部分,因此会以典型的CPU速度与CPU同步调运行。
内存寻址(memory addressing)
处理器在使用内存资源时必须通过某种手段来关联内存中的各个位置。
解决这个问题的方法就叫内存寻址,现在有多种不同的寻址方案可用于各种不同的情况。
以下是最常用的5种寻址方案。
•寄存器寻址
如前一节所述,寄存器是直接集成在CPU中的小内存位置。
当CPU需要用一个寄存器中的信息完成某项操作时,它会按寄存器地址(例如,“寄存器1")来访问寄存器中的内容。
•立即寻址 (immediate addressing)
立即寻址本身并不是内存寻址方案,而是一种关联数据的方式,这些数据作为指令的组成部分被提供给CPU。
例如,CPU可能要处理“给寄存器1中的值加2" 的命令。
这条命令使用了两个寻址方案。
第一个是立即寻址:告诉CPU要添加数值2并且不必从内存的某种位置检索这个值——这个值已经作为命令的一部分被提供了。
第二个方案是寄存器寻址:指示CPU从奇存器1检索这个值。
•直接寻址 (direct addressing)
在直接寻址中,CPU将获得其将访问的内存位置的一个实际地址。
这个地址必须与正在执行的指令位于同一个内存页面上。
直接寻址比立即寻址更灵活,因为内存位置的内容相对更容易更改,而立即寻址中硬编码的数据需要重新编程才能更改。
•间接寻址 (indirect addressing)
间接寻址使用了与直接寻址类似的方案。
但是,作为指令组成部分被提供给CPU的内存地址并不包含将被CPU用作操作数的实际数值。
相反,内存地扯中包含另一个内存地址。CPU读取间接地址来确定所需数据驻留的地址,然后从该地址检索实际操作数。
•基址+偏移量寻址 (base+offset addressing)
基址+偏移量寻址使用保存在CPU的某个寄存器或指针中的数值,以此作为开始计算的基址。
然后,CPU把随指令提供的偏移量与该基址相加,并从计算出的内存位置检索操作数。
—————————————————————————————————————————
提示:
指针是许多编程语言中用于存储内存地址的基本元素或对象。
从根本上说,指针持有保存在内存里的东西的地址,因此,当程序读取指针时,它将指向应用程序实际需要的数据的位置。
指针其实在关联一个内存位置。访问指针以读取该内存位置的动作被称为“解除指针关联"。
指针可以保存用于直接、间接或基址寻址的内存地址。
另一个潜在问题是竞争情况,当系统或设备试图同时执行两个或多个操作时便会出现竞争情况。
这可能会导致空指针错误,出现该错误时,应用程序原本打算解除一个有效指针的关联,但这个指针实际上是空的(或已损坏),结果导致系统崩溃。
—————————————————————————————————————————
二级内存(secondary memory)
二级内存这个词通常指磁性、光学或基于闪存的介质或其他存储设备,里面存储的是不能直接供CPU使用的数据。
CPU若要访问二级内存中的数据,那么首先必须由操作系统读取数据并将其保存到真实内存中。
虚拟内存(virtual memory)是一种特殊的二级内存,用于扩展真实内存的可寻址空间。
最常见的虚拟内存类型是页面文件(pagefile)或交换文件(swapfile),大多数操作系统将其作为内存管理功能的一部分进行管理。
当操作系统而要访问有储在页面文件中的地址时,它会检查页面是驻留在内存里(这种情况下可立即访问),还是已被交换到硬盘中——在后一种情况下,操作系统会把数据从硬盘读回真实内存(这一过程叫分页)。
虚拟内存的主要缺点是:在主内存和二级内存之间交换数据时进行的分页操作速度相对较慢。
随着更大容量的真实物理RAM被投入使用,人们对虚拟内存的需求正在减少,不过,如果通过使用闪存卡或SSD来存储虚拟内存分页文件,可降低虚拟内存的性能影响。
6. 数据存储设备(data storage device)
数据存储设备用于存储被写入计算机后可供计算机随时使用的信息。
•主存储设备与辅助存储设备
主存储设备也叫主内存,是指被计算机用来在运行过程中保存随时可供CPU使用的必要信息的RAM。
辅助存储设备也叫二级内存,包括你熟悉并且每天都在使用的所有长期存储设备。
辅助存储设备由磁性和光学介质组成,如硬盘驱动器(HDD) 、固态硬盘(SSD) 、闪存驱动器、磁带、CD 、DVD和闪存卡等。
•易失性存储设备与非易失性存储设备
存储设备的易失性只是衡量存储设备在电源关闭或循环时丢失数据的可能性的一个指标。
在设计上可长期保留数据的设备(如磁性介质、ROM和光学介质)属于非易失的(nonvolatile),而断电后会丢失数据的设备(如静态或动态RAM 模块)属于易失的(volatile)。
•随机存取与顺序存取
存储设备的存取方式有两种。
随机存取存储(random access storage)设备允许操作系统通过使用某种类型的寻址系统从设备内任何位置立即读取(有时还写入)数据。
几乎所有主存储设备都是随机存取设备。
你可以用一个内存地址访问存储在RAM芯片内任何位置的信息,而不必读物理存储在此位置前的数据。
大多数辅助存储设备也是随机存取的。
另一方面,顺序存储(sequential storage)设备不具备这种灵活性。
它们要求你在到达既定位置之前读取(或加速经过)物理存储的所有数据。磁带驱动器是顺序存储设备的一个常见例子。
存储器的安全问题
存储器存储并处理你的数据其中有些数据可能非常敏感。
在你因为某种原因而被允许从单位离职之前,任何可能留有敏感数据的存储设备都应该被清除干净。
这一点对于二级内存和ROM、PROM、EPROM、EEPROM设备来说尤其重要,因为这些设备在断电后依然可以保留数据。
然而,存储器数据保持问题不仅限于二级内存。
从技术角度说,易失性主内存使用的电气组件在关机断电后依然有可能在有限的一段时间内保留一些电量。
而从理论上说,技术经验丰富的人完全可以把这些设备存储的部分数据恢复过来。
有一种方法可以在系统关闭或RAM被从主板拔出时通过冻结内存芯片的方式延迟驻留数据的衰减,这便是所谓的冷启动攻击。
甚至还存在着专门侧重于内存映像转储或系统崩溃转储以提取加密密钥攻击和工具。
7. 存储介质的安全
谈到辅助存储设备的安全时,有必要关注几个问题。
•数据被擦除后依然有可能保留在辅助存储设备上。这便是所谓的数据残留(data remanence)。
即使数据被从硬盘删除或硬盘被重新格式化,也有实用程序可用来从硬盘恢复数据。
如果确实要从辅助存储设备中移除数据,则必须使用一种专门的实用程序,它可以覆盖设备上数据的所有痕迹(通常被称为净化)或者破坏或销毁设备本身而使之不可再修复。
—————————————————————————————————————————
注意:
SSD是大容量闪存辅助存储设备,许多SSD包含用户更换坏块的额外备用内存块。
被反复写入或擦除的块会以可预测的故障率退化。
为了应对这种故障率,许多SSD制造商主要使用两种技术:备用块和均衡磨损。
当一个块不再可靠地工作时,它会被标记为坏块,然后会有一个备用块来替换它。
这与HDD坏扇区的情况很相似。
均衡磨损则尝试在整个驱动器的块容量上均匀地进行写入和擦除操作,以最大限度地延长SSD的使用寿命。
—————————————————————————————————————————
•传统的归零擦除对于SSD效果不佳,因为坏块可能不会被完全覆盖。
•辅助存储设备还很容易失窃。经济损失算不上主要问题(备份磁带或硬盘驱动器又不值多少钱),但机密信息的丢失会带来巨大风险。
出于这一原因,必须通过全硬盘加密来降低未经授权的实体访问数据的风险。
许多HDD、SSD和闪存设备本身都具备加密功能。
•可移动介质具有极大的信息泄露风险,因此往往需要通过加密技术来确保其安全。
发射安全
许多电气设备发出的电信号或辐射是可以被人截取的,而且电信号和辐射里面可能包含保密、敏感或私人数据。
无线网络设备和移动电话是信号发射设备的最突出例子,但是许多其他设备,包括显示器、网线、调制解调器、内部或外部介质驱动器(硬盘驱动器、优盘、CD光盘)等,面对辐射截取时也非常脆弱其程度恐怕已超出你的想象。
敌对分子有了适当的设备,便可截取来自这些设备的电磁或射频信号(统称发射)并对它们进行解析,以从中提取保密数据。
—————————————————————————————————————————
注意:
发射有许多有效用途,如Wi-Fi、蓝牙、GPS和移动电话信号。
—————————————————————————————————————————
用来抵御发射攻击的手段和方式被称为TEMPEST对策。
TEMPEST原本是一项政府研究,旨在保护电子设备,使其免受核爆炸发出的电磁脉冲(EMP)侵扰。
后来,TEMPEST扩大范围,发展成监测发射信号和防止这些信号被人截取的一项广泛研究。
许多计算机硬件设备会仅仅因为构建它们的电子组件种类而在正常运行过程中发射电磁(EM)辐射。
和其他机器或外围设备通信的进程也会产生可被人截取的辐射。
这些发射泄露有可能带来严重的安全问题,但解决起来比较容易。
TEMPEST衍生技术使人可以从远处读取设备产生的电子辐射,即Van Eck辐射(Van Eck radiation),这个过程叫Van Eck偷听(Van Eck phreaking)。
应对TEMPEST窃听或Van Eck偷听的对策包括:
•法拉第笼(Faraday cage)
法拉第笼是指一个盒子、可移动的房间或整栋建筑物,经设计,它被包上了一层金属外壳,这个外壳通常是一个金属丝网,将一个区域全方位地
围住。
这种金属外壳起着吸收电磁信号的电容器的作用,可防止电磁信号(辐射)离开或进入笼子包围的区域。
经设计,法拉第笼可以在允许其他频率信号通过的同时拦截特定频率的信号一例如,在允许使用对讲机和移动电话的同时拦截Wi-Fi信号。
•白噪声(white noise)
白噪声是指通过广播假通信流来掩盖和隐藏真实信号辐射的存在。
白噪声包括来自另一非保密源的真实信号、特定频率的恒定信号、随机变化的信号,甚至可以是会令监听设备发生故障的干扰信号。
虽然白噪声与干扰设备很像,但它仅缠绕窃听者(而非授权用户)的信号,因此不会阻止用户对信号发射的有效使用。
—————————————————————————————————————————
注意:
白噪声是指可以淹没重要信息的任何随机声音、信号或进程:
从听得见的频率到听不见的电子传输,变化很多,甚至可以是通过故意制造线路或通信噪声来掩盖真实来源或破坏收听设备的行为。
—————————————————————————————————————————
•控制区(control zone)
第3种TEMPEST对策是控制区,该对策同时使用法拉第笼和白噪声,以对环境的某个特定区域形成保护;
环境的其余部分不受影响。控制区可以是一个房间、一个楼层或整栋建筑物。
除了正式的TEMPEST对策概念外,屏蔽、访问控制和天线管理也有助于防止发射窃听。
可能仅仅通过屏蔽(shielding)电缆(网络和其他)就可以减少乃至阻止发射访问。
这可能是制造设备时必须考虑的一个要素,例如屏蔽双绞线(STP),也可通过使用屏蔽导管或者干脆用光纤电缆替代铜线网络电缆来实现。
8. 输入和输出设备
输入和输出设备会给系统带来安全风险。
安全专业人员应该对这些风险有充分认识,确保有适当的控制来抑制它们。
•显示器
TEMPEST技术可用来危害显示器上展示的数据的安全。
传统的阴极射线管(CRT)显示器往往更容易产生辐射,而最现代化的显示器外泄的程度要小得多(据称有些显示器的辐射低得不足以泄露关键数据);
这包括液晶显示器(LCD)、发光二极管(LED)、有机发光二极管(OLED)和量子点发光二极管(QLED)。
可以说对任何显示器而言,最大的风险始终都是肩窥或照相机长镜头。
所谓肩窥,是指有人用肉眼或摄像机偷看你屏幕上的内容。
切记,肩窥是桌面显示器、笔记本电脑显示器、平板电脑和手机的风险关注点。
•打印机
打印机也代表了一种很容易被人忽视的安全风险。
带走打印出来的敏感信息或许要比用闪存盘或磁性介质带走敏感信息容易得多——这取决于你供职的机构采用了什么物理安全控制。
如果打印机是共享的,用户可能会忘记取走打印出来的敏感信息,而将其留在那里任人窥探。
许多现代打印机还可将数据保存在本地,往往保存在一块硬盘上,有些则无限期保留打印成品。
为了便于使用,打印机通常被暴露在网络上,并且往往没有被设计成一个安全的系统。
这些安全隐患也适用于多功能打印机(multifunction printer, MFP),特别是那些含传真功能并与网络(有线网或无线网)连接的多功能打印机。
有研究人员发现,到了2018年,依然可以通过公共交换电话网(public switched telephone network, PSTN)线路,用由调制解调器和传真调制解调器/传真机支持的古老AT命令(AT command)来掌控计算机系统。
如果你感兴趣,可以查看研究人员在第26届黑客大会上的演示。
如果你并非随时需要传真功能,就不要让连接传真机的电话线总插在插座上。
即便你确实总要使用传真功能,也应使用一台独立的传真机。
•键盘/鼠标
键盘、鼠标和类似的输入设备也难免会受安全漏洞的影响。
所有这些设备在面对TEMPEST监视时都很脆弱。
即便遭受的是不那么复杂的“窃听",键盘也会束手无策:
只要把一个简单设备放到键盘里或连接电缆旁边,就可截获所有击键动作并通过无线电信号把它们发送给一个远程接收器。
这会取得与TEMPEST监视相同的效果,但是所用的装备更便宜。
此外,如果你的键盘和鼠标是无线的(包括蓝牙),无线电信号也能衱人截获。
•调制解调器
随着无处不在的宽带和无线网络的出现,调制解调器正在成为一种陈旧而少见的计算机组件。
如果你供职的机构依然用着老式的设备,则调制解调器可能是硬件配置的一部分。
调制解调器允许用户在你的网络中创建不受控制的接入点。
在最糟糕的情况下,如果配置不当,它们有可能形成极其严重的安全漏洞,使外部人员可以绕过你的所有边界保护机制,直接访问网络资源。
此外,调制解调器还会创建一个备用出口通道,使内部人员可以通过这个通道把机构的数据泄露到外部。
但是你要记住,只有当调制解调器连接到可操作的固定电话线上时,这个漏洞才能被人利用。
—————————————————————————————————————————
注意:
系统同时使用有线网卡和无线网卡时,同样会有安全边界被人绕过的风险。
系统通常应该做出限制,一次只允许使用一种连接方法/方式。
例如,如果电缆连接到系统的RJ45插孔,则应禁用无线接口。
另外还应该考虑对进出办公场所的设备采用地理围栏式系统一—只要可无线联网的设备进入设施,就将其禁用。
—————————————————————————————————————————
除非你确实需要把调制解调器用于业务目的,否则应该认真考虑在本机构的安全策略中规定彻底禁用调制解调器。
在这些情况下,安全管理人员应该清楚所有调制解调器在网络中的物理和逻辑位置,确保它们配置恰当,并保证对它们采取了防止非法使用的适当保护措施。
9.2.2 固件(firmware)
固件也叫微码(microcode) ,是用于描述存储在ROM芯片中的软件的词语。
这种软件很少更改(实际上,如果它存储在真正的ROM芯片而不是EEPROM或闪存芯片上,就永远不会更改了),往往用于驱动计算设备的基本操作。
许多硬件设备(如打印机和调制解调器)也需要一些有限的处理能力,以完成其任务并最大限度地减轻操作系统本身的负担。
在许多情况下,这些“迷你”操作系统被完全包含在它们服务的设备的固件芯片中。
固件通常用于移动设备、物联网设备、边缘计算设备、雾计算设备和工业控制系统。
基本输入/输出系统(basic input/output system, BIOS)是镶嵌在主板的EEPROM或闪存芯片中的传统基本低端固件或软件。
BIOS包含计算机启动和从磁盘加载操作系统时所需的独立于操作系统的原始指令。
BIOS识别并启动基本的系统硬件组件,如硬盘驱动器、光驱和显卡,使加载操作系统的引导进程得以开始。
在大多数现代系统中,BIOS已被UEFI取代。
统一可扩展固件接口(unified extensible firmware interface, UEFI)支持BIOS的所有功能,但有了许多改进,
例如支持更大的硬盘驱动器(尤其是启动),缩短了启动时间,增强了安全性能,甚至允许在更改系统时使用鼠标(BIOS只限于键盘控制)。
UEFI还包含一个独立于CPU的架构、一个具有网络支持、测量启动、引导认证(即安全引导)以及向后向前兼容的灵活预操作系统环境。
它还运行独立于CPU 的驱动程序(用于系统组件、驱动器控制器和硬盘驱动器)。
更新UEFI、BIOS或固件的过程被称为刷新(flashing, 与下面所说的“phlashing" 相近)。
如果黑客或恶意软件可以更改系统的UEFI、BIOS或固件,他们将能绕过安全功能或发起其他被禁止的活动。
现在已经出现了几个相关事例:一些恶意代码将自身嵌入UEFI、BIOS或固件中。
还有一种名为“phlashing" 的攻击,即通过安装正式BIOS 或固件的恶意变体,给设备引入远程控制或其他恶意功能。
引导认证(boot attestation)或安全引导(secure boot)是UEFI的一项功能,旨在通过阻止加载或安装未由预先得到批准的数字证书签名的设备驱动程序或操作系统来保护本地操作系统。
因此,安全引导可以使系统免受一系列低层或引导层恶意软件(例如某些rootkit和后门程序)的侵害。
安全引导确保只有通过了认证(以核查数字签名的方式完成验证和批准过程)的驱动程序和操作系统可以安装和加载到本地系统上。
测量启动(measured boot)是UEFI 的一个功能可选项,它对启动进程涉及的每个元素进行哈希计算。
哈希计算由可信平台模块(TPM)执行并且其结果会被保存在这个模块中。
如果启动过程中检测到违规行为,则可通过访问最近启动动作的哈希值并将其与已知良好值进行比较,来确定哪些启动组件遭致了破坏(如果有的话)。测量启动不会干扰或中断启动进程;它只是记录引导过程中所用元素的哈希ID。
因此,它就像一个安全摄像头。它不会阻止恶意操作,而只是把自己视野内发生的所有事情记录下来。
—————————————————————————————————————————
注意:
2020年,臭名昭著的恶意软件TrickBot又荻得了一个新的感染向量能力:将恶意软件注入脆弱的BIOS和UEFI。
这种恶意软件其实是一个rootkit, 但却被称作bootkit, 它的昵称是TrickBoot。
—————————————————————————————————————————