在本篇论文中,作者提出了一种可低成本实现、可更新且精细的智能合约访问控制规则(ACRs)的框架——SMAC。这种框架将昂贵的ACR验证和管理操作的负担转移到了链下的基础架构上,同时仅实现了基于区块链的轻量级基于token的访问控制。SMACS除了简单的访问控制列表之外,还可以轻松地实施规则,从而增强智能合约运行时的安全性。
论文名称 | 作者 / 单位 | 来源 | 年份 | 简要内容 |
---|---|---|---|---|
SMACS:Smart Contract Access Control Service | Bowen Liu et.al (Singapore University of Technology and Design) | IEEE/IFIP International Conference on Dependable Systems and Networks (DSN) | 2020 | 提出了一种可成本实现、可更新且精细的智能合约访问控制规则(ACRs)的框架。 |
从本文可知,作者指出现存的智能合约承诺还存在多种的安全问题,这些问题到可通过有效的访问控制来缓解,但是当前区块链平台的特性缺乏隐私、昂贵的链上资源或延迟等问题,使得实现它具有挑战性。另外,由于智能合约的不可变性,当受到攻击时,很难升级或简单的杀死已经部署好的智能合约。
智能合约:一套以数字形式定义的承诺(promises),包括合约参与方可在上面执行这些承诺的协议。
智能合约(Smart Contract)的概念是由计算机科学家、密码学家、法律学家尼克·萨博(Nick Szabo)在1994年提出,一种旨在以信息化方式传播、验证或执行合同的计算机协议,允许没有第三方的参与下进行可信交易。下面这位大佬就是Nick Szabo。
随着2009年比特币、区块链的出现,以及2014年第一个大规模应用的智能合约应用平台——以太坊(Ethereum)开始流行起来,智能合约再次火了起来。
现存问题:若受到攻击,难以杀死已经部署的智能合约;昂贵的链上资源或延迟。
智能合约程序有三个内存区域:堆栈(stack)、内容(memory)和存储(storage)。堆栈和内存是易失性的,使用起来很便宜。存储在区块链上维护,是跨交易的唯一持久内存区域。访问控制是一种安全技术,它规定了谁可以访问某些系统资源。
在整篇论文中,描述了以太坊背景下的SMACS,但它可以很容易地扩展到具有类似功能的其他平台和语言。SMACS包含四种类型的角色:
SMACS支持三种类型的token来代表不同的权限,因此SMACS的访问控制可以归约成对token发行的控制。
所有token都带有TS设置的过期时间,决定了token的生命周期。在客户端从TS获得令牌之前,它必须向TS提交一个格式良好的token请求。如下图:
首先Client进行Token请求,包括token的type类型和一段reqPayload。reqPayload是token请求的一个可选字段,根据类型其大小可变,它包括cAddr(目标合约地址)、sAddr(客户账户地址)、methodID(token访问的方法标识符)、argName(使用的参数)和argValue(参数值)等。然后,TS收到请求后,返回一个86字节的Token,包括type、expire(编码的到期时间)、index(标记一次性属性集)和TS的签名(signature),签名中的type和签名是从客户端发送的token请求中提取。所有符号解释如下表所示。
其实在TS返回token给Client之前,需要先对token进行解析和验证,只有验证通过后,才能发送给Client。SMACS有两个验证过程:一种是TS验证传入的token请求;另一种是智能合约验证从交易中提取的token。
为了实现SMACS框架,对于每个公共和外部方法,将token参数添加到原始参数列表中,并在实际方法主体之前声明执行算法1的verify调用。SMACS可以确保从外部调用的每个方法在执行主体之前验证token,使得旧式合约的代码在SMACS框架中可以部署就绪。
为了便于与旧式合约的结合和转换,作者开发了一个工具,该工具可以将允许任何旧版的智能合约转换成等效的SMACS合约。如下图所示提供了这种转换的示例。只需在内容调用的公共方法情况前,声明和验证token,而内部方法不必验证token。
在SMACS框架中,作者声明了一个非常重要的token使用方法,也就是一次性token。一次性token可确保给定token只能使用一次,它为了至关重要方法的访问控制提供了安全性。例如在TS收到未知客户端的token请求时可能特别有用。在以太坊中采用随机数机制来抵抗重放攻击,但是合约本身无法访问交易的随机数。因此SMACS必须实施合约内的机制,以支持一次性token的验证。
bitmap的状态可表示为一个元组 ( S , s t a r t , s t a r t P t r , e n d , e n d P r t ) (S, start, startPtr, end, endPrt) (S,start,startPtr,end,endPrt),其中 S ∈ { 0 , 1 } n S\in \{ 0,1 \}^n S∈{ 0,1}n , s t a r t ∈ { 0 , 1 , . . . } start\in \{ 0,1,...\} start∈{ 0,1,...}, s t a r t ∈ { 0 , . . . , n − 1 } start\in \{0,...,n-1\} start∈{ 0,...,n−1}, e n d = s t a r t + n − 1 end=start+n-1 end=start+n−1, e n d P t r = s t a r t P t r + n − 1 m o d n endPtr=startPtr+n-1 mod n endPtr=startPtr+n−1modn。在算法2中,这个n-bit序列 S [ s t a r t P t r ] ∣ ∣ S [ s t a r t P t r + 1 m o d n ] ∣ ∣ . . . ∣ ∣ S [ e n d P t r ] S[startPtr]||S[startPtr+1 mod n]|| ... ||S[endPtr] S[startPtr]∣∣S[startPtr+1modn]∣∣...∣∣S[endPtr]指示索引为 s t a r t , s t a r t + 1 , . . . start, start+1,... start,start+1,...和 e n d end end的n个一次性token的状态。
例如:令S为n=8,初始化S所有单元格为0,且start=startPtr=0,end=endPtr=7.
当外部账户发起交易时,一个被调用的合约方法可以调用另一个合约的方法,并可以一直延续下去。若使用了SMACS调用链上的智能合约,则客户端必须为所有这些智能合约获取适当的token。
如图,客户端触发调用链之前,需从 S C A , S C B , S C C SC_A,SC_B,SC_C SCA,SCB,SCC对应的TS中获取三个token, t k A , t k B , t k C tk_A, tk_B, tk_C tkA,tkB,tkC。并可以在交易中嵌入如下形式的三个token的数组:
S C A : t k A ∣ ∣ S C B : t k B ∣ ∣ S C C : t k C SC_A: tk_A || SC_B: tk_B || SC_C: tk_C SCA:tkA∣∣SCB:tkB∣∣SCC:tkC
SMACS中的每种token类型,都有一组与之关联的规则。特定类型的token请求将根据与该类型的规则集进行检查。
后面一章节就是介绍与两种流行的案例(Hydra和Re-entrancy攻击)的结合,讨论了其可以使用第三方工具来实施用于增强某些运行时安全性属性的高级规则,这里就不再详细阐述,建议看原论文。
实验环境:Solidity v0.4.24开发环境,部署在的测试网。TS由运行Node.js v10.2.1与node-localStorage package的Web服务器,用于存储规则和签名密钥对。使用web3.js实现client和owner,以太坊的ECDSA签名方案作为默认方案。
实验环境:在macOs Sierra 10.12.6,Intel Core i5 CPU(2.7 GHz)和8GB RAM系统上评估TS的吞吐量。对每种类型的token,向TS发送 1 0 i ( 0 ≤ s ≤ 5 10^i(0\leq s≤5 10i(0≤s≤5)的token请求,记录TS所需总时间,并计算每个请求所需的平均时间。
总结全文,作者提出了一种结合轻量级链上验证和链外访问控制管理的基础架构,可大致分为以下三个重点:
个人的疑问和思考: