智能合约安全指南.pdf

返回 相关 举报
智能合约安全指南.pdf_第1页
第1页 / 共59页
智能合约安全指南.pdf_第2页
第2页 / 共59页
智能合约安全指南.pdf_第3页
第3页 / 共59页
智能合约安全指南.pdf_第4页
第4页 / 共59页
智能合约安全指南.pdf_第5页
第5页 / 共59页
亲,该文档总共59页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
2 0 2 0 云安全联盟大中华区- 版权所有 12 0 2 0 云安全联盟大中华区- 版权所有 2 2 0 2 0 云 安 全 联 盟 大 中 华 区 - 保 留 所 有 权 利 。 你 可 以 在 你 的 电 脑 上 下 载 、 储 存 、 展 示 、 查 看 、 打 印 及 , 或 者 访 问 云 安 全 联 盟 大 中 华 区 官 网 ( h t t p s : / / w w w . c - c s a . c n ) 。 须 遵 守 以 下 : ( a ) 本 文 只 可 作 个 人 、 信 息 获 取 、 非 商 业 用 途 ; ( b ) 本 文 内 容 不 得 篡 改 ; ( c ) 本 文 不 得 转 发 ; ( d ) 该 商 标 、 版 权 或 其 他 声 明 不 得 删 除 。 在 遵 循 中 华 人 民 共 和 国 著 作 权 法 相 关 条 款 情 况 下 合 理 使 用 本 文 内 容 , 使 用 时 请 注 明 引 用 于 云 安 全 联 盟 大 中 华 区2 0 2 0 云安全联盟大中华区- 版权所有 3 致 谢 云安全联盟大中华区(简称:CSA GCR)区块链安全工作组在 2020 年 2 月份成立。 由黄连金担任工作组组长, 9 位领军人分别担任 9 个项目小组组长, 分别有 : 知道创宇 创 始 人 云安全联盟 CSA 公众号2 0 2 0 云安全联盟大中华区- 版权所有 4 序 言 智能合约作为区块链的重要技术极大地扩展了区块链的应用场景与现实意义, 被广 泛地应用于金融、游戏、保险、物联网等多个领域,但同时也面临着严重的安全风险。 相比于普通程序而言, 智能合约的安全性不仅影响合约参与多方的公平性, 还影响合约 所管理的庞大数字资产的安全性。 因此, 对智能合约的安全性及相关安全漏洞开展研究 显得尤为重要。 C S A G C R 对于智能合约的安 全进行系统化研究 , 从不同的角度去分 析智能合约的安 全, 从智能合约开发者角度, 在第一章从智能合约的安全框架出发提出了测试标准 , 可 以为开发者在内部安全测试中参考。 第二章结合部分典型案例, 具体剖析曾发生过的经 典 智 能 合 约 安 全 事 件 和 深 层 次 原 因 , 有 利 于 开 发 者 了 解 已 经 发 生 过 的 智 能 合 约 安 全 事 件, 引以为戒。 第三章分析总结智能合约最佳实践, 包括针对智能合约生态常见问题的 基本对策、 社区最佳实践和安全开发资料 , 以及推荐工具, 可以在开发过程中使用。 第 四章从第三方审计的角度介绍智 能合约安全审计的 C h e c k l i s t ,供第三方审计参考使用 。 第五章做了简要的总结。 本文档主要用 S o l i d i t y 语言进行说明 , 因为绝大多数的智 能合约是用 S o l i d i t y 进行编 程的, 但是大部分安全指南内容也可以用到其他编程语言开发的智能合约。 智能合约的 技术和编程语言在不停地发展, 安全方面也需要与时俱进。 本文档作为第一个版本抛砖 引玉,希望专家们批评指正。 李雨航 Y a l e L i C S A 大中华区主席兼研究院院长2 0 2 0 云安全联盟大中华区- 版权所有 5 目 录 致谢. 2 序言. 4 1 . 测试 标准. 6 1 .1 合约 平台 底层安 全. 6 1.2 合约设计与实现安全. 8 1.3 合约生态工具安全. 11 1.4 合约交互与数据安全. 13 2 . 典型 案例. 1 5 2.1 重入漏洞. 15 2.2 整数溢出漏洞. 15 2.3 合约库安全问题. 16 2.4 复杂 DeFi 协议组合安全. 16 2.5 非标准接口. 16 2.6 管理员权限过高或较中心化. 17 2.7 业务逻辑与区块链共识产生冲突. 17 2.8 开发者应持续关注更多安全案例. 18 3 . 最佳 实践. 1 8 3.1 基本对策. 18 3.2 社区最佳实践和安全开发资料. 20 3.3 推荐工具. 21 4:以 太坊 智能合 约审 计 C he ckL is t. 2 2 4.1 编码规范问题. 23 4.2 设计缺陷问题. 26 4.3 编码安全问题. 32 4.4 编码设计问题. 42 4.5 编码问题隐患. 49 5 . 总结. 5 7 参考 资料. 5 82 0 2 0 云安全联盟大中华区- 版权所有 6 1 . 测 试 标 准 智能合约是部署和运行在区块链上的程序。 借助区块链, 智能合约可以实现资产管 理 、 多 方 游 戏 等 各 类 去 中 心 化 应 用 ( d A p p ) 。 与 传 统 程 序 一 样 , 智 能 合 约 中 存 在 漏 洞 也在所难免。 然而不同的是, 智能合约运行在更为开放的环境中 , 并天生带有金融属性 , 且升级成本极高。 这意味着其对安全的要求更高, 任何一点瑕疵都可能带来无法预估的 后果。 智能合约安全本身是一个系统性和专业性极强的工程, 需要综合考虑合约平台底层 安全、 合约设计与实现安全、 合约生态工具安全 、 合约交互与数据安全等各方面, 任何 一个环节出现细微问题都会留下极大的隐患。 本标准从以上各个方面分别阐述, 并给出 详细具体要求,旨在通过规范测试标准提升智能合约安全水平。 图 1 - 1 下面 , 我们 从合 约平台 底层安全 、合约 设计与 实现安 全、合约 生态工 具安全 、合 约交互与数据安全四个方面规范智能合约安全测试标准。 1 . 1 合 约 平 台 底 层 安 全 本部分讨论智能合约平台相关的底层安全,包括虚拟机、区块链节点等2 0 2 0 云安全联盟大中华区- 版权所有 7 1 . 1 . 1 虚 拟 机 安 全 虚 拟 机 是 智 能 合 约 运 行 所 需 的 环 境 ( 例 如 应 用 最 广 泛 的 以 太 坊 E V M ) , 关 系 着 合 约的执行结果, 以及能否对区块链状态进行正确更改。 虚拟机安全是智能合约安全的重 要基石, 合约执行功能的正确性、 区块链系统的安全性都与之密切关联 。 智能合约必须 能在虚拟机内正确且安全地执行。 具体要求: 1 、不同操作符资源定价合理(如以太坊中对不同指令收取不同 G a s 费用) 2 、准确执行操作符,操作符无二义性 3 、能保证合约程序的终止性 4 、能够安全处理异常调用 5 、能保证合约对数据段的正确读取权限 6 、不包含存在明显安全隐患的特性 7 、不存在虚拟机逃逸漏洞 8 、不存在任意代码执行漏洞 9 、不存在 D O S 漏洞 1 0 、预编译合约(内建合约、系统合约)调用与执行安全 1 . 1 . 2 区 块 链 节 点 安 全 完整的区块链系统由众多部署运行在不同机器上的节点构成。 智能合约通过交易的 形式在节点上部署和执行, 而节点则会开放接口供外部调用或查询合约。 节点需做好最 坏情况下的安全防护, 确保主机安全。 智能合约的部署与运行应不影响区块链节点的正 常工作,且不影响节点间的同步与共识。 具体要求2 0 2 0 云安全联盟大中华区- 版权所有 8 1 、区块链系统(节点)运营者需要做好安全防护,保障主机安全 2 、区块链系统(节点)需要防止已部署合约代码被任意篡改 3 、区块链系统(节点)需要防止针对已部署合约的非法调用 4 、提供合约查询和调用服务的节点需确保自身状态正确且保持最新 5 、防止合约部署或调用占用节点过多计算资源 6 、防止合约部署或调用引起节点崩溃 7 、能够正常防范针对节点发起的其他形式的攻击 1 . 2 合约 设计 与实 现安 全 本部分讨论智能合约代码实现层面的安全, 包括常见安全漏洞、 业务逻辑安全 、 规 范标准、权限安全等。 1 . 2 . 1 常 见 合 约 安 全 漏 洞 智能合约开发者应当熟悉各类常见的安全漏洞, 在编写智能合约时注意规避。 另外 还 尤 其 要 关 注 传 统 程 序 与 智 能 合 约 开 发 之 间 的 差 异 。 合 约 代 码 实 现 应 规 避 常 见 安 全 漏 洞。 具体要求: 1 . 正常通过编译且无警告输出 2 . 合约各功能能够正常执行 3 . 不存在冗余代码 4 . 能够安全进行和接受转账 5 . 无数值溢出漏洞 6 . 无随机数预测漏洞2 0 2 0 云安全联盟大中华区- 版权所有 9 7 . 依赖的合约代码库安全可靠 8 . 合理校验输入数据 9 . 严格进行权限校验 1 0 . 不存在未知步数循环 1 1 . 无重入(R e e n t r a n c y )漏洞 1 2 . 充分检查合约中硬编码的地址 1 3 . 通知事件(E v e n t )与代码实际执行保持一致 1 4 . 关键逻辑判断不依赖可被矿工操纵的变量(区块哈希、时间戳等) 1 5 . 关键逻辑判断不依赖可被用户任意操纵的变量(如合约内资产数量等) 1 6 . 无严重消耗资源(如以太坊平台的 G a s 、E O S 平台的 R a m )的操作 1 7 . 合约 正式 部署 上线前 应该 经过 详细 测试 (核 心代 码测 试覆盖 率 9 5 % 以上 ) 或第 三方安全审计 1 . 2 . 2 业 务 逻 辑 安 全 作为去中心化应用的核心部分, 智能合约还需要可靠的设计。 糟糕的设计可能会引 入难以发现的深层次安全问题, 这类问题往往无法简单通过扫描源代码发现。 智能合约 设计者需要综合考虑业务逻辑、 多角色权限和博弈、 区块链共识等多方面因素 。 合约业 务逻辑设计与实现应不存在明显安全问题。 具体要求: 1 . 合约的机制设计无明显缺陷 2 . 合约代码实现与业务逻辑设计相符合,不存在歧义 3 . 多角色的合约,各角色权限和优先级划分明确 4 . 多角色的合约,各角色之前的公平性有一定保障2 0 2 0 云安全联盟大中华区- 版权所有 1 0 5 . 存在博弈环节的合约,博弈过程无明显漏洞 6 . 不存在抢先交易或交易顺序依赖的风险 7 . 不存在拒绝服务(D e n i a l - o f - S e r v i c e , D o S )风险 8 . 不会因薅羊毛等行为给合约正常运行造成不良影响 9 . 不存在交易参数签名重放问题 1 0 . 业务逻辑不会与合约所属区块链系统共识机制产生冲突 1 . 2 . 3 合 约 规 范 标 准 智能合约开发应当做到规范, 遵循社区公认的代码最佳实践, 以降低代码安全审计 复杂度。 智能合约本身表达比较灵活, 而社区或特定行业会因为发展需要 , 对同类型的 合约进行接口规范约定。这可以降低与各个合约的对接成本,并利于统一收录和交互。 相反,如果合约规范标准得不到应有的重视,则会出现各类兼容性问题甚至安全隐患。 特定类型合约应符合相应标准。 具体要求: 1 . 函数及变量标明可见性,遵循变量声明和作用域的规范 2 . 变量标明数据类型 3 . 不使用已过期或即将废弃的用法 4 . 代码风格简洁,命名规范 5 . 特定类型合 约实现严格按照相 关合约标准 (如 E R C 2 0 、 E R C 7 2 1 ), 保持接口和 实现的兼容性 6 . 使用经过多方充分讨论和审计的合约标准和代码实现 7 . 优先 使用经 过详细 测试或 审计的 可靠合 约代码 库,并 确保在 理解的 情况下 进行 使用2 0 2 0 云安全联盟大中华区- 版权所有 1 1 8 . 规范使用内置函数 1 . 2 . 4 合 约 权 限 安 全 部分智能合约会受管理员控制, 而部分管理员甚至拥有极高的特殊权限, 特定场景 下会威胁合约其他用户的资产安全。 为了智能合约安全, 我们一方面需要警惕超级管理 员作恶, 另一方面需要考虑管理员身份被盗用所带来的后果。 接口调用权限 、 管理员权 限等需要划分清晰。 具体要求: 1 . 限制管理员的特殊权限,防止权限过大,不可危及普通用户安全 2 . 合约管理员账户应该通过多重签名钱包(合约)的方式来安全管理 3 . 安全保护管理员私钥,防止因管理员身份被盗用对合约造成致命影响 4 . 无其他极易发生 单点失效 的薄弱环节, 必要时引入多签账户或 D A O 降低风 险 1 . 3 合约 生态 工具 安全 本部分讨论智能合约生态基础设施工具安全,包括合约语言、编译器、测试工具、 代码扫描工具等。 1 . 3 . 1 合 约 语 言 设 计 安 全 开发者会使用特定的智能合约语言编写智能合约, 而合约语言本身的设计会从底层 影响开发难度、开发效率以及合约安全性。 具体要求: 1 . 具备完整明确的语义定义 2 . 不存在容易导致漏洞的非确定语义 3 . 语言开发文档描述完整,文档定义与语言实现保持一致2 0 2 0 云安全联盟大中华区- 版权所有 1 2 4 . 不包含存在安全隐患的特性 1 . 3 . 2 编 译 器 安 全 编译器通过语法、 语义分析, 将开发者编写的源代码经过解析最终转换为目标代码 (通常是机器码) 。 安全可信的编译器对于智能合约安全尤为重要 : 一方面, 编译器需 确保源代码到目标代码的正确翻译, 不引入错误; 另一方面, 编译器还可具备一定的安 全检测特性,从而可尽早帮助开发者发现源代码中的常见安全风险。 具体要求: 1 . 能够正确地将源代码翻译成目标代码 2 . 能够检查常见合约漏洞并给出清晰的提示 3 . 编译优化不应引入新的代码漏洞或改变代码原始功能 4 . 编译器的实现具备完整的测试框架和测试用例 1 . 3 . 3 测 试 工 具 、 代 码 扫 描 工 具 、 测 试 环 境 智能合约平台应该为开发者提供良好的调试工具、 代码扫描工具和测试环境, 降低 开发者测试成本,进而提高代码质量。 具体要求: 1 . 备有完善的调试工具,方便开发者部署和调用合约,追踪状态变化 2 . 备有 先进的 代码扫 描工具 ,如利 用静态 代码扫 描、动 态代码 分析、 模糊测 试等 技术,供开发者快速扫描代码,对高风险处给出警示 3 . 备有公开的测试网络,能够准确模拟正式主网 4 . 备有 高度自 动化的 测试框 架,方 面开发 者进行 单元测 试、回 归测试 等操作 ,并 提供准确的测试用例覆盖率分析报告 5 . 支持连接正式主网,便于对已部署程序进行检查测试2 0 2 0 云安全联盟大中华区- 版权所有 1 3 1 . 3 . 4 合 约 形 式 化 规 范 、 形 式 化 验 证 工 具 采 用 形 式 化 验 证 工 具 对 合 约 进 行 可 靠 性 验 证 、 采 用 形 式 化 语 言 为 智 能 合 约 编 写 规 范。 具体要求: 1 . 开发者应该优先选择经过完整形式化证明的模版代码 2 . 高价值的智能合约应考虑引入形式化验证技术来保障安全 3 . 形式 化验证 工具能 够对智 能合约 代码进 行自动 化的扫 描和验 证,提 供详细 的问 题定位和修改建议 4 . 形 式 化 验 证 工 具 能 够 对 通 过 检 查 的 智 能 合 约 代 码 自 动 出 具 带 有 签 名 的 验 证 报 告,作为代码安全性的证明文件 1 . 4 合约 交互 与数 据安 全 本 部分 讨论 智能 合约 与外 部 应用 发生 交互 的安 全性 、 链上 数据 安全 以及 链 下 “ 预 言 机” 安全。 1 . 4 . 1 外 部 应 用 与 合 约 交 互 安 全 外部应用或用户与合约交互的形式包括部署、 查询、 调用。 用户通常会使用特定工 具对合约发起操作, 合约则需提前公示准确的接口描述。 用户不应该随意调用未知的合 约,合约也需要对用户的输入做严格检查。 具体要求: 1 . 外部应用或用户可正常通过接口访问或调用智能合约功能 2 . 合约需要为外部调用者提供详细的接口说明 3 . 外部应用或用户应使用安全的工具与合约交互 4 . 合约各个函数实现需对传入参数做严格校验2 0 2 0 云安全联盟大中华区- 版权所有 1 4 5 . 检查合约代码实现与触发的外部事件是否一致,事件是否会非预期地触发 6 . 需评估不同种类的合约经过组合使用后的安全风险 7 . 不调用未知合约 8 . 对接外部合约之前需要有兼容性的安全评估和测试 9 . 调用外部合约需要对其返回值等进行校验 1 . 4 . 2 数 据 上 链 安 全 真实业务数据上链需注意数据安全问题。 具体要求: 1 . 防范敏感或隐私数据的非预期泄漏 2 . 防范敏感或隐私数据被非授权使用或访问 3 . 需解决特定应用场景下的数据可靠性和真实性问题 4 . 需考虑特定数据上链后公开且不可更改与法律法规的合规性问题 1 . 4 . 3 链 下 “ 预 言 机 ” 安 全 智能合约通常无法直接 获取外部世界的真实信息 , 因此需要预言机 ( O r a c l e )为其 提供安全获取外界信息的能力, 预言机是链接智能合约与外部世界信息的基础设施, 应 用场景广泛。 具体要求: 1 . 根据 具体业 务选择 合适的 预言机 ,比如 常规合 约可选 择中心 化预言 机,而 高额 资产交易合约应优先选择去中心化预言机。 2 . 应确保预言机所提供的数据不被轻易恶意操纵和篡改 3 . 应确保预言机能保障数据真实性、时效性和可用性2 0 2 0 云安全联盟大中华区- 版权所有 1 5 4 . 合约 实现逻 辑中应 对所预 言机可 能发生 的 所有异常 进行检 测和处 理,以 保障 各 类情况下合约自身的安全 2 . 典 型 案 例 智能合约开发者很容易在缺乏经验和警惕的情况下, 写出存在安全漏洞的智能合约 代码, 并且未经充分的测试和审计, 匆忙部署上线 , 最终酿成严重的安全事件。 通过分 析经典的智能合约安全事件案例,可以更深入地理解智能合约安全。 2 . 1 重入 漏洞 2 0 1 6 年 6 月 1 8 日 , 针 对 D A O 合 约 的 攻 击 导 致 超 过 3 , 6 0 0 , 0 0 0 个 E t h e r 的 损 失 。 攻击源于 D A O 一个关键合约引入了重入漏洞, 黑客可以对转账函数进行递归重入, 在 不减少个人余额的情况下不断地提走以太币。 这次攻击之后的以太坊硬分叉导致了以太 坊社区的分裂。 2 . 2 整数 溢出 漏洞 整 数 溢 出 漏 洞 也 是 智 能 合 约 中 常 见 的 安 全 漏 洞 。 例 如 , u i n t 2 5 6 是 以 太 坊 智 能 合 约 语 言 S o l i d i t y 中 最 常 用 的 无 符 号 整 数 类 型 , 它 可 表 示 的 整 数 范 围 为 0 2 2 5 6 - 1 。 当 程序中的计算结果超过此范围时, 就会发生整数溢出。 且 一旦发生, 后果通常十分严重 。 在 智能 合 约 中, 整 数通 常 与 T o k e n 账 户余 额 或 者其 他 关键 程 序逻 辑 相 关。 利 用整 数 溢 出漏洞, 精心构造传入参数, 可以让程序极大地偏离本来的设计意图, 从而引发一系列 难以预知的问题。 2 0 1 8 年 4 月 2 2 日 , 黑 客 攻 击 了 美 链 ( B E C ) 的 T o k e n 合 约 , 通 过 一 个 整 数 溢 出 安 全漏洞,将大量 T o k e n 砸向交易所,导致 B E C 的价格几乎归零。 2 0 1 8 年 4 月 2 5 日, S M T 爆出类似的整数溢出漏洞 , 黑客通过漏洞制 造和抛售了天 文数字规模的 T o k e n ,导致 S M T 价格崩盘。 整数溢出漏洞可能造成以下严重后果: 1 . 使程序偏离设计意图2 0 2 0 云安全联盟大中华区- 版权所有 1 6 2 . 实现 T o k e n 无限量增发 3 . 绕过权限控制或余额校验 4 . 完成一些虚假操作 5 . 被 T o k e n 管理员利用,留下作恶空间 2 . 3 合约库 安全 问题 2 0 1 7 年 1 1 月 0 6 日 , P a r i t y 多 重 签名 钱 包 漏 洞 导 致 了超 过 5 1 3 , 7 0 1 个 以 太币 被 锁 死,至今关于以太坊是否需要通过硬分叉方式升级 ( E I P 9 9 9 ) 争论还在继续。 2 . 4 复杂 D e F i 协议 组合 安全 2 0 2 0 年 2 月 1 5 日、 2 月 1 8 日, D e F i 项目 b Z x 借贷协议遭遇两次 攻击 , 先后损失 3 5 万美元和 6 4 万美元。 两次攻击手法复杂且不完全 相同 , 利用新型借贷产品“ 闪电贷” 将攻击成本降至最低并扩大攻击收益, 同时又与价格预言机、 杠杆交易、 借贷、 价格操 纵、抢先交易紧密关联,充分利用了多个 D e F i 产品间的可组合性来达到攻击目的。 2 0 2 0 年 4 月 1 9 日, 去中性化 借贷协议 L e n d f . M e 遭遇黑客 攻击 , 合约内价 值 2 5 0 0 万 美元 的 资 产被 洗 劫一 空 , 直接 原 因在 于 产 品本 身 的可 重 入问 题 和 特殊 的 E R C - 7 7 7 类 型代币 i m B T C 组合之后引入 的新的安全风险 。 同时因为此问 题被攻击的还有 U n i s w a p 去中心化交易所。 2 . 5 非标 准接 口 以 最 被 广 泛 接 受 的 智 能 合 约 T o k e n 标 准 E R C 2 0 为 例 , 很 多 T o k e n 合 约 未 参 照 E R C 2 0 标准实现, 这给 d A p p 开发带来很 大的困扰。数以千 计的已部署 T o k e n 合约曾 经参 考了以太 坊官网 (现已 修复 ) 以及 O p e n Z e p p e l i n (5 2 1 2 0 a 8 c 4 2 2 0 1 7 年 3 月 2 1 日 6 3 3 1 d d 1 2 5 d 2 0 1 7 年 7 月 1 3 日 ) 给 出 的 不 规 范 模 版 代 码 , 多 个 函 数 实 现 没 有 遵 循 E R C 2 0 规范, 导致 S o l i d i t y 编译器 升级至 0 . 4 . 2 2 后出现严重的 兼容性问题 ,无法 正常 转账2 0 2 0 云安全联盟大中华区- 版权所有 1 7 2 . 6 管理 员权 限过 高或 较中 心化 2 0 1 8 年 7 月 1 0 日, 加密货币交 易平台 B a n c o r 称遭到攻击, 丢失了折算 法币金 额为 1 2 5 0 万美金 的以太坊 , 1 0 0 0 万美金 的 B a n c o r 代币和 1 0 0 万美金 的 P u n d i x 代 币。 这次攻击黑客并非利用了 B a n c o r 平台合约的漏洞, 而是通过盗取了其智能合 约管 理员 账户的 私钥 。 B a n c o r 主要 合约包 括 S m a r t T o k e n 和 B a n c o r C o n v e r t e r , 分别 为 E R C 2 0 T o k e n 合约以 及与业务相 关的 T o k e n 转换交 易合约。此次 被盗事件与 B a n c o r C o n v e r t e r 合 约 有 关 , 攻 击 者 极 有 可 能 获 取 了 合 约 管 理 员 账 户 的 私 钥 , 对 转 换 代 币 合 约 B a n c o r C o n v e r t e r 拥 有极 高权 限 。 o w n e r 作 为该 合约 的 所有 者 和管 理员 , 有唯 一 的权 限 通 过 w i t h d r a w T o k e n s ( ) 方 法 提 走 合 约 中 的 全 部 E R C 2 0 T o k e n 至 任 意 地 址 。 事 件 发 生 后 不少人质疑 B a n c o r 项目智能合约中 o w n e r 管理员的超级权限,甚至称之为“ 后门” 。 2 . 7 业 务 逻 辑 与 区 块 链 共 识 产 生 冲 突 曾 经红 极 一时 的类 F o m o 3 D 游 戏, 就 曾因 随 机 数预 测 攻 击 和 阻塞 交 易 攻 击丧失游戏公平性,沦为黑客淘金的重灾地。 类 F o m o 3 D 游 戏的 空 投机 制利 用 随 机 数 来 控制 中奖 概 率, 但 是由 于 随机 数 的 来源都是区块或者交易中特定的一些公开参数, 如交易发起者地址、 区块时间戳 、 区块 难度等,因此在以太坊上可以很容易的预测所谓的随机数。 而 阻塞交易 攻击是黑客通过高额手续费吸引矿工优先打包, 并利用合约自动判 断游戏进行状态,以之作为是否采取攻击的依据。黑客最终能够以较低成本堵塞区块, 每个区块中仅打包很少的交易(降低他人交易被打包的可能性),使得游戏快速结束, 并提高自己获得最终大奖的概率。 所有采用类似机制, 即需要玩家抢在某个时间范围内 完成某种竞争操作的智能合约,都会受此威胁。 类 F o m o 3 D 游 戏中 黑 客利 用了 以 太坊 共 识协 议 的特 点, 找 到游 戏 机制 的 漏洞 进 而 发起攻击。 智能合约游戏或应用的业务设计是一项极其复杂的系统工程, 除了代码本身, 还涉及到平台外部环境, 博弈论等方面问题 , 这也是容易被黑客攻击的环节。 因此, 在 业务设计过程中应尤为慎重,必须充分考虑区块链的特性2 0 2 0 云安全联盟大中华区- 版权所有 1 8 2 . 8 开发 者应 持续 关注 更多 安全 案例 除了上面提到的典型案例外, 智能合约领域还有很多值得研究的漏洞案例, 并且各 类新型的攻击手法层出不穷。智能合约本身还很不完善,并且还处在爆发式地发展中, 存在 着各类未 知风险 。 为了 开发成熟 、安全 、可靠 的智能合 约,开 发者应持 续关注 更 多安全案例,从中学习经验教训。 3 . 最 佳 实 践 从智能合约开发者方面来看, 区块链项目的爆发吸引了大量开发者, 而这些开发者 往 往 只 能 从 简 单 的 参 考 和 修 改 网 上 良 莠 不 齐 甚 至 有 严 重 漏 洞 的 示 例 代 码 开 始 进 行 学 习 开发。对于资深智能合约开发者而言,实现安全无漏洞的智能合约依旧是不小的挑战。 事实上,开发者可以通过遵循最佳实践的方法,提高代码质量,降低安全风险。 3 . 1 基本 对策 针对智能合约安全生态中常见的问题,有如下几点基本对策: 1 . 规范合约安全开发和发布流程 2 . 引入形式化方法保障合约安全 3 . 开发更优秀的合约语言、编译器和虚拟机 4 . 社区应重视合约标准 对 策 一 : 规 范 合 约 安 全 开 发 和 发 布 流 程 目前鲜有智能合约开发团队具备完善的合约开发和发布流程。 我们建议开发团队按 照从设计、 开发、 测试、 审计到部署和监控的顺序 , 安全规范开发。 尤其需要重视设计、 测试以及必要时引入外部第三方安全审计。 开发者可阅读智能合约安全开发资料, 熟悉常见安全漏洞和安全事故, 并自觉规避。 此外, 开发者也可在开发过程中引入开源的智能合约安全自动扫描工具, 从而规范2 0 2 0 云安全联盟大中华区- 版权所有 1 9 合约代码书写,并提前发现常见的安全风险。这些工具通常采用静态分析、符号执行、 污点分析、模糊测试等技术,可较快扫描出常见的漏洞和高风险代码。 对 策 二 : 引 入 形 式 化 方 法 保 障 合 约 安 全 形式化方法 特指用来对软件和硬件系统进行规范, 设计和验证的数学理论及相 关工具。 其 中 , 形式 化 规 范 ( f o r m a l s p e c i f i c a t i o n ) 通 过 数 学语 言 对 系 统 的预 期 行 为 ( 例 如 将 数量 S 的 t o k e n 从账 户 A 转移 到账户 B ) 和性 质 ( 例如 转账不会 造成账户 B 额度 的 溢出) 进行严格和全面的定义。形式化规范往往定义了系统的正确性和安全性。 给定一个系统的形式化规范, 我们即可以从规范出发开始迭代设计和实现出这个系 统。 在迭代 的每一步中 , 我们可 以通过精化 ( r e f i n e m e n t ) 、 集成 ( s y n t h e s i s ) 、 形式化 证 明 在 内 的 一 系 列 方 法 在 数 学 上 严 格 的 保 证 迭 代 产 生 的 系 统 和 迭 代 前 的 规 范 或 者 系 统 保 持一致。 除 了 从 形 式 化 规 范 出 发 设 计 和 实 现 一 个 系 统 , 我 们 也 可 以 使 用 包 括 符 号 执 行 ( s y m b o l i c e x e c u t i o n ) 、 模 型 检 测 ( m o d e l c h e c k i n g ) 和 形 式 化 证 明 ( f o r m a l p r o v i n g ) 在 内 的 一系列方法验证已有的设计和实现与该规范保持一致。 所有的定义都是通过严格的数学 语言描述, 推导和检查也是严格的数学推导和证明。 在实践中, 推导和证明无法进行下 去往往意味着设计和实现中存在不符合规范的 b u g 。 通过分析推导和证明卡壳的位置和 原因,往往可以定位出 b u g 在设计和实现中 具体位置和成因。 通过形式化方法对智能合约的行为进行精确地数学推理和证明, 可以保证智能合约 的行为符合开发者的设计意图, 从而保证代码的安全性。 基于数学证明的形式化方法为 开发高可信的软件系统提供了有效的手段。 对 策 三 : 开 发 更 优 秀 的 合 约 语 言 、 编 译 器 和 虚 拟 机 部分智能合约代码安全问题实际可以通过改进智能合约语言、 编译器和虚拟机来规 避。而事实上不少漏洞也正是因为语言设计、编译器或虚拟机实现问题而产生。 很多智能合约语言一方面提供高度的灵活性和强大的表达能力, 另一方面又缺乏完2 0 2 0 云安全联盟大中华区- 版权所有 2 0 备的开发文档和语义定义, 特别是对语言版本之间不兼容性的醒目提示, 所有这些常常 会导致开发者意外地忽略语言中的重要细节和混淆语言中的各种概念, 例如以太坊智能 合约 语言 S o l i d i t y 中忽 略地 址对齐 问题 导致 短地址 攻击 ,混淆 t x . o r i g i n 和 m s g . s e n d e r 导致的身份认 证错误 , b l o c k h a s h 的确定性导致 的其不能作为随机数种 子 , S o l i d i t y 不同 版本对返回值的不同校验方式导致的旧智能合约不能正常调用等。 目前流行的智能合约 语言, 由于历史遗留问题, 都或多或少存在着一些设计上的失误, 进而容易误导开发者 写出高风险的代码。社区完全可以尝试重新设计和拥抱更好、更安全的智能合约语言; 甚至可以发展出面向特定领域的合约语言, 在减少灵活性和表达能力的同时降低开发者 出错的可能。 对 策 四 : 社 区 应 重 视 合 约 标 准 区块链社区的特点是组织较松散, 这也间接影响了智能合约标准的质量以及开发者 对标准提案的重视程度。 目前以太坊合约标准提案由志愿者自行提出和发表, 由社区成员自由讨论, 现已发 展 出 包 括 E R C - 2 0 、 E R C - 7 2 1 、 E R C - 9 9 8 、 E R C - 1 1 5 5 、 E R C - 1 1 7 8 在 内 的 一 系 列 合 约 提 案 或 标准。 然而, 存在两个隐患可能会威胁合约安全。 一方面, 标准提案或代码实现质量良莠 不齐。前文提到曾发生合约模版代码存在问题和有安全风险的提案实现进入代码仓库。 这种问题一旦发生,影响都十分严重。社区必须重视提案和代码实现质量。另一方面, 合约标准提案仅通过文档的形式描述, 难以检查和验证代码是否符合标准。 开发者根据 提 案 实 现 代 码 时 , 不 能 方 便 地 快 速 测 试 正 确 性 , 从 而 容 易 引 发 兼 容 性 和 安 全 性 问 题 。 E R C - 7 2 1 在这方面有不错的表现,社区提供了基于大量测试用例的 代码验证器。 事实上, 社区也可以通过为合约标准定义 形式化规范 , 进一步严格定义合约实 现的各种预期行为,并可以与前文提到的形式化方法实现对接。 3 . 2 社区 最佳 实践 和安 全开 发资 料 开发者可以参考和遵循以下社区最佳实践和安全开发资料2 0 2 0 云安全联盟大中华区- 版权所有 2 1 D A S P T o p 1 0 E t h e r e u m S m a r t C o n t r a c t B e s t P r a c t i c e s ( C o n s e n S y s D i l i g e n c e ) E t h e r e u m S m a r t C o n t r a c t s S e c u r i t y C h e c k L i s t F r o m K n o w n s e c 4 0 4 T e a m A g u i d e t o E O S s m a r t c o n t r a c t s e c u r i t y b e s t p r a c t i c e s ( S l o w m i s t ) S o l i d i t y S e c u r i t y B l o g 3 . 3 推荐 工具 智能合约安全生态已经产生了一些优秀的代码安全工具和分析工具, 研究人员可以 借助这些工具进行智能合约安全分析,开发者也可以在开发测试过程中引入这些工具, 以提升代码质量,提前发现安全风险。 3 . 3 . 1 安 全 工 具 S l i t h e r S l i t h e r 是 一个 S o l i d i t y 智 能合 约静 态分 析 框架 ,还 提 供了 一个 A P I 来 给研 究人 员 通过自定义脚本审计 S o l i d i t y 代码。我们可以使用 S l i t h e r 做到: 1 . 识别能够修改变量值的代码 2 . 隔离受特定变量值影响的条件逻辑语句 3 . 查找能够调用特定函数的其他函数 项目地址:h t t p s : / / g i t h u b . c o m / c r y t i c / s l i t h e r M y t h r i l M y t h r i l 是一款针对 E V M 字节码进行安全审计的工具,同时支持在线合约审计。 项目地址:h t t p s : / / g i t h u b . c o m / C o n s e n S y s / m y t h r i l E c h i d n a2 0 2 0 云安全联盟大中华区- 版权所有 2 2 E c h i d n a 是一款针对 E V M 字节码进行安 全审计的工具,利用了 模糊测试技术,同 时支持和 t r u f f l e 集成使用。 项目地址:h t t p s : / / g i t h u b . c o m / c r y t i c / e c h i d n a E t h e r s p l a y E t h e r s p l a y 是用 于 B i n a r y N i n j a 的插 件,可 以用于 分析 E V M 字节 码,并 用图形 化 的方式呈现函数调用流程。 项目地址:h t t p s : / / g i t h u b . c o m / c r y t i c / e t h e r s p l a y 3 . 3 . 2 分 析 工 具 B e o s i n - V a a S B e o s i n - V a a S
展开阅读全文
相关资源
相关搜索
资源标签

copyright@ 2017-2022 报告吧 版权所有
经营许可证编号:宁ICP备17002310号 | 增值电信业务经营许可证编号:宁B2-20200018  | 宁公网安备64010602000642