nickharris808/cert-atlas
GitHub: nickharris808/cert-atlas
一个由标注的伪造证书组成的语料库与双侧评估指标,用于衡量证书验证器对伪造品的检测能力。
Stars: 0 | Forks: 0
# cert-atlas
[](https://github.com/nickharris808/cert-atlas/actions/workflows/ci.yml)




**这是一个由看似有效实则无效的证书组成的语料库——也是一个“拒绝一切”的验证器也无法胜出的评估指标。**
验证器几乎总是在测试它们应当接受的人工产物上进行的。真正重要的是它们*拒绝*了什么,而此前一直没有公开的近似伪造语料库可供测试。因此,健全性通常只是验证器作者自己的一面之词。这个语料库将其变成了一个具体的数字。
## 安装
```
pip install cert-atlas
```
## 30秒快速入门
```
cert-atlas build atlas
cert-atlas baseline atlas
```
```
atlas 1.0.0 (27 cases)
detection 0.955 (invalid artifacts correctly rejected)
precision 1.000 (valid artifacts correctly accepted)
ATLAS SCORE 0.955 = min(detection, precision)
sound: NO
MISSED (forgeries that got through):
- cert.self_consistent_forgery
```
那个 **0.955 就是真实的分数**,未达标是刻意为之。`cert-atlas baseline` 评估的是*仅限产物*(artifact-only)的赛道:没有带外指纹(out-of-band fingerprint),因此对于物理输入和记录的判定被同时篡改的伪造品,任何人都无法将其与真实证书区分开来。如果对锚定赛道(anchored track)进行评分,就能发现这种伪造:
```
cert-atlas baseline atlas --anchored
```
```
detection 1.000
precision 1.000
ATLAS SCORE 1.000
sound: YES
```
现在来测试*你的*验证器——任何命令、任何语言:
```
cert-atlas score atlas my-verifier --check '{path}'
```
退出代码 0 代表满分。任何其他代码都会准确打印出哪些伪造品通过了验证。
## 评估指标
```
detection = invalid artifacts correctly REJECTED / all invalid
precision = valid artifacts correctly ACCEPTED / all valid
atlas_score = min(detection, precision)
```
基于**最小值**进行排名是整个设计的核心。考虑以下两种作弊方式:
| 验证器 | detection | precision | **score** |
|---|---|---|---|
| 参考(Reference) | 1.000 | 1.000 | **1.000** |
| 接受一切 | 0.000 | 1.000 | **0.000** |
| 拒绝一切 | 1.000 | 0.000 | **0.000** |
| 一切崩溃 | 1.000 | 0.000 | **0.000** |
这两种退化策略都被作为对照组内置在程序中,并在测试套件中被断言得分为零。崩溃被视为一种拒绝,因此故意崩溃也不是一种可行的策略。
健全性的声明要求 **detection = 1.000**。只要低于这个数字,就意味着这个 atlas 中的某个伪造品逃过了你的检查,并且报告会指出是哪一个。
## 包含内容
共 27 个测试用例,其中 22 个是伪造品,分为三个系列:
| 系列 | 有效 | 无效 | 证明内容 |
|---|---|---|---|
| `certificate` | 1 | 11 | 关于每个基因位点(per-locus)物理边界的制造准入判定 |
| `receipt` | 2 | 8 | 通过 DRAT 反驳实现两个电路的逻辑等价性 |
| `seal` | 2 | 3 | 验收标准在测量前已固定 |
有三个值得特别指出:
- **`receipt.swapped_cnf`** —— 证明确实反驳了所提出的公式。只是这个公式并不是对应于电路的那个公式。要发现这一点,不仅需要提交*编码器身份*(encoder identity),还需要提交证明本身。大多数等价性工具都做不到这一点。
- **`cert.vacuous`** —— 每个证书都被删除了;但数据包依然保持完美的格式,因此纯粹的格式检查会报告成功。这个案例之所以存在,是因为它是我们在攻击自己的验证器时发现的,而我们的验证器当时存在这个 bug。
- **`seal.repointed_bound_seal`** —— 标准被篡改了,*并且*生成了匹配的 seal,因此规范和 seal 之间完美契合。只有将两者绑定在一起才能发现伪造。
`cert-atlas defects` 会打印出完整的分类体系,并且对于每个条目,都会说明为什么这个伪造品看起来是有效的,以及应该由哪项检查来发现它。
## 提交贡献
有两种类型的贡献,其中第二种更有价值:
1. **验证器提交。** 运行 `cert-atlas score` 并打开一个 PR 来添加你的结果。请包含 atlas 摘要(digest)——只有在摘要相同的情况下,结果才具有可比性。
2. **新的缺陷类别。** 如果你能构造出一个参考验证器会接受的伪造品,这就是你能发送给我们的最有价值的东西。它将变成一个新的测试用例,同时参考验证器也会被修复。这个 atlas 的设计初衷就是让其作者感到尴尬。
## 可重复性
该 atlas 是**逐字节可复现**的:固定的版本会在每个用例文件上生成固定的内容摘要,该摘要记录在 `index.json` 中并由测试套件断言。没有任何东西是随机的。不同摘要下的结果不具备可比性,并且评分器会在每次运行时报告该摘要。
## 诚实的局限性
- 手工设计,**并不详尽**。得到 1.000 的分数意味着仅*针对这 22 个伪造品*是健全的——这只是健全性的下限,永远不能作为证明。
- 用例故意设计得很小;它们测试的是决策逻辑,而不是规模。
- 这些伪造品与参考验证器是同一批人编写的。这确实存在偏见,这也是为什么上面提到的贡献 #2 比贡献 #1 更重要的原因。
## 这不衡量什么
该 atlas 评估的是验证器能否捕获伪造品。它毫不涉及底层证书在*物理上是否有意义*——即制造证书中的数字是否真正描述了你的掩膜。这需要对物理模型建立可靠的封闭环境(enclosures),这是一个独立的商业产品,不包含在这些包中。在这里获得 1.000 分的验证器在算术和完整性方面是值得信赖的,这是必要条件,但不是充分条件。
## 许可证
Apache-2.0。
## 诚实的范围——这证明了什么,又没有证明什么
| 问题 | 回答 |
|---|---|
| 验证器能否捕获这 22 个特定的伪造品? | **是的,已测量** —— 针对每个缺陷,而不是仅仅汇总。 |
| 获得 1.000 分的验证器是*健全的*吗? | **不是。** 它只是针对这 22 个伪造品是健全的。那是一个下限,永远不能作为证明。 |
| 证书中的数字在物理上有意义吗? | **从不检查。** Atlas 评估的是验证器,而不是物理。 |
| 这个语料库是详尽的吗? | **不是。** 它是手工设计的,并且由与参考验证器相同的作者编写——这是一个真实的偏见,也是为什么外部贡献的伪造品对我们来说比一个及格的分数更有价值的原因。 |
仅限产物的赛道得分是 **0.955**,而不是 1.000,这个失误是故意的:没有任何检查器能够仅从产物中发现一个自洽的伪造品。
## 工具包的其余部分
一个理念,六个组件:**已记录的判定是一个需要被检查的声明,绝不是可以被信任的输入。**
| | |
|---|---|
| [**lcert-verify**](https://github.com/nickharris808/lcert-verify) | 重新推导制造证书的判定。仅使用标准库。 |
| [**equiv-receipt**](https://github.com/nickharris808/equiv-receipt) | 证明两个电路等价,并提供任何人都可以重新检查的回执。 |
| [**prereg-seal**](https://github.com/nickharris808/prereg-seal) | 在测量前封装验收标准。 |
| [**cert-atlas**](https://github.com/nickharris808/cert-atlas) | 22 个标记过的伪造品和一个退化验证器无法胜出的指标。 |
| [**certified-mcp**](https://github.com/nickharris808/certified-mcp) | 将以上工具打包为你的 AI agent 可以调用的工具。 |
| [**lcert-verify-web**](https://github.com/nickharris808/lcert-verify-web) | 浏览器中的验证器。无需上传任何数据。 |
**立即体验,无需安装:** [🔏 验证器空间](https://huggingface.co/spaces/nickh007/cert-verifier) ·
**浏览伪造品:** [📊 atlas 数据集](https://huggingface.co/datasets/nickh007/cert-atlas)
### 免费版的界限
这里的所有东西都只用于**检查**。它们都不负责**生产**具有物理意义的证书——
那需要对真实的工艺模型建立可靠的封闭环境,这是一个独立的商业产品。如果你需要的是证书本身,而不是检查证书的方法,那这就是我们需要讨论的话题了。
标签:Python, 无后门, 测试评估工具, 证书验证, 逆向工具