vaulpann/ghost

GitHub: vaulpann/ghost

基于智能体 LLM 的实时供应链漏洞追踪工具,能在恶意包传播前通过深度代码分析捕获威胁。

Stars: 3 | Forks: 1

Ghost

Ghost

适用于 npm、PyPI 和 GitHub 的实时供应链威胁情报。
基于 Agentic LLM 的分析,在恶意软件包传播之前将其捕获。

实时仪表板 · 获取警报 (Slack) · @pjvann

## 问题所在 供应链攻击正在快速增长。xz utils 后门、event-stream 事件、ua-parser-js 劫持、Axios 被入侵——这些之所以得逞,是因为没有人以发布速度进行自动化的深度分析。 现有的工具依赖于签名匹配和已知的 CVE 数据库。它们无法捕获**新型攻击**——一个没有先前历史的全新恶意依赖项、版本更新中隐藏的混淆载荷、以及拼写错误的软件包名称。 ## Ghost 的工作原理 Ghost 监控着 npm、PyPI 和 GitHub 上 545 多个最关键的开源软件包。当发布新版本或 main 分支有新的提交时,Ghost 会: 1. **检测** 60 秒内的变更 2. **下载** 旧版本和新版本 3. **对比** 源代码 4. **运行 AI 安全代理**,该代理使用真实的工具调查变更 该代理不仅仅是读取差异并猜测。它拥有以下工具: - **查询软件包** 在 npm/PyPI 上——检查下载量、仓库链接、描述 - **查询 GitHub 仓库**——检查 stars、活跃度、存档状态、最近的提交 - **下载并解压软件包**——实际检查新依赖项的源代码 - **对比依赖项版本**——查看被升级的依赖项内部发生了什么变化 - **扫描可疑模式**——网络调用、进程执行、混淆、凭证访问 - **读取特定文件**——检查安装脚本、入口点以及任何可疑内容 如果一个软件包添加了一个每周下载量仅为 2 且包含 curl 二进制文件的 postinstall 脚本的新依赖项——Ghost 会捕获它。如果子依赖项的版本更新引入了 `eval(atob(...))`——Ghost 会捕获它。 ## 架构 ``` Cloud Scheduler (every 60s) | v +---------------+ | Ingestion | Polls npm, PyPI, GitHub | Service | for version changes +-------+-------+ | new version detected | v +---------------+ | Diff | Downloads old + new | Generator | Generates unified diff +-------+-------+ | v +---------------+ | Security | OpenAI Agents SDK | Agent | GPT-4o with 6 tools +-------+-------+ | +-------+-------+ | | v v +----------+ +-----------+ | Slack | | Dashboard | | Alert | | API | +----------+ +-----------+ ``` ### 技术栈 | 组件 | 技术 | |-----------|-----------| | **Backend** | Python 3.12, FastAPI, SQLAlchemy (async), Alembic | | **Analysis** | OpenAI Agents SDK, GPT-4o with function tools | | **Frontend** | Next.js 14, React, TailwindCSS | | **Database** | PostgreSQL (Neon) | | **Deployment** | GCP Cloud Run, Vercel, Cloud Scheduler | | **MCP Server** | Node.js, @modelcontextprotocol/sdk | ### 代理的工具箱 | 工具 | 用途 | |------|---------| | `lookup_package_info` | 检查 npm/PyPI 软件包元数据、下载量、仓库 | | `lookup_github_repo` | 检查 GitHub 仓库 stars、活跃度、发布版本、存档状态 | | `download_and_list_files` | 下载软件包版本,列出文件,标记安装脚本 | | `read_file_content` | 从下载的软件包中读取特定文件 | | `diff_package_versions` | 对比依赖项的两个版本以查看变更内容 | | `scan_for_suspicious_patterns` | 正则扫描网络调用、eval、进程执行等 | ## MCP 服务器 -- 在您的 AI 编码工具中使用 Ghost Ghost 附带一个 MCP (Model Context Protocol) 服务器,允许任何 AI 编码助手根据 Ghost 的实时威胁情报检查软件包。 ### 添加到 Claude Code ``` cd ghost/mcp && npm install claude mcp add ghost node -- /path/to/ghost/mcp/index.js ``` 然后在任何 Claude Code 会话中: ### 添加到 OpenAI Codex 添加到您的 Codex MCP 配置中: ``` { "ghost": { "type": "stdio", "command": "node", "args": ["/path/to/ghost/mcp/index.js"] } } ``` ### MCP 工具 | 工具 | 描述 | |------|-------------| | `check_package` | 在将软件包添加为依赖项之前,检查其是否存在供应链威胁 | | `get_threat_alerts` | 获取所有风险评分较高的软件包 | | `ghost_status` | 获取监控统计信息——跟踪的软件包、运行的分析、威胁级别 | MCP 服务器默认连接您的本地 Ghost API。设置 `GHOST_API_URL` 以指向远程实例。 ## 自托管 ### 前置条件 - Docker & Docker Compose - Python 3.12+ - Node.js 20+ - OpenAI API key (用于分析代理) - PostgreSQL 数据库 ### 快速开始 (本地开发) ``` # 克隆 git clone https://github.com/vaulpann/versatility-labs.git ghost cd ghost # 配置 cp .env.example .env # 使用你的 OPENAI_API_KEY 和 DATABASE_URL 编辑 .env # 启动 backend + postgres docker-compose up --build # 在另一个终端中,启动 frontend cd frontend && npm install && npm run dev # Seed packages docker exec ghost-backend-1 python -m seed # 打开 http://localhost:3000 ``` ### 环境变量 | 变量 | 必填 | 描述 | |----------|----------|-------------| | `DATABASE_URL` | 是 | PostgreSQL 连接字符串 (asyncpg 格式) | | `OPENAI_API_KEY` | 是 | 用于安全代理的 OpenAI API key | | `GITHUB_TOKEN` | 推荐 | GitHub PAT,用于获得更高的速率限制 (5000 次/小时 vs 60 次) | | `SLACK_WEBHOOK_URL` | 可选 | 用于警报的 Slack incoming webhook | | `ADMIN_API_KEY` | 可选 | 保护 webhook/poll 端点 | | `ALLOWED_ORIGINS` | 可选 | CORS 源 (逗号分隔) | | `FRONTEND_URL` | 可选 | Slack 警报中链接的前端 URL | ### 生产环境部署 Ghost 专为 GCP Cloud Run + Vercel 设计: 1. **Database**: Neon (托管 Postgres) 或 Cloud SQL 2. **Backend**: `gcloud run deploy ghost-api --source ./backend` 3. **Frontend**: 将仓库连接到 Vercel,将根目录设置为 `frontend` 4. **Auto-polling**: Cloud Scheduler 每分钟调用 `POST /api/v1/webhooks/poll` 5. **Alerts**: 通过数据库配置 Slack webhook 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 中的完整部署指南。 ## API 所有读取端点都是公开的。写入端点已被移除或受 `ADMIN_API_KEY` 保护。 | 方法 | 端点 | 描述 | |--------|----------|-------------| | GET | `/api/v1/packages` | 列出受监控的软件包 (分页) | | GET | `/api/v1/packages/{id}` | 软件包详情 | | GET | `/api/v1/packages/{id}/versions` | 版本历史 | | GET | `/api/v1/versions/{id}/diff` | 原始 diff 内容 | | GET | `/api/v1/analyses` | 分析流 (分页,可筛选) | | GET | `/api/v1/analyses/{id}` | 完整分析详情 | | GET | `/api/v1/analyses/{id}/findings` | 安全发现 | | GET | `/api/v1/feed` | 仪表板流 (分页) | | GET | `/api/v1/stats` | 监控统计 | | POST | `/api/v1/webhooks/poll` | 触发轮询 (需要 `X-API-Key`) | ## 检测原理 ### Ghost 捕获的内容 (评分 5.0+): - 每周下载量 <1K 且包含下载外部二进制文件的安装脚本的新依赖项 - 新版本引入带有编码载荷的 `eval()` 的依赖项版本更新 - 拼写错误的软件包名称 (例如,用 `plain-crypto-js` 代替 `crypto-js`) - 数据外泄模式——收集凭证并将其发送到外部 URL 的代码 - 混淆代码替换了先前可读的源代码 ### Ghost 正确忽略的内容 (评分 0.0): - Dockerfile 变更、CI/CD 配置、构建脚本 - 文档、测试、README、CHANGELOG 更新 - 对知名软件包 (>10K 下载量) 的依赖更新 - 版本元数据、版权年份变更 - Go 模块更新、Rust crate 对标准库的更新 - Linter 配置、类型注解、重构 ### Axios 攻击 -- Ghost 如何捕获它 2026 年 3 月 31 日,攻击者劫持了一名 npm 维护者的账户并发布了带有恶意依赖项 `plain-crypto-js@4.2.1` 的 `axios@1.14.1`。 Ghost 的代理将会: 1. 在 60 秒内检测到新的 `axios` 版本 2. 对比 `1.14.0` 与 `1.14.1`——看到新的 `plain-crypto-js` 依赖项 3. 调用 `lookup_package_info("plain-crypto-js", "npm")`——看到 0 下载量,没有仓库 4. 调用 `download_and_list_files("plain-crypto-js", "4.2.1", "npm")`——找到 postinstall 脚本 5. 对 postinstall 调用 `read_file_content()`——看到它下载了一个 RAT 二进制文件 6. 调用 `scan_for_suspicious_patterns()`——确认网络调用 + 进程执行 7. 评分:**9.5/10 严重**——立即向 Slack 触发警报 ## 项目结构 ``` ghost/ ├── backend/ │ ├── app/ │ │ ├── main.py # FastAPI app │ │ ├── config.py # Settings │ │ ├── database.py # Async SQLAlchemy │ │ ├── models/ # ORM models │ │ ├── schemas/ # Pydantic schemas │ │ ├── routers/ # API endpoints │ │ ├── services/ │ │ │ ├── registry/ # npm, PyPI, GitHub clients │ │ │ ├── diff/ # Diff generation │ │ │ ├── analysis/ │ │ │ │ ├── agent.py # Security agent (OpenAI Agents SDK) │ │ │ │ └── pipeline.py # Analysis orchestrator │ │ │ ├── ingestion.py # Poll orchestrator │ │ │ └── alerting.py # Slack/webhook dispatch │ │ └── utils/ │ ├── alembic/ # DB migrations │ ├── seed.py # Seed 100 packages │ └── Dockerfile ├── frontend/ │ ├── src/app/ # Next.js pages │ ├── src/components/ # React components │ └── src/lib/ # API client, types, utils ├── mcp/ │ └── index.js # MCP server for AI coding tools ├── docker-compose.yml └── LICENSE ``` ## 贡献 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解如何做出贡献的指南。 ## 致谢 由 [Validia](https://validia.ai) 的 [Paul Vann](https://x.com/pjvann) 构建。 加入 Slack 上的 [FrontierSec](https://join.slack.com/t/frontiersec/shared_invite/zt-3s0tfehvr-Qjqa1w8ITe7O7zZcd_23ag) 以获取实时警报。 ## 许可证 MIT -- 请参阅 [LICENSE](LICENSE)。
标签:DevSecOps, DNS枚举, LLM, MITM代理, npm, PyPI, Unmanaged PE, WSL, 上游代理, 人工智能安全, 代码差异分析, 供应链攻击防护, 依赖管理, 合规性, 威胁情报, 开发者工具, 开源供应链安全, 恶意包检测, 测试用例, 漏洞追踪, 网络安全工具, 自动化分析, 请求拦截, 跨站脚本, 逆向工具, 零日漏洞