ayaanmaliksgithub/virgil
GitHub: ayaanmaliksgithub/virgil
Virgil 将安全扫描结果通过聚类、可达性分析和 LLM 排序转化为可操作的修复优先级队列,解决传统扫描器只罗列发现而不帮分类的问题。
Stars: 0 | Forks: 0
# virgil
```
$ virgil scan .
bundle /work/myrepo → zip → submit
┌─ [ virgil ] ────────────────────────────────────────────────────────────────┐
│ audit_id c9b1… │
│ source scan.zip │
│ state succeeded phase=completed │
└────────────────────────────────────────────────────────────────────────────┘
CRIT HIGH MED LOW INFO KEV unreach
2 7 14 6 3 1 19
╭─ [ fix.this_week() · ranked ] ─────────────────────────────────────────────╮
│ // these are the clusters the auditor ranked for this week │
│ │
│ #01 [ CRIT ] Hard-coded AWS access key in source ×3 │
│ Critical credential exposure with CISA-KEV-adjacent risk profile… │
│ │
│ #02 [ HIGH ] SQL injection via raw query helper ×12 │
│ 12 callsites share src/db/query.py — fix the helper, not callsites. │
│ … │
╰────────────────────────────────────────────────────────────────────────────╯
```
## 为什么需要另一个安全扫描器
有很多工具会直接丢给你 200 条发现结果然后转身就走。这个项目
押注真正的问题不在于*发现*问题 ——
Semgrep、Trivy、Gitleaks、CodeQL 已经很擅长这个了 —— 而在于通过输出
**赢得你的关注**。因此,这里的重点是扫描器
吐出 JSON 之后的所有事情:
- **聚类,而非罗列。** 分布在 12 个调用点的 47 个 SQL 注入发现结果
会折叠成一个聚类 —— 直接指向共享的 helper,而不是你必须滚动的 47
行记录。
- **可达性优先。** 你并未实际导入的包中的依赖项 CVE
会降低一个严重级别并默认隐藏。支持五种语言家族
(Python、JS/TS、Go、Ruby、Java/Kotlin)。
- **“本周修复”队列。** 排名前 K 的聚类会由审计器进行排序,
并为每个项目提供一行理由。无论是否有
LLM 介入均可工作 —— 我们提供了一个确定性的降级方案。
- **基于代码的聊天。** 每条发现结果都附带了一份经过脱敏处理的 30 行
代码切片。聊天检索器会使用它,这样
审计器就可以说“第 42 行的输入在前面两行已经参数化了”,
而不是泛泛而谈。
- **审计,而非利用。** 每个 LLM 输出都会经过安全
验证器,该验证器会拒绝 payload、diff 和详细的利用步骤。原始
密钥在被存储、渲染或发送到
模型之前就会被清除。
- **取证反汇编器风格的 UI。** 没有花哨的光球。表格数字、十六进制
侧边栏、终端氛围。如果你平时习惯使用 JetBrains Mono 阅读
代码,这会让你感到宾至如归。
## 开始使用
Virgil 是一个位于 的托管服务。每个账户都有
3 次免费审计机会 —— 登录,粘贴一个 GitHub URL(或上传一个 zip 压缩包),
几分钟后即可阅读排序后的分类结果。
**关于自托管:** 此仓库是托管服务的真正源码
(Apache-2.0 —— 阅读它、审计它,这就是开源的意义),你看到的
compose 文件就是生产环境的实际运行方式。但自托管并非受支持的
官方途径:账户、积分和 CLI 登录都与托管
服务绑定,且没有匿名模式。如果你 fork 它并成功运行,
这正是许可证按预期发挥作用的体现 —— 只是你脱离了官方维护的平坦大道。
在终端中运行:
```
pipx install virgilhq # binary on $PATH is `virgil`
virgil login # device-code flow, one time
virgil scan . # current dir
virgil scan github.com/OWASP/NodeGoat # bare host
virgil scan OWASP/NodeGoat # GitHub shorthand
virgil clusters # ranked, severity-grouped
virgil chat # streamed Q&A, grounded in this audit
virgil report --format sarif -o findings.sarif
```
退出代码符合 CI 的需求:
```
virgil scan . --fail-on critical # exits 1 if any Critical lands
```
## 在你的编辑器 (VS Code) 中阅读发现结果
位于 [apps/vscode/](apps/vscode/) 的 VS Code 扩展可在编辑器内部驱动 `virgil`
CLI。从命令面板运行扫描,
即可将发现结果作为原生的 VS Code 诊断信息呈现 —— 违规行上的波浪线、
“问题”面板中的汇总,以及可点击跳转至浏览器审计的
状态栏计数
(`virgil: 2C 7H 12M · c9b1d8a3`)。
目前尚未上架 Marketplace (v0.2)。现阶段操作方式:
```
cd apps/vscode
npm install && npm run compile
# 然后使用 `vsce` CLI 运行 `code --install-extension .`,
# 或者在 VS Code 中打开文件夹并运行 "Extensions: Install from VSIX…"
```
安装完成后,运行 **Virgil: Scan workspace** (Cmd-Shift-P) ——
扩展会通过 CLI 提交扫描,固定生成的审计 ID,并
每 5 分钟刷新一次诊断信息。设计上为只读模式 —— 抑制
和基线管理仍保留在 Web UI 中完成。
## 隐私
- **CLI 中无遥测。** 没有分析追踪器,没有匿名使用情况
ping,没有选择加入/退出选项,因为根本没有什么可加入的。
- **存储前进行密钥清除。** AWS 访问密钥、GitHub PAT、
JWT、Slack token、Google API 密钥、私钥块、RFC1918 IP
和主机路径会在发现结果被持久化到数据库 *之前*
以及在发送任何 prompt 给模型 *之前* 进行脱敏。
- **沙盒执行。** 你的仓库代码永远不会被执行。扫描器
在配置了 `--network=none --read-only --cap-drop=ALL` 的容器中运行,并
限制了 CPU/内存/pids,同时使用非 root 的 UID。
- **设计上仅用于审计。** 平台不会生成 payload、
精确补丁或详细的复现步骤 —— 验证器会在每个模型
输出上强制执行此规则。仅提供防御性指导。
## 仓库布局
```
apps/
api/ FastAPI service — routes, DB models, SSE stream
worker/ Celery worker — sandbox runner, scanner adapters, normalize, LLM
web/ Next.js 14 (App Router) — landing, audit console, findings, reports
cli/ `virgil` CLI
vscode/ VS Code extension — inline diagnostics, status-bar rollup
packages/
audit_core/ Shared Pydantic models + enums
shared-schemas/ JSON Schema for the Finding contract
docker/ Per-service Dockerfiles (incl. the sandbox scanner image)
tests/ Unit tests; pytest
```
完整的设计文档:[ARCHITECTURE.md](ARCHITECTURE.md)。
## 许可证
Apache-2.0。详见 [LICENSE](LICENSE)。
标签:DLL 劫持, StruQ, 大语言模型, 漏洞分拣, 自托管, 请求拦截, 逆向工具, 静态应用安全测试