想保护自己的数字资产安全?形式化验证给你答案

加密谷Live 2018-06-14

导读

继上篇对当前数字资产领域的安全形势进行了深度分析后,本文将介绍区块链数字资产领域的安全措施与相关的解决方案。

区块链技术是数字资产的新兴载体。相较传统互联网,区块链因其不可篡改、不灭失的特征,对安全性的事先验证等程序机制提出了极高要求。

智能合约是新一代区块链技术的标志性设计,它利用事先定义的接口和协议自动完成合约步骤。以太坊图灵完备的特点在给了智能合约广阔舞台的同时,也背负了巨大的安全压力。如何保证合约本身的可控性、可调度性,以及执行过程中的可信性,成为软件安全和资产安全层面亟待解决的问题。

智能与安全无关

智能合约(smart contract)这个术语由密码学家尼克·萨博(Nick Szabo)在上世纪九十年代中期首次提出。他将其定义为:能够自动执行合约条款的计算机程序。

合约语言的图灵完备意味着,理论上,智能合约可以具备任何功能,执行所有计算。对合约功能的宽松限制不可避免地引入了更多危险。

先回放一段经典案例。 The DAO 事件可以说是智能合约发展史上的一场狂风暴雨。截止到 2016 年 6 月 17 日被攻击之前,该众筹合约已经募集了一亿五千万美金,攻击者利用合约漏洞发动攻击,导致 300 多万以太币资产被分离出 The DAO 资产池。

这一切,都源于 TheDAO 智能合约中一个 splitDAO 函数的小小漏洞 , 攻击者通过该漏洞,不断的从资金池中分离资产给自己。

在该案例中,攻击者仅利用了智能合约的不完备性,就成功窃取了资金池内近三分之一的资产。可见,在智能合约框架下,事先检查合约本身是否存在机制漏洞,是安全问题的关键。 一份安全、完备的智能合约应该具备如下功能:

编制模板框架,确定编程人员,保证代码的准确性。最重要的是,技术层面的内容如何获得合约双方认可; 合约验证。任何程序都有 bug,如果合约内容明显有利于其中一方,需要进行修复,保证合约逻辑正确; 合约定制。根据不同场景定制适配的智能合约模板,根据需求对合约进行组合,形成复合合约; 合约一致性。检验智能合约的执行代码与文本是否一致,不一致的合约可信度不高; 执行过程中的可控性、可调度性和安全性。

形式化方法的引入

为了达到智能合约的理想状态,Certik 等行业先行者从硬件设计领域引入了形式化方法,即:用数学工具进行定义、开发和验证。

硬件电路和软件工程归根结底都是数学问题。如果所有的设计开发都能按照严密的数理逻辑进行,那么开发出来的系统就会像数学本身一样完美:永远正常工作。

通俗地说,形式化方法就像一套完备的法律,规定了每个角色能做什么和不能做什么,并对角色之间的关系进行界定。类似于社会系统架构对不同角色进行分类,在承认个体天性的同时,使系统的复杂程度降低了多个维度。

形式化方法包括形式规约和形式化验证两个层面。

形式规约使用具有精确语法和语义的形式语言来刻画系统行为和特性。在形式化的过程中对对象进行分类、识别和拟合。形式规约约束了系统的代码组成,从系统设计流程上确保了输入组合的有穷性。同时,它也是验证系统正确性的依据。

形式化验证则在形式规约的基础上,建立系统行为及其与性质的关系,从而验证该系统是否满足预期的关键性质。这一过程可以和立法、司法程序类比,即:在对被审判人的权利、义务和其行为进行规范后,总是可以对他进行合理的判断。

file

形式化方法应用于智能合约的整个生命周期。

传统的合约开发并没有成体系地引入形式化方法,因此,一般先用非正式规范来设计合约,然后用形式化规范力求准确地描述合约,并将合约引入形式化的空间。再通过模型检验工具(可以理解为合约模板)检查合约,或使用演绎法证明合约可被正常执行。最后,通过模型工具,将形式化空间中抽象的合约生成代码,通过不断测试生成序列,确保文本和程序代码的一致性。

形式化的规约旨在理解合约代码中内容的抽象本质,相当于对合约进行解读。在验证安全之后,通过使用可执行模型,将较高级别的抽象模型转换为较低级别的代码。

file

形式化方法使智能合约的生成和执行有了规范性约束,保证了合约的可信性,使智能合约的生产过程和执行效果得到了保障。

智能合约形式化验证的原理

形式化验证本身就是使用数学方法严格证明一个程序正确性的过程。

传统的验证方法主要是模拟和测试,即通过实验对系统进行查错。一般的方法是,在一端按系统要求或者自定义输入,观察在另一点的输出。这种方法耗费大量的时间,而且由于实验所能涵盖的系统行为有限,很难找出所有的潜在错误。

冯 . 诺伊曼 (Von Neumann) I948 年发表的相关论文就对这一问题有所触及,但未能提供解决方案。

file

1969 年,托尼·霍尔(Tony Hoare)提出了将程序正确性验证形式化的命题。

file

形式化验证方法可以检查程序的各种属性,如公平性、可达性、有界性和无状态二义性等,从理论上对程序做了全面检验,合格即被认为安全。

在从理论到实践的漫长过程中,形式化验证演化出了很多不同的操作方法。目前一线的技术公司多采用模型检测法,步骤如下:

建模。选择合适的建模语言和建模工具,使用模型检测工具能够接受的形式语言来描述合约。 描述。阐明所要验证的合约性质,包括合约的状态可达性、死锁、活锁、有界性等。 验证。对合约的状态空间进行搜索,发现问题并进行修改,对合约进行迭代验证。

模型检测是对有穷状态系统的一种形式化确认方法,其理论逻辑为:给定一个合约和规约,按照规约生成对应的合约模型,通过证明合约在模型中成立,以此证明合约满足约定规则。

有穷状态模型在建模时有一定难度,需要采集大量样本,并在其中提取逻辑,但因为状态是可穷的,可以保证搜索过程及时终止,因此,在工程上是实际的。

一些一线的技术公司已经将上述方法和流程应用到了区块链智能合约的安全验证上,但效果仍有待检验。

结论

形式化验证理论过去一直服务于集成电路的功能验证,发展多年,已经非常成熟。

智能合约是区块链系统发展应用的重要内容,也是目前传统网络安全公司尚未触及的安全盲区。市场已经发现了形式化验证对于智能合约安全的重要性。然而,安全机制的建立从数学理论变成现实,仍然需要时间。

你可能感兴趣

    参与讨论

    登录后发布
      使用微信扫描关注