EIP-1470: 智能合约弱点分类 (SWC)
Authors | Gerhard Wagner (@thec00n) |
---|---|
Created | 2018-09-18 |
Discussion Link | https://github.com/ethereum/EIPs/issues/1469 |
简述
本 EIP 提出了以太坊智能合约中安全弱点的分类方案。
摘要
SWC 是一种智能合约特定的软件弱点分类方案,适用于开发者、工具供应商和安全从业者。SWC 与 通用弱点枚举 - CWE 方案中使用的术语和结构大致对齐,同时覆盖了智能合约特有的大量弱点变体。
SWC 方案的目标如下:
- 提供一种直接的方式来分类智能合约系统中的弱点。
- 提供一种直接的方式来识别导致智能合约系统中漏洞的弱点。
- 定义一种通用语言来描述智能合约系统架构、设计和代码中的弱点。
- 培训并提高智能合约安全分析工具的性能。
动机
在软件安全行业,使用通用术语并使用标准化方案对安全相关的错误和缺陷进行分类是一种广泛接受的做法。虽然这并没有阻止漏洞在软件中出现,但它已经帮助专注于 Web 应用程序、网络协议、IOT 设备和各种其他领域的社区教育用户和开发者,以了解其软件中安全相关问题的性质。它还允许安全社区快速了解生产系统中出现的漏洞,以执行根本原因分析或对来自各种安全分析来源的发现进行分类。近年来,各种组织和公司也发布了漏洞数据,以根据收集到的漏洞数据找出最广泛的安全问题。两个被广泛使用和引用的例子是 SANS TOP 25 Most Dangerous Software Errors 和 OWASP TOP 10。如果没有通用的分类方案,这些出版物都不可能实现。
目前,对于以太坊智能合约特有的弱点,尚不存在这样的弱点分类方案。对安全弱点的通用语言和意识主要来自学术论文、最佳实践指南和已发表的文章。审计报告和安全工具分析的发现增加了用于描述已发现弱点的各种术语。即使对于安全专家来说,理解技术根本原因以及与来自不同来源的发现相关的风险通常也很耗时。
基本原理
在认识到当前差距的同时,SWC 并非旨在重新发明安全弱点分类的轮子。它更倾向于建立在软件安全社区其他部分运作良好的基础上——特别是通用弱点枚举 (CWE),这是一个在采用率和覆盖范围方面表现突出的软件漏洞类型列表。虽然 CWE 没有描述任何智能合约特有的弱点,但它确实描述了更高抽象层的相关弱点。本 EIP 建议创建智能合约特定的变体,同时链接回 CWE 中列出的更大范围的软件错误和缺陷,这些错误和缺陷是不同平台和技术所共有的。
规范
在讨论 SWC 规范之前,重要的是描述所使用的术语:
- 弱点:一个软件错误或缺陷,在正确的条件下,可以单独或与其他弱点结合导致漏洞。
- 漏洞:一个或多个直接或间接导致智能合约系统中不期望状态的弱点。
- 变体:一种以非常低的细节描述的特定于以太坊智能合约的特定弱点。每个变体都分配有一个唯一的 SWC ID。
- 关系:CWE 有一个广泛的 Base 和 Class 类型,它们在更高的抽象层上对弱点进行分组。CWE 使用 Relationships 将 SWC 智能合约弱点变体链接到现有的 Base 或 Class CWE 类型。Relationships 用于提供有关 SWC 如何链接到更广泛的软件安全弱点组的信息,并能够通过问题数据集生成有用的可视化和见解。在其当前版本中,建议将 SWC 链接到其在 CWE 中最接近的父级。
- SWC ID:链接到变体的数字标识符(例如 SWC-101)。
- 测试用例:测试用例构成了微型样本或真实世界的智能合约,它们演示了一个或多个 SWC 变体的具体实例。测试用例是进行有意义的弱点分类的基础,对安全分析工具开发人员很有用。
SWC 的最基本形式是将数字标识符链接到弱点变体。例如,标识符 SWC-101 链接到 Integer Overflow and Underflow 变体。虽然包含弱点标题和唯一 id 的列表本身很有用,但如果没有更多详细信息,它也会有些模糊。因此,SWC 建议向任何弱点变体添加定义和测试用例。
SWC 定义
SWC 定义以 markdown 格式化,以允许良好的可读性并使工具可以轻松处理它们。它由以下属性组成:
- 标题:指向技术根本原因的弱点名称。
- 关系:将 CWE Base 或 Class 类型链接到其 CWE 变体。例如,Integer Overflow and Underflow 变体链接到 CWE-682 - Incorrect Calculation。
- 描述:描述弱点的性质和对合约系统的潜在影响。
- 修复:描述如何修复弱点。
- 参考:链接到包含有关弱点的相关附加信息的外部参考。
测试用例
测试用例包括精心设计的以及真实世界中的易受攻击的智能合约样本。单个测试用例由三个组件组成:
- 智能合约示例的源代码;例如 Solidity、Vyper 等。
- 来自 EVM 编译器的机器可读格式的已编译资产;例如 JSON 或 ethPM。
- 测试结果配置,描述在给定的样本中可以找到哪些弱点变体以及可以找到多少个弱点变体。下面列出了建议的测试用例配置的 YAML 模式。
title: SWC config
type: object
required:
- description
- issues
properties:
description:
type: string
issues:
title: Issues
type: array
items:
title: Issue
type: object
required:
- id
- count
properties:
id:
type: string
count:
type: number
locations:
items:
bytecode_offsets:
type: object
line_numbers:
type: object
实现
位于此 GitHub 仓库 中的智能合约弱点分类注册表使用本 EIP 中提出的 SWC 方案。此处 还提供了 GitHub Pages 渲染的版本。
版权
版权和相关权利通过 CC0 放弃。
Citation
Please cite this document as:
Gerhard Wagner (@thec00n), "EIP-1470: 智能合约弱点分类 (SWC) [DRAFT]," Ethereum Improvement Proposals, no. 1470, September 2018. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-1470.