不跑 npm ls、只读元数据:bumblebee 盘点开发机上的 advisory 命中
bumblebee 是 Perplexity 开源的只读 inventory 收集器,面向 macOS/Linux 开发者机器,盘点本地安装的包、扩展与开发者工具元数据。当某个 advisory 点名一个包/扩展/版本时,它直接在本地磁盘元数据里筛出哪些开发机状态命中。仓库:github.com/perplexityai/bumblebee,Apache 2.0。
和相邻工具对照:SBOM 回答“发布物里装了什么”,EDR 回答“哪台机器跑过网络”,bumblebee 补的是“当前这些开发机上杂乱的本地状态,命中没命中”。
只读边界
- 只解析列出的 lockfile、安装元数据、扩展 manifest、MCP JSON 配置;
- 不执行
npm ls、pip show、go list,不读源码; - 无网络调用;
- 单静态二进制,Go 1.25+,零非标准库依赖。
MCP host 配置的 env 块可能带凭据,它只解析出 server 清单用于盘点,记录不会输出这些值。
覆盖生态
| 生态 | 数据来源 |
|---|---|
| npm(pnpm/Yarn/Bun 归入) | package-lock.json、pnpm-lock.yaml、yarn.lock、bun.lock |
| PyPI | 磁盘上的 *.dist-info/METADATA |
| Go modules | go.sum / go.mod |
| RubyGems | Gemfile.lock + gemspec |
| Composer | composer.lock + vendor/composer/installed.json |
| MCP | 仅 JSON:mcp.json、claude_desktop_config.json、~/.claude.json、~/.gemini/settings.json 等 |
| 编辑器扩展 | VS Code / Cursor / Windsurf / VSCodium |
| 浏览器扩展 | Chromium manifest.json、Firefox extensions.json |
| Homebrew | Formula INSTALL_RECEIPT.json、cask .metadata |
v0.1.1 不解析 Codex config.toml 与 Continue YAML。
安装与自检
go install github.com/perplexityai/bumblebee/cmd/bumblebee@latest
# 固定版本
go install github.com/perplexityai/bumblebee/cmd/bumblebee@v0.1.1
bumblebee selftest 用内置 fixtures、假包名、无网络做自检;version 输出带 VCS revision 与构建时间,便于回溯现场用的构建。
Profile 与常用命令
三个 profile 控制扫描范围:
baseline:全局/用户包根 + 工具链 + 编辑器/浏览器扩展 + MCP,适合外部调度做轻量周期盘点;project:扫配置的开发目录(如~/code);deep:显式--root甚至$HOME,按需做 incident 排查。
baseline/project 拒绝把裸 home 根当 root;只有 deep 会扫整个 home。一次运行只扫一轮就退出,调度由外部负责。
# 常规盘点,NDJSON 走 stdout
bumblebee scan --profile baseline > inventory.ndjson
# 项目级:扫多个开发目录
bumblebee scan --profile project --root "$HOME/code" --root "$HOME/Developer"
# 缩小生态范围
bumblebee scan --profile baseline --ecosystem npm,pypi --ecosystem go
# incident 排查:deep 扫整个 home,带上 catalog,限时 10m
bumblebee scan --profile deep --root "$HOME" \
--exposure-catalog ./catalog.json --max-duration 10m
# 预览会解析哪些 root
bumblebee roots --profile baseline
--findings-only 必须配合 --exposure-catalog,抑制普通 package 记录,只输出命中。
输出与 confidence
stdout 为 NDJSON,每行一条记录;诊断日志走 stderr,同样是 NDJSON,每轮以 scan_summary 收尾。package 记录带 run_id、endpoint(hostname/os/arch/username/device_id)、profile、ecosystem、包名、版本与 confidence。record_id 是规范身份元组的 content-address 哈希,跨轮稳定,适合做状态追踪。
confidence 分三档:
high:名称与版本来自权威元数据;medium:包身份可靠,但版本/来源信息不完整;low:只有配置/路径引用,不足以证明装了确切版本。
命中时是 finding 记录:finding_type=package_exposure,带 severity、catalog_id、ecosystem、package_name、version、source_type,evidence 形如 exact name+version match (version=1.2.3)。
Exposure catalog 匹配
- entry 精确匹配
(ecosystem, name, version),version可用"*"命中所有版本; - 顶层必须是完整对象,带
schema_version+entries,裸数组会被拒;schema_version0.1.0 兼容但不支持"*"; --exposure-catalog可指向目录,合并其中多个*.json,要求同一schema_version。
仓库自带 threat_intel/ 目录,维护公开情报 catalog 供参考。
使用取舍
它回答的是“当前哪些开发机磁盘状态命中 catalog”,不等于“这个版本真的被污染”或“这台机器跑过恶意代码”;low confidence 命中只是引用,别当实锤。周期盘点的节奏、NDJSON 消费与落库、持续维护当前状态视图都需要自己搭。v0.1.1 对 MCP 只认 JSON,Codex config.toml 与 Continue YAML 不解析;大规模多端聚合与自定义调度也还没有实测。