Dvalin 是一个独立安全验证运行时,位于代码生成与合并之间,服务于人类、编码智能体和 CI。它不询问编写修复的模型“修复是否有效”,而是自行重新扫描、运行项目自己的测试,并读取它启动的进程退出码,最终生成 Verified Fix Record(已验证修复记录)——一个小型 JSON 文件,任何人都可以在无网络、无 Dvalin 状态的笔记本上离线重新推导验证。
主要能力
- 安全扫描:内置规则覆盖注入、硬编码密钥、XSS、eval 和不安全 shell 使用。默认策略仅运行 Dvalin Built-in,首次扫描无需配置即可工作。可按需显式添加引擎,如 Snyk Code(SAST)和 Snyk OSS(依赖)。
- 自动修复循环:--until-clean 将单次修复尝试变为有界循环。执行器编辑代码,Dvalin 用相同引擎重新扫描并自行运行项目检查,仅将仍然存在的问题(目标仍存在、新引入的发现、失败检查的末几行输出、添加的抑制)发回执行器,让其继续修复。依赖类发现优先处理。
- 独立验证:dvalin verify、MCP 的 dvalin_verify_findings 工具、单轮 --fix --verify 以及 CI reverify 均采用同一判断逻辑,生成 dvalin-fix-record/v3 记录。该记录会记录扫描实际覆盖了哪些内容,如果修复只是隐藏了发现(如删除易受攻击文件、删除测试或断言)则判定失败。
- 防规避检查:拒绝智能体常见的“让扫描器安静”手段,如将漏洞点移至同类兄弟 API(eval → new Function,exec → spawn with shell: true)、删除易受攻击文件、删除测试或断言。对于代码发现,循环会先要求提供仅含测试的复现用例,并在未修复代码上必须失败(断言失败,而非缺少运行器)。
- 基于当前主干的合并准备:--rebase-onto 在开始前和每轮之后将修复变基到上游,然后在那里判断。冲突仅将冲突文件交给执行器,并告知“不要运行 git”,Dvalin 自行继续变基。
- CI 与拉取请求:提供示例工作流 docs/examples/dvalin-fix-loop.yml,可在 PR 上重新执行记录(reverify: true),重新扫描 base 与 head、重新运行检查、在修复被还原时必须失败、恢复后必须通过,然后用 CI 密钥签名。
- 无需安装的 PR 检查:发现会以内联注释出现在 PR diff 和 Security 标签中,无需 API 密钥或模型,扫描确定性且本地运行。diff: true 仅报告 PR 更改的行,使门禁能阻止本次更改新增的问题。
- 签名与信任:使用 signing-key 后,新记录会用 Ed25519 签名(基于其哈希)。密钥在项目检查运行前被移出环境,代码无法读取。未签名或仅由未指定密钥签名的记录在 --trusted-key 下失败。
- MCP 服务器:任何支持 MCP 的智能体均可调用。dvalin_scan 接受 diff: "uncommitted",仅报告智能体刚写的内容。dvalin_begin_verification 记录本地工作流,dvalin_get_finding 按指纹检索发现,dvalin_verify_findings 请求独立重新扫描并返回 Verified Fix Record。dvalin_verify_fix 可离线重新推导记录。
使用方式
- 30 秒免安装试运行:对当前目录运行内置规则,打印发现。无需账户、模型、配置,代码不离开本机。
- 配置策略:在 dvalin.security.json 中命名引擎、设置门禁和抑制规则,可与仓库一起提交。抑制需要理由,可指定负责人和过期日期。
- 安装与集成:仓库提供 GitHub Action 示例、MCP 配置命令(自动适配 VS Code 的 servers 与 Cursor 的 mcpServers),以及一个同时包含 Codex/Claude 双原生清单的插件载荷和共享安全门禁技能。
适用场景
- 人类或 AI 智能体编写代码后,需要独立安全验证再合并。
- CI 中增量“无新增高风险发现”门禁。
- 让编码智能体在写完后自行请求独立判定,但不信任编写者。
- 需要离线可复核的修复证明,供发布任务、其他仓库或审计方使用。
限制
- 记录只声明:这些发现已消失,这些检查被观察到通过。它不声称代码安全,Dvalin 也不允许被如此解读。
- 重新推导只能证明记录自洽,无法证明记录由实际运行者签发;需在运行器上重新执行并签名来弥补。
- 未覆盖的细节(如具体定价、平台支持范围、性能指标)暂未提供。
- 许可为 MIT。