kato83/mayu

GitHub: kato83/mayu

聚合 OSV、NVD 等多源漏洞数据到本地数据库,提供 CLI、API 和 Web UI 进行跨平台漏洞查询的工具。

Stars: 1 | Forks: 0

# Mayu [日本語版 (日语)](README_ja.md) 一个统一的漏洞情报工具,聚合多个来源(OSV、NVD 等),通过 CLI、API 和 Web UI 进行跨平台查询。 ## 概述 Mayu 将来自 [OSV](https://osv.dev/) 生态系统的漏洞数据提取到本地 PostgreSQL 数据库中,从而实现对已知漏洞的快速跨平台搜索和分流处理。 **当前功能:** - 从 GCS bucket 完整导入和增量导入 OSV 漏洞数据 - 基于 CLI 的漏洞搜索,支持按 ID、包名、生态系统或别名查询 - 支持所有 OSV 生态系统(Go、PyPI、npm、Maven、crates.io 等) - 保留原始的 OSV JSON 以确保数据的完全可逆性 ## 命名 **Mayu** 来源于日语词汇 *繭 (mayu)*,意为“茧”——蚕为自己吐丝结成的保护壳。这个名字反映了该工具的目的:利用漏洞情报为您的环境包裹一层温和而富有韧性的保护。作为一个四个字母的名字,且易于小写化,它也非常适合现代的 CLI / API / Web UI 工具链(`mayu`、`mayu-server` 等)。 ## 快速开始 ### 前置条件 - [Go 1.26+](https://go.dev/)(通过 [asdf](https://asdf-vm.com/) 管理) - [Docker](https://www.docker.com/) & Docker Compose - [golang-migrate](https://github.com/golang-migrate/migrate) CLI ### 设置 ``` # Clone repository git clone https://github.com/kato83/mayu.git cd mayu # 通过 asdf 安装 Go asdf install # 启动 PostgreSQL make docker-up # 运行数据库迁移 make migrate-up # 构建 CLI make build ``` ### 导入漏洞数据 ``` # 导入所有 Go ecosystem 漏洞(完全同步) ./bin/mayu ingest --ecosystem Go # 通过 delta update 导入(仅同步自上次同步以来的新增/修改) ./bin/mayu ingest --ecosystem Go --update # 导入所有受支持的 ecosystem(每个 ecosystem 独立的 all.zip) ./bin/mayu ingest --all # 以自定义并发数导入所有 ecosystem ./bin/mayu ingest --all --concurrency 5 --store-workers 8 # 从单个顶层 all.zip 批量导入(约 1.3GB,一次性导入所有 ecosystem) ./bin/mayu ingest --all --bulk ``` ### 搜索漏洞 ``` # 按 vulnerability ID 搜索 ./bin/mayu search --id GO-2024-2687 # 按 package name 搜索 ./bin/mayu search --package golang.org/x/crypto # 按 ecosystem 搜索 ./bin/mayu search --ecosystem Go --limit 10 # 按 CVE alias 搜索 ./bin/mayu search --alias CVE-2024-24790 # 按 Package URL (purl) 搜索 ./bin/mayu search --purl pkg:npm/%40angular/core # 位置参数(自动检测 ID 或 alias) ./bin/mayu search CVE-2024-24790 # 按 severity level 过滤 ./bin/mayu search --severity critical --ecosystem Go # 按日期过滤(自该修改时间起) ./bin/mayu search --since 2024-01-01 --ecosystem npm # 按 affected version 过滤 ./bin/mayu search --package golang.org/x/crypto --version 0.17.0 # 分页 ./bin/mayu search --ecosystem Go --limit 10 --offset 20 # 仅统计结果数量 ./bin/mayu search --ecosystem Go --count # 详细视图(所有字段) ./bin/mayu search --id GO-2024-2687 --detail # 用于脚本的 JSON 输出 ./bin/mayu search --id GO-2024-2687 --format json # CSV 导出 ./bin/mayu search --ecosystem Go --format csv > vulns.csv ``` ### 启动 API Server ``` # 启动 API server(默认端口:8080) ./bin/mayu serve # 在自定义端口上启动 ./bin/mayu serve --addr :3000 # OpenAPI spec 可在 http://localhost:8080/openapi.yaml 获取 ``` ## CLI 参考 ### `mayu ingest` 将漏洞数据从 OSV 导入到本地数据库。 | 标志 | 描述 | 默认值 | |------|-------------|---------| | `--ecosystem` | 要导入的生态系统(例如 Go、PyPI、npm) | — | | `--all` | 导入所有生态系统(从 GCS 动态获取) | `false` | | `--bulk` | 使用顶层的 all.zip 进行批量导入(配合 `--all`) | `false` | | `--update` | 执行增量更新而不是完全导入 | `false` | | `--source` | 从转换后的源导入(nvd、debian) | — | | `--concurrency` | 并行导入的生态系统数量(配合 `--all`) | `3` | | `--store-workers` | 每个生态系统并行执行的数据库存储 worker 数量 | CPU 核心数 - 1 | | `--db-url` | PostgreSQL 连接 URL | `$DATABASE_URL` 或 `localhost` | | `--batch-size` | 每次批量插入的漏洞数量 | `100` | ### `mayu search` 在本地数据库中搜索漏洞。 | 标志 | 描述 | 默认值 | |------|-------------|---------| | `--id` | 按漏洞 ID 搜索 | — | | `--package` | 按包名搜索 | — | | `--ecosystem` | 按生态系统过滤 | — | | `--alias` | 按别名搜索(例如 CVE ID) | — | | `--purl` | 按 Package URL 搜索(例如 `pkg:npm/%40angular/core`) | — | | `--severity` | 按 CVSS 严重级别过滤(critical、high、medium、low、none) | — | | `--since` | 按修改日期过滤(YYYY-MM-DD 或 RFC3339) | — | | `--version` | 按受影响版本过滤 | — | | `--format` | 输出格式:`table`、`json`、`csv` | `table` | | `--limit` | 最大结果数 | `20` | | `--offset` | 分页偏移量 | `0` | | `--count` | 仅显示结果计数 | `false` | | `--detail` | 显示每个结果的详细信息 | `false` | | `--db-url` | PostgreSQL 连接 URL | `$DATABASE_URL` 或 `localhost` | ### `mayu version` 打印版本信息。 ### `mayu serve` 启动 API server,以便通过编程方式访问漏洞数据。 | 标志 | 描述 | 默认值 | |------|-------------|---------| | `--addr` | 监听地址(host:port) | `:8080` | | `--db-url` | PostgreSQL 连接 URL | `$DATABASE_URL` 或 `localhost` | **Endpoints:** | 方法 | 路径 | 描述 | |--------|------|-------------| | GET | `/api/v1/vulnerabilities` | 搜索漏洞(参数与 CLI 搜索相同) | | GET | `/api/v1/vulnerabilities/{id}` | 通过 OSV ID 获取单个漏洞 | | GET | `/healthz` | 健康检查 | | GET | `/openapi.yaml` | OpenAPI 3.1 规范 | **示例:** ``` # 在默认端口上启动 server ./bin/mayu serve # 在自定义端口上启动 ./bin/mayu serve --addr :3000 # 查询 API curl "http://localhost:8080/api/v1/vulnerabilities?ecosystem=Go&limit=5" curl "http://localhost:8080/api/v1/vulnerabilities/GO-2024-2687" curl "http://localhost:8080/api/v1/vulnerabilities?package=golang.org/x/crypto" curl "http://localhost:8080/api/v1/vulnerabilities?severity=critical" curl "http://localhost:8080/api/v1/vulnerabilities?purl=pkg:golang/golang.org/x/crypto" ``` ## 架构 ``` graph TD CLI["CLI (cmd/mayu)"] CLI --> Ingest[ingest] CLI --> Search[search] CLI --> Serve[serve] Ingest --> Fetcher["Fetcher (GCS)"] Ingest --> Parser["Parser (OSV)"] Ingest --> IngestPipeline["Ingest (Pipeline)"] Search --> Store["Store (PG)"] Serve --> Server["Server (HTTP/REST)"] Server --> Store IngestPipeline --> Store Store --> DB[(PostgreSQL)] ``` ## 数据源 | 来源 | 状态 | 方法 | |--------|--------|--------| | [OSV](https://osv.dev/) | ✅ 支持 | GCS bucket (`gs://osv-vulnerabilities/`) | | NVD(通过 OSV) | ✅ 支持 | 包含在 OSV 数据中 | | [NVD CVE(已转换)](https://storage.googleapis.com/cve-osv-conversion/index.html?prefix=osv-output/) | ✅ 支持 | `mayu ingest --source nvd` | | [Debian Security Advisories](https://storage.googleapis.com/debian-osv/index.html) | ✅ 支持 | `mayu ingest --source debian` | | 来源 | 状态 | 方法 | |--------|--------|--------| | KEV | 🔵 计划中 | — | | EPSS | 🔵 计划中 | — | ## 开发 ``` # 运行单元测试 make test # 运行集成测试(需要 PostgreSQL) make docker-up && make migrate-up make test-integration # Lint make lint # 构建(开发版,包含 debug symbols) make build # 构建(发布版,stripped binary 体积减小约 30%) make build-release # 停止 PostgreSQL make docker-down ``` ## 配置 | 环境变量 | 描述 | 默认值 | |---------------------|-------------|---------| | `DATABASE_URL` | PostgreSQL 连接字符串 | `postgres://mayu:mayu@localhost:5432/mayu?sslmode=disable` | ## 许可证 [MIT](LICENSE) ## 路线图 请查看 [docs/PLAN.md](docs/PLAN.md) 了解完整的实施计划。 - [x] 阶段 1:数据 Pipeline(OSV 提取) - [x] 阶段 2:CLI(提取 + 搜索) - [x] 阶段 3:CI/CD(GitHub Actions) - [x] 阶段 4:API Server(REST) - [ ] 阶段 5:Web UI(Angular) - [ ] 阶段 6:额外数据源(KEV、EPSS、MITRE CVE)
标签:EVTX分析, 日志审计, 测试用例, 请求拦截