Valisthea/covenant-security-reviews
GitHub: Valisthea/covenant-security-reviews
Covenant 智能合约语言编译器的内部对抗性安全审查存档,记录了 Kairos Lab 自行执行的多轮审查发现与修复状态,并明确声明其非第三方独立审计的性质。
Stars: 0 | Forks: 0
# Covenant 安全审查存档
## 在阅读其他内容之前请先阅读本文
**这些是自我审查,不是第三方审计。** Kairos Lab 编写了 Covenant
编译器,并且 Kairos Lab 执行了本存档中的每一项审查。审查者和被审计代码的作者是
同一方。这里的内容不具备外部委托项目的独立性:没有对抗性的合同关系,没有外部的
签字批准,如果遗漏了缺陷,也没有任何人会承担信誉风险。
**没有独立的机构审计过 Covenant。** 由独立安全公司进行的外部审计是 V1.0 的先决条
件,而这尚未发生。编译器代码库在其自己的 README 和
[SECURITY.md](https://github.com/Valisthea/covenant-language/blob/main/SECURITY.md) 中说明了同样的事情:
故意不使用“已审计”这个绝对的词。
**本存档中的 PASS 结论仅代表一件事**:审查者无法再复现其自身发现的
缺陷。它不是认证,不是正确性的保证,也不是具备生产环境就绪状态的证据。Covenant 仅限
于测试网,其加密原语是没有任何安全性的确定性 mock(模拟),并且在编译时会拒绝主网
目标。请参阅编译器的
[STATUS.md](https://github.com/Valisthea/covenant-language/blob/main/STATUS.md) 以获取项目自身的
诚恳免责声明。
**没有发现结果不代表没有漏洞。** 本存档中后续的审查周期不断发现早期周期遗漏的
缺陷,包括在早期周期已声明为安全的代码中。
## OMEGA 是什么
OMEGA 是 Kairos Lab 的内部对抗性审查引擎。它是在操作员监督下运行的自动化工具,而不是
个人,也不是外部公司。在此处存档的各周期中,它采取了多种形式:分阶段手动审查 (V4)、
发布门禁检查 (V5)、跨越独立审查通道的广度扫描以及独立的反驳阶段 (V6),以及一个对抗
性漏洞赏金测试工具,该工具将无约束的发现模块与充满敌意、默认拒绝的筛选模块分离开来
(2026-07-23)。
有两条规则是恒定不变的,也是值得评判的部分:
- **经验性复现。** 候选漏洞只有在针对真实编译后的二进制文件复现后才会被报告。阅读
源代码不能作为编译器缺陷的证据;生成的 bytecode 才是。
- **独立反驳。** 每一个存活的候选漏洞都会被交给一个阶段,该阶段的
指令就是摧毁它。最终存活下来的才会被报告。
各周期的评估方法文档位于 [`methodology/`](methodology/) 中,并且每个
周期自己的范围文档都记录了该周期实际执行的操作。
## 审查周期
| 日期 | 审查 | 编译器版本 | 实际执行内容 | 发现结果 | 结果 |
|---|---|---|---|---|---|
| 2026-04-22 | OMEGA V4 | v0.6,在 `v0.6.1-rc3` (`9a39a70`) 处审计 | 阶段 1 到 5,包括修复后的重新审计 | 提出 41 项:40 项已评级(5 项 Critical,11 项 High,9 项 Medium,6 项 Low,9 项 Info)+ 1 项撤回 | 作为 `v0.6.1-rc4` 发布。在这 41 项中:34 项修复已验证,5 项因被审计的代码已被删除或重写而作为 N/A 关闭,1 项已重构,1 项 (`KSR-CVN-002`) 在阶段 2 反驳后作为误报撤回。[文件夹](audits/2026-04-22-omega-v4-covenant-v0.6/) |
| 2026-04-25 | OMEGA V4 | v0.8.2 (rc3) | 仅阶段 1 和阶段 2 的第一轮。阶段 3 和阶段 5 从未运行 | 9 项初步结果,无最终严重性评级 | **未发布结论。** 尽管如此,9 项中的 7 项在当天的两次修复会议中被修复;2 项 Info 项目从未被重新筛选。请参阅下方的说明。[文件夹](audits/2026-04-25-omega-v4-covenant-v0.8/) |
| 2026-04-27 | OMEGA V5 门禁检查 | v0.9.0 | 发布门禁检查,而非漏洞搜寻 | 1 项 Low | 未在此处存档。该报告位于编译器代码库中,文件名为 [`OMEGA_V5_AUDIT_REPORT.md`](https://github.com/Valisthea/covenant-language/blob/main/OMEGA_V5_AUDIT_REPORT.md) |
| 2026-06-09 | 临时广泛对抗性扫描 | v0.9.2 | 广泛扫描,集中于 stdlib 合成的 ERC 风格结构 | 5 项(1 项 Critical,4 项 High) | 全部 5 项已在 v0.9.2 中修复并发布。从未作为带有日期的文件夹在此处存档;发现结果作为数据行位于 [`findings-database/`](findings-database/) 中 |
| 2026-07-05 | OMEGA V6 | v0.9.2(代码库 HEAD,`0bd195e`) | 10 维度广度扫描,每个候选漏洞均针对编译后的二进制文件进行复现,随后进行独立反驳阶段 | 18 项(6 项 Critical,6 项 High,5 项 Medium,加上一批捆绑的 Low/Info) | 17 项具名发现结果已在 v0.9.3 中修复并发布,并在 v0.9.5 中重新验证。**有两项未完全关闭:CRT-005(辅助合约层仍处于开启状态)和 CRT-007(通过拒绝编译该结构来修复)。** Low/Info 批次在该阶段未进行修复。[文件夹](audits/2026-07-05-omega-v6-covenant-v0.9.2/) |
| [2026-07-24](audits/2026-07-24-omega-v3.6-covenant-v0.9.6/00-executive-summary.md) | v0.9.6 | 14 Critical, 12 High, 12 Medium, 4 Low, 1 Info | **未修复即发布。** 针对受审计版本存在 43 项发现结果;未应用任何修复。 |
| 2026-07-23 | OMEGA 对抗性漏洞赏金 | v0.9.4 (`ac06e7b`) | 双模块工具:无约束生成器,随后是充满敌意的默认拒绝筛选,每个发现均在链上编译并执行 | 9 项(1 项 Critical,2 项 High,4 项 Medium,2 项 Low) | 全部 9 项已在 v0.9.5 (`2f89488`) 中修复并发布。九项中有四项是通过拒绝编译该结构而不是通过实现它来修复的。[文件夹](audits/2026-07-23-omega-bounty-covenant-v0.9.4/) |
六个周期,四个已存档的文件夹。2026-04-27 的门禁检查和 2026-06-09 的扫描
从未作为周期文件夹在此处记录;它们已在上方列出,并在
[`findings-database/`](findings-database/) 中建立了索引,因此总数绝不会无声无息地减少。
### 仍然悬而未决的内容
本存档中所有的修复状态都是针对编译器 **v0.9.5** 声明的,这是
公开发布的版本。在发布前,每个 Critical 和 High 级别的发现都重新比对了该
源代码。有三件事处于开启状态,在此列出它们,而不是留给读者去寻找:
1. **`CRT-005` (Critical) 仅部分关闭。** 它指控了三个层。编译器和
合成合约层已修复并验证。已部署的
Solidity 辅助工具 `CeremonyHelper.sol` 从未更改,因此所描述的攻击
针对它仍然有效,前提是调用者拥有该 ceremony session。这是本存档中
唯一一个已发布的攻击配方对已发布的
代码仍然有效的发现结果。它的
复现方法仍然发布了,并且该文件根据源代码论证了为什么这是安全的:
该辅助工具是公开的 Apache-2.0 代码,在 Etherscan 上已验证,仅部署在
Sepolia 上,并且对于第三方的 session 是无法触达的。
[发现结果](audits/2026-07-05-omega-v6-covenant-v0.9.2/02-findings/CRT-005-ceremony-zero-auth-zero-threshold.md)
2. **`CRT-007` (Critical) 是通过拒绝编译来修复的,而不是通过实现。** ERC-8231
`registry` 结构现在根本无法编译。动态 bytes 的根本原因
在编译器自己的 `DEBT.md` 中仍然处于开启状态。几项 2026-07-23 的发现结果
形式相同:该结构被拒绝编译,而不是被使其正常工作。
3. **本存档未声称已关闭的编译器项目**,已与
编译器的 `DEBT.md` 进行交叉核对,并在 v0.9.5 源代码中重新阅读:两个绕过 E520 故障报警门禁的硬编码 precompile
选择器;动态 `bytes`/`string`/`T[]`
存储和 ABI 差距;以及辅助工具的主网门禁漏洞,其中 mock 加密的
辅助工具仅拒绝 Ethereum 主网,而 `CeremonyHelper` 根本没有任何链门禁。
完整列表位于
[`findings-database/status-tracker.md`](findings-database/status-tracker.md)。
对于本存档中的每一项“已修复”,都有两个限制适用。修复是在编译时进行的,因此
从旧版本部署的合约将永久保留其修复前的 bytecode。
并且这里没有任何东西是在有价值处于风险的情况下部署的:加密
原语是 mock 的,并且编译器自己的 `STATUS.md` 声称它们提供零
机密性和零加密安全性。
此表显示的最有用的内容不是修复率。而是 2026-07-05
周期发现了 6 个 Critical 和 6 个 High 缺陷,而之前的四个周期
遗漏了这些缺陷,其中两个破坏了该语言中最普通的控制流,其中一个
可以用项目自己发布的示例装置来证明。该周期明确指出,
前一个周期关于“V0.9.2,全部安全,GO”的叙述是不成立的。那些不断
在已审查过的代码中发现 Critical 级别问题的审查,就是关于自我审查
价值几何的诚实信号。
### v0.8 周期未发布结论
针对 v0.8.2 的 2026-04-25 周期在阶段 2 的第一轮后停止。阶段 3
(对抗性测试)和阶段 5(重新审计)从未运行,未编写任何总结,并且没有后来的周期重新接手它。它的 9 项发现结果在具有关键意义的层面是**初步的**:它们从未被筛选出最终的严重性评级,并且该周期从未
重新审计过其自身的修复。
然而,它们并没有被搁置不予修复,而且该存档的早期版本另有说法。两次修复
会议确实在同一天举行,并已存档在该文件夹中;九项发现中的七项
在那里得到了修复,并且四个编译器端的修复在 v0.9.5 源代码中针对本次
发布进行了重新阅读,并且仍然有效。剩下的
两个(`PRELIM-008` 和 `PRELIM-009`,均为 Info,UI 和文档)从未被重新筛选。不完整的
**审计**和未修复的**发现结果**是不同的主张;该存档
以前将它们混为一谈,其方向使得记录看起来比
实际情况更糟。
它被保留在存档中,因为停止的审查也是记录的一部分。它不能作为 v0.8 是安全的证据,也不能作为 v0.8 已损坏的证据。除了
审查停止了这一事实之外,它什么也不能证明。
## 严重性等级
严重性结合了影响(如果被利用会发生什么)和可能性(它的可达性
有多大)。完整的矩阵和示例位于
[`methodology/severity-classification.md`](methodology/severity-classification.md)。
| 级别 | 含义 | 响应 |
|---|---|---|
| **Critical** | 资金损失、未经授权的特权操作、不可逆的状态损坏,或被破坏的加密不变性,且可由无特权参与者触发 | 阻止发布 |
| **High** | 严重但非灾难性:资金面临风险、敏感信息泄露,或多用户拒绝服务,在不常见但合理的条件下可触发 | 在当前版本或紧接着的下一个补丁中修复 |
| **Medium** | 有限的损失或泄露,部分用户受到影响,或安全态势下降,仅在特定条件下可触发 | 在下一个次要版本中修复,或附带书面说明推迟 |
| **Low** | 影响较小,或需要不切实际的访问权限 | 已记录,非发布阻碍 |
| **Info** | 观察、规范或文档。无可利用的影响 | 为求完整而记录 |
阅读本存档时有两项评级规则很重要:
- **编译器缺陷会被上调评级。** 编译器 bug 是一种力量倍增器:它会影响
编译器生成的每一个合约,而不是单一合约。
- **隐私流违规至少为 High**,无论是否展示了
可利用性,因为它们破坏了该语言的核心主张。
由于目标仅限于测试网,没有任何价值风险,因此严重性是根据
被破坏的保证(授权、价值、机密性、合规性、可用性)而不是根据
损失的金钱来评级的。涉险资金进行评级会将每一项发现结果压低至零,从而违背了
此练习的目的。
## 如何阅读发现结果文件
发现结果文件位于每个周期的 `02-findings/` 文件夹中(2026-07-23 周期使用
单一的扁平化 `02-findings.md`)。文件名前缀代表严重性:`CRT`、`HGH`、`MED`、
`LOW`、`INF`。
每个文件都以 **Metadata** 块开头:
- **Finding ID** 和 **Severity**,以及 **Category** 和 **Attack surface**(系统的哪个
部分:编译器、stdlib、工具链、生成的合约)
- **Discovered**:何时、在哪个阶段或审查通道中发现,以及独立通道是否
趋同于此
- **Affects**:编译器中确切的 `crate/file.rs:line` 位置
- **Status**:该发现目前的进展,以及其修复参考(如果有的话)
然后是正文:**Summary**、带有文件和
行号引用的 **Evidence** 或 **Vulnerability detail**、构建的 **Proof of Concept**、**Impact**、
**Severity rationale**、**Remediation**,以及记录了谁提出、
验证或反驳了它的 **Audit trail**。
如果某个周期产生了独立的复现工件,它们会位于该周期的
对抗性测试文件夹中:`.cov` 源代码、IR dump 和原始 bytecode,以便读者
可以重新编译并进行比较,而不是盲目相信书面报告。其他周期
将复现代码直接内嵌在发现结果中。
两条阅读注意事项:
- 早期发现文件中的 `Public-safe` 字段是早期
部分披露模型的遗留物。该模型已退役:本存档进行完全公开。
- 跨周期索引是 [`findings-database/`](findings-database/),其中
`all-findings.csv` 是可查询的表格,`status-tracker.md` 是叙述性日志,
而 `metrics.md` 是趋势视图。
## 披露模型
修复后完全披露,包括 Proof of concept。复现代码、IR dump 和
bytecode 随发现结果一并提供。
这是说得通的,因为目标本身就是这样的:Covenant 仅限
于测试网,加密原语是 mock 的,编译器拒绝主网目标,并且
本存档中引用的部署是在 Ethereum Sepolia 和本地的 anvil 实例上,没有任何
价值风险。被隐瞒的 Proof of concept 会让读者丧失
检查工作的能力,并且不会给任何人带来任何安全性。
有一点后果应当明确说明:修复是在编译时进行的。从
旧版本部署的合约将永久保留其修复前的 bytecode。重新编译和
重新部署才是应用修复的方法。
## 编译器的位置以及验证修复
- **编译器**:[github.com/Valisthea/covenant-language](https://github.com/Valisthea/covenant-language)。
针对编译器、CLI、LSP 和辅助合约使用 Apache-2.0 协议;针对语言
规范和示例合约使用 CC0-1.0 协议。
- **网站和文档**:[covenant-lang.org](https://covenant-lang.org)。
`Valisthea/covenant-lang` 代码库是文档站点,而不是编译器。
本存档中引用的修复位于公开发布的编译器中。
当前的公开版本是 **v0.9.5**(标签 `v0.9.5`,提交 `2f89488`),它包含了
此处描述的每一项修复,包括 2026-07-23 周期的修复。
关于可重现性的一个诚实限制。公开代码库的历史始于
v0.9.4 公开发布的提交 `ac06e7b`。早期周期引用的每个提交哈希,
包括被审计的目标提交和修复提交(`bf89e8c`、`d5cbcd3`、`f285368`、
`a2207b4`、`9a39a70`、`0bd195e` 等),都属于发布前的历史,并且
**在公开代码库中无法解析**。对于这些周期,请针对
已发布的代码进行验证,而不是针对提交链接:每个修复描述都指明了 crate、
文件和行为,并且大多数都指明了在公开代码树中提供的一个回归测试。
## 代码库布局
```
covenant-audits/
├── README.md This file
├── SECURITY.md How to report a vulnerability
├── LICENSE CC BY 4.0 for the reports, see the file for the rest
│
├── audits/ One folder per review cycle
│ ├── 2026-04-22-omega-v4-covenant-v0.6/
│ ├── 2026-04-25-omega-v4-covenant-v0.8/ stopped after phase 2, no verdict
│ ├── 2026-07-05-omega-v6-covenant-v0.9.2/
│ └── 2026-07-23-omega-bounty-covenant-v0.9.4/
│
├── findings-database/ Cross-cycle index
│ ├── all-findings.csv Queryable table of every finding
│ ├── status-tracker.md Narrative log, per cycle and per finding
│ └── metrics.md Trends across cycles
│
├── methodology/ How the reviews are run
│ ├── OMEGA-v4-methodology.md
│ ├── severity-classification.md
│ ├── attack-surfaces.md
│ └── remediation-workflow.md
│
└── tools/ Internal helpers
├── finding-template.md The reporting standard every finding follows
├── report-generator.sh
└── severity-scorer.sh
```
周期文件夹并不统一,它们也不是必须要统一的:每个文件夹都包含该
周期实际产生的内容。2026-04-22 文件夹是最完整的(范围、阶段
报告、按文件划分的发现结果、复现代码、修复会议)。2026-07-23 文件夹
是一份执行摘要和一份单一的发现结果文档。如果某个周期没有为
某个阶段生成文档,那么就不会有文档。
该存档以前带有一个 `public/` 目录,其中保存了 2026-04-22 周期的一份部分的、已经过时的
副本,这是在旧的部分披露模型下生成的。它已被
删除。现在整个存档都是公开的,因此第二个副本只会与原件失去
同步,并让读者猜测哪一个才是权威的。
[`audits/`](audits/) 是唯一规范的目录树。
## 报告漏洞
发送邮件至 `admin@kairos-lab.org`。请不要为安全缺陷开启公开的 issue。包含范围、响应时间表和披露窗口的规范策略位于
编译器代码库的
[SECURITY.md](https://github.com/Valisthea/covenant-language/blob/main/SECURITY.md) 中。
有关简短版本,请参阅本代码库中的 [`SECURITY.md`](SECURITY.md),包括如何
报告本存档本身的错误。
## 许可证
报告、方法和发现文档均基于
[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) 发布:引用它们、镜像它们、
摘录它们、公开质疑它们,只需注明出处。在发现结果中引用的编译器代码
保留其原始源许可证。完整条款请参见 [LICENSE](LICENSE)。
标签:云安全监控, 区块链安全, 安全审查, 智能合约, 通知系统, 防御加固, 静态分析