瓮城
公元1268年,忽必烈派刘整与阿术率军攻打襄阳,发起元灭宋之战。史称襄樊之战。拥有“上帝之鞭”称号之一的蒙古军队,在襄阳打了整整六年。1269年,忽必烈又派丞相史天泽助战。蒙古军在襄、樊二城四周修筑城围,并封锁了汉水,多次打退南宋援军。蒙古决定不惜一切代价夺取襄阳,各地的军队也是源源不断地开往襄阳,在短短一年之内围困襄阳的蒙军就增至了10万。
但是,吕文德所建立的守城军队也不容小视。他们凭借襄阳夹汉水,地险城固的有利地形,特别是守备措施充分、物资储备丰富,使得蒙军虽然急切但也在短时间内拿不下襄阳。直到1274,宋朝多次援救襄樊均被击溃且城内粮草耗尽的前提下,守将吕文焕才最终投降。1279年,陆秀夫背着南宋最后一个皇帝跳海,南宋灭亡。
襄阳能守住6年之久的关键,除了蒙古自身因为蒙哥身亡(被杨过击杀)导致的战略不稳、襄阳乃至南宋人民同仇敌忾、南宋战略布局多次出动救围战役外,还有个很有意思的原因:襄阳本身固若金汤,不仅围绕汉水天堑而建,且拥有最宽的护城河,还有继承自北宋开始的“瓮城”设计。
很多人不理解,为什么战争片里不直接攻打城门?通过城门进入城市不就胜利了?
古代人虽然知识水平有限,但是智商和我们是一致的(甚至更高),他们这么做是因为在上千年的攻守经验中演化出了一套硬件、软件层的防御系统。即使你攻入了城门,还有这样的景象等着你,你会深刻理解“瓮中之鳖”的含义:
先民们为了防止城门被突破,又在城内设置了一圈“内城”,因此你打开门后会发现进了一个牢笼。瓮城内部的空间一般都极其有限,队伍在圆形一圈厚厚的城墙里动弹不得,而且弓箭手已经围一圈比赛射击了。
瓮城的设计思路可以总结为:
针对易被攻破的模块,设计单独的双重保护机制
限制不信任对象的行为
构建易于清理不信任对象的结构
这个设计后来应用在计算机防御系统设计中,称为“沙盒模型”。
沙盒
在计算机安全领域,沙盒(英语:sandbox,又译为沙箱)是一种安全机制,为运行中的程序提供的隔离环境。其运用流程是:让疑似病毒文件的可疑行为在虚拟的“沙盒”里充分表演,“沙盒”会记下它的每一个动作;当疑似病毒充分暴露了其病毒属性后,“沙盒”就会执行“回滚”机制:将病毒的痕迹和动作抹去,恢复系统到正常状态。
因此,和瓮城类似,其设计理论上保障了以下几点:
针对易于感染恶意程序的对象,设计双重保护:通过虚拟化环境,能够实现包括系统级别的沙箱和容器级别的沙箱
严格限制不信任对象的行为:沙盒提供用后即回收的磁盘及内存空间,网络访问、对真实系统的访问、对输入设备的读取通常被禁止或是严格限制
一旦发现恶意程序,通过重定向,可以把文件、注册表等路径重定向到其他位置(沙箱指定位置),这样软件本来想操作的资源就不会被访问或者操作,保证资源的安全性。
这种将“假定不信任”模块约束的模型,可以简化为:
但是这种模型依赖检测能力。只要恶意程序能够做到充分掩饰,或以某种方式规避了安全扫描,它们就能自由感染用户的设备,最终侵入到公司网络和关键业务系统。
随着恶意用户的攻击手段变化多端,防护者只能把防火墙越砌越高、入侵检测越做越复杂、恶意代码库越做越大,误报率也随之增多,使得安全的投入不断增加,维护与管理变得更加复杂和难以实施,信息系统的使用效率大大降低,而对新的攻击毫无防御能力。对于检测-响应式的安全策略,只要恶意程序能够骗过瓮城守卫军,他们就能自由入内。
因此,计算机系统还衍生了一种新的安全模型,一般称为“可信执行环境”技术(Trusted Execution Environment,简称TEE)。与”Sandbox”模型恰恰相反,可信计算假定“信任”是稀缺的。TEE是从逻辑正确验证、计算体系结构和计算模式等方面的技术创新,以解决逻辑缺陷不被攻击者所利用的问题,形成攻防矛盾的统一体,确保完成计算任务的逻辑组合不被篡改和破坏。
可信计算技术
可信计算技术的发展
1983年,美国国防部制定了世界上第一个《可信计算机系统评价标准》(TCSEC),第一次提出了可信计算机和可信计算基(Trusted Computing Base,TCB)的概念,并把TCB作为系统系统安全的基础。
1990年,国际标准化组织与国际电子技术委员会ISO/IEC在其发布的目录服务系列标准中基于行为预期性定义了可信性:如果第2个实体完全按照第1个实体的预期行动时,则第1个实体认为第2个实体 是可信的。
1999年,IBM、HP、Intel和微软等著名IT企业发起成立了可信计算平台联盟(TCPA, Trusted Computing Platform Alliance),这标志着可信计算进入产业界。
2003年,TCPA 改组为可信计算组织(TCG, Trusted Computing Group)。目前,TCG已经制定了一系列的可信计算技术规范,如可信PC、可信平台模块(TPM)、可信软件栈(TSS)、可信网络连接(TNC)、可信手机模块等,且不断地对这些技术规范进行修改完善和版本升级。
2009年,OMTP(Open Mobile Terminal Platform)在《omtpadvancedtrustedenvironmentomtptr1v11.pdf》中定义了TEE,定义为“一组软硬件组件,可以为应用程序提供必要的设施”,需要满足两种定义的安全级别中的一种。第一个安全级别目标是应对软件攻击,第二个安全级别目标是同时应对软件和硬件攻击。
下面我们讲几个TEE计算机理论中的重要概念。
信任根与信任链
可信计算的思想是在计算机系统中先建立一个信任根:从信任根开始,到硬件平台、操作系统、应用,一级度量一级,一级信任一级,把这种信任扩展到整个计算机系统,并采取防护措施,确保计算资源的数据完整性和行为的预期性,从而提高计算机系统的可信性。
可信根
通常是可信硬件芯片。可信计算通过芯片厂家植入在可信硬件中的算法和秘钥,以及集成的专用微控制器对软件栈进行度量和验证来确保可信。根据安全芯片和其上运行的可信软件基(Trusted Software Stack)分类,业界目前主流的可信计算标准主要有三种:Trusted Platform Module (TPM)、Trusted Cryptography Module (TCM)和Trusted Platform Control Module (TPCM)。
信任链
主要作用是将信任关系扩展到整个计算机平台,它建立在信任根的基础上。信任链可以通过可信度量机制来获取各种各样影响平台可信性的数据,并通过将这些数据与预期数据进行比较,来判断平台的可信性。
可信主要通过度量和验证的技术手段实现。
度量就是采集所检测的软件或系统的状态
验证是将度量结果和参考值比对看是否一致,如果一致表示验证通过,如果不一致则表示验证失败。
建立信任链时遵循以下3条规则:
所有模块或组件,除了CRTM(信任链构建起点,第一段运行的用于可信度量的代码),在没有经过度量以前,均认为是不可信的。同时,只有通过可信度量且与预期数据相符的模块或组件,才可归入可信边界内。
可信边界内部的模块或组件,可以作为验证代理,对尚未完成验证的模块或组件进行完整性验证。
只有可信边界内的模块或组件,才可以获得相关的TPM 控制权,可信边界以外的模块或组件无法控制或使用可信平台模块。
TPM
一般,可信计算平台由TPM芯片机器密钥和相应软件作为信任根。
TPM本身是一个SOC芯片,由CPU、存储器、I/O、密码协处理器、随机数产生器和嵌入式操作系统等部件组成,主要用于可信度量的存储、可信度量的报告、密钥产生、加密和签名、数据安全存储等功能。通过将密钥封装在芯片内部,让外界无法访问,只有TPM认可的合法应用请求时,TPM才会在芯片内部对数据进行解密,并将解密后的数据送往内存。
TPM的使用一定程度上降低了重要数据被木马等恶意软件窃取的风险,但却无法防御运行时攻击,如果黑客在合法应用运行时进行破解,直接去内存读解密后的数据,这样TPM就形同虚设了。
为了解决这个问题,我们还应该想办法使得黑客无法读取合法应用所使用的内存空间,可信执行环境(Trusted Execution Environment)的提出,正是基于这样的背景。
TEE与REE
2010年,Global Platform 首次宣布了一整套TEE系统体系标准。Global Platform的系列TEE规范,这也是当前许多商业或者开源产品一般都会参考该规范,并按照其定义的各种功能接口进行规范实现。
Global Platform从接口、协议实现层面上对TEE进行了部分的规范定义,以及典型应用规范定义。可以看出,可信执行环境应该有如下几个特征:
软硬件协同的安全机制:隔离是其本质属性,隔离可以是通过软件,也可以是硬件实现,更多的软件、硬件、IP、总线一体的安全机制
算力共享:能使用CPU的同等算力、硬件资源
开放性:有对应的REE侧,才有TEE的必要性,只有在开放性中才需要可信执行环境的保护
到这里,我们大概可以看出,TEE技术与沙盒模型的区别了:一个是有罪推定原则指导的设计,一个是无罪推定原则指导的设计。
在有罪推定的模型中,TEE是相对REE(Rich Execution Environment)而言的。一般称TEE和REE为 Secure World 和 Normal World。比如一个系统平时是跑在Normal World上,但当有些安全性要求比较高的行为,例如人脸数据比对、或支付时用私钥签名等任务,需要运行在Secure World里。
Trust Zone
2006年,ARM从 ARMv6架构 开始引入了TrustZone技术。TrustZone技术将CPU的工作状态分为了正常世界状态(Normal World Status,NWS)和安全世界状态(Secure World Status,SWS)。
支持TrustZone技术的芯片提供了对外围硬件资源的硬件级别的保护和安全隔离。当CPU、处于正常状态时,任何应用都无法访问安全硬件设备,也无法访问属于安全世界状态下的内存、缓存(Cache)以及其他外围安全硬件设备。
在具体的应用环境中,可以将用户的敏感数据保存到TEE中,并由可信应用(Trusted Application,TA)使用重要算法和处理逻辑来完成对数据的处理。当需要用户的敏感数据做身份验证时,则通过在REE侧定义具体的请求编号从TEE侧获取验证结果。
Intel SGX
2013年,英特尔推出了基于TEE的指令集扩展:SGX(全称Intel Software Guard Extension),旨在通过硬件安全为强制性保障, 不依赖于固件和软件的安全状态, 给用户空间提供可信执行环境。
SGX通过一组新的指令集扩展与访问控制机制, 实现不同程序间的隔离运行, 保障用户关键代码和数据的机密性与完整性不受恶意软件的破坏。
与ARM TrustZone的思想不同,SGX采取的方式并不是识别和隔离平台上的所有恶意软件,而是将合法软件的安全操作封装在一个Enclave中,保护其不受恶意软件的攻击,特权或者非特权软件都无法访问Enclave。
一旦软件和数据位于Enclave中,即便操作系统也无法影响Enclave里面的代码和数据。Enclave的安全边界只包含CPU和它自身,这一设计避免了基于软件的TEE自身存在软件安全漏洞与威胁的缺陷, 极大地提升了系统安全保障。
目前,Intel SGX已允许第三方利用“远程验证”机制,构建自己的信任证书颁发。因此在商用层面上,Intel SGX相对比较成熟。
SGX的问题
但是目前Intel SGX也存在一些问题:
过于依赖英特尔。也就是所谓“中心化”,这也是MPC的多种方案中TEE常常被抨击的点。
SGX提供的enclave可使用内存太小, 当程序数量和规模增大时, 需要换进换出页面.为了保证安全性, 需要对页面进行完整性和机密性保障, 导致系统开销大。
无法抵御侧信道攻击。SGX Enclaves仅保护在围圈中运行的代码。这意味着不受信任的操作系统将保留服务资源管理任务,这为侧信道攻击打开了一个很大的缺口。事实上,最近的研究已经证明了一些针对英特尔SGX的侧信道攻击是有效的。
由于enclave处于用户态, 其自身无法执行系统调用, 需要与不可信区域进行交互(运行库的支持有限, 接口的安全性)。在执行系统调用前需要退出enclave, 执行完成后将结果返回到enclave中, 增大了安全风险和系统开销。
不同的计算机系统设计有不同的对象,就好比我们不能让瓮城承担市民居住的功能一样,我们发现TEE与区块链有可以互相补充的适用场景。
区块链TEE能做到什么
区块链对TEE的价值:
通过去中心化网络和共识机制降低英特尔等厂商的安全风险和作恶可能性,保证可信链(此链非区块链)的可用性。
解决Enclave与不可信区域交互的问题。区块链最擅长的即是构建可信网络,不论是BTC还是以太坊,其可信程度都达到了非常好的水平——甚至与TEE的可信程度类似。因此,让TEE通过区块链和区块链智能合约交互是个非常好的互补场景。这也是Phala网络需要跨链能力的重要原因。
TEE对区块链的价值:隐私(机密)保护
一提到隐私保护,大家想到的就是Facebook隐私泄露什么的。其实不只是这样,TEE可以实现的区块链秘密保护更加泛化,还包括通用意义上的“机密”,比如商业类型的、业务沉淀的。
我们常常给隐私保护技术分成三个世代:
第一代技术的典型代表Zcash和门罗币,他们通过零知识证明、环签名、保密转账等技术实现了交易的隐私保护,一个突出的特点就是他们的技术可以保护原生币的交易隐私。
第二代技术的典型代表是Aztec,一个以太坊上的隐私协议,采用和Zcash类似的技术,可以为任何ERC20代币实现交易隐私。第二代技术是第一代的扩展,不过他们都只能实现交易隐私,如果涉及到图灵完备的智能合约就无能为力了。
第三代技术,我们希望把“隐私保护”的概念拓展成“机密保护”,隐私不仅指用户的交易隐私,更应该能保护智能合约中的任何机密数据不被泄漏。目前的智能合约技术,所有的数据都必须完全公开,而我们希望“机密智能合约”(Confidential Smart Contract)可以如同以太坊的图灵完备智能合约一样,可以进行通用的计算,但不必暴露机密数据。
目前机密智能合约技术可以通过多方计算(MPC)与可信执行环境(TEE)实现。前者基于同态加密、零知识证明等纯密码学技术,不依赖硬件,可以高效率的应用在一些特定领域,例如可验证随机数、分布式密钥生成等,但在通用计算上有平均10^6倍的性能损失。后者基于可信计算硬件(主要是Intel的CPU),但已经可以实现非常高效率的通用计算。