supply-chain-tools/gitverify
GitHub: supply-chain-tools/gitverify
gitverify 是一个用于验证 Git 仓库签名和完整性的供应链安全工具,通过可配置的信任规则确保代码仓库的可信性。
Stars: 4 | Forks: 0
# gitverify
**这仍然是一个原型,需要清理/更好的测试。**
## 演示:验证此仓库
*在实际使用中,必须先建立对配置文件的信任,然后才能将其用于验证。*
```
curl https://raw.githubusercontent.com/supply-chain-tools/root-of-trust/refs/heads/main/gitverify.json --output gitverify.json
```
验证
```
gitverify --config-file gitverify.json --repository-uri git+https://github.com/supply-chain-tools/gitverify.git
validating...
OK
```
对于 `github.com` 仓库,还可以将配置放置在
```
~/.config/gitverify/github.com/supply-chain-tools/gitverify.json
# 即 ~/config/gitverify///gitverify.json
```
并运行
```
gitverify
```
这将使用 git config 中的第一个 upstream URL 来推断 forge、组织和仓库名称。
推断配置时的默认操作也是存储本地状态(在 [threat-model.md](docs/threat-model.md) 中有描述)。它将被放置在
```
~/.config/gitverify/github.com/supply-chain-tools/gitverify/local.json
# 即 ~/config/gitverify////local.json
```
## 迁移指南
请参阅 [migrate.md](docs/migrate.md)。
## 配置文件
请参阅 [config.md](docs/config.md)。
## 命令行
### 验证特定的 commit、tag 和/或 branch
验证 `commit`、`tag` 和/或 `branch` 是否遵循规则并由 `HEAD` 指向:
```
gitverify --commit 1f46f2053221c040ce5bcba0239bc09214a37658 --tag v0.0.1 --branch main
```
使用此命令时,必须提供 `--commit`,并且同时提供 `--tag` 或 `--branch`。
- `--tag` 验证 tag 以及它是否指向 `commit`。
- `--branch` 验证 `commit` 是否位于 `branch` 上。如果 `branch` 是一个 `protectedBranch`,那么还将验证这些规则。
- 可以添加 `--verify-at-tip` 来验证 `commit` 是否位于 `branch` 的顶端。
- 使用 `--verify-on-head=false` 可以仅验证相关状态,而不验证 `HEAD` 是否指向它。
这仅会验证仓库中相关数据的子集。即,即使存在其他无法通过验证的 `commits`、`tags` 和 `branches`,此检查也可能成功。
## 威胁模型
请参阅 [threat-model.md](docs/threat-model.md)。
## 常见问题 / 故障排除
### 性能问题
我们的目标是使其对于像 Linux 内核这样的大型仓库也能发挥作用,但目前它仅应用于较小的仓库。
### 浅克隆仓库
目前不支持浅克隆仓库。验证递归验证 `SHA-1` 和 `SHA-512` 哈希值需要所有的仓库状态。
### 最多两个父 commit
不支持超过两个父 commit。
### 迁移时:设置了 `after` 但验证失败
您可能有额外的 commits 需要清理或添加到 `after` 列表中。要获取未被其他 commits 指向的所有 commits 的列表,请运行
```
gitverify after-candidates
```
将此列表添加到 `after` 中,或者删除 tags/branches 并在仓库中运行垃圾回收。
### 迁移时:设置了 `requireSignedTags: false` 但 tag 验证失败
`gitverify` 被设计为严格的,即使没有签名,它仍然会验证 annotated tags 的完整性。
要获取现有 tags 的列表,请运行
```
gitverify exempt-tags
```
可以将它们作为 `exemptTags` 添加到配置中。
### 从仓库中不正确的状态恢复
主要的恢复方法是手动验证状态是否安全,并更新 `after` 以忽略错误的 commits。对于 tags,可以将其删除或添加到 `exemptTags` 中。
如果 commits 或 tags 被删除,并且使用了 `local state`,则可能需要对其进行修补或重新创建。目前没有任何用于此操作的便捷工具。
### Git stash 问题
**注意:这会删除状态,请谨慎使用!**
Git stash 会创建未签名的本地 commits,并且无法通过检查。
可以按如下方式删除 stashes(**注意!只有在您愿意丢失 stashes 中的数据时才运行此命令**)
```
git stash clear # Remove all stashes
```
移除悬空的 commits
```
git gc --prune=now
```
### 移除本地未签名/错误的 commits
**注意:这会删除状态,请谨慎使用!**
如果不小心引入了不应该存在的 commits(即未签名或使用了错误的密钥签名),且尚未被 push,则可以将它们移除。
确保不再有任何 branch 指向该 commit,例如使用 `reset --hard` 或 `push --force`
使所有悬空的对象过期
```
git reflog expire --expire-unreachable=now --all
```
运行 gc
```
git gc --prune=now
```
### Tags 未指向 commits
目前不支持。
标签:EVTX分析, Git签名验证, 文档结构分析, 网络安全研究