代码 不跑 npm ls、只读元数据:bumblebee 盘点开发机上的 advisory 命中

2026-09-06 21:33:14

不跑 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 lspip showgo list,不读源码;
  • 无网络调用;
  • 单静态二进制,Go 1.25+,零非标准库依赖。

MCP host 配置的 env 块可能带凭据,它只解析出 server 清单用于盘点,记录不会输出这些值。

覆盖生态

生态数据来源
npm(pnpm/Yarn/Bun 归入)package-lock.jsonpnpm-lock.yamlyarn.lockbun.lock
PyPI磁盘上的 *.dist-info/METADATA
Go modulesgo.sum / go.mod
RubyGemsGemfile.lock + gemspec
Composercomposer.lock + vendor/composer/installed.json
MCP仅 JSON:mcp.jsonclaude_desktop_config.json~/.claude.json~/.gemini/settings.json
编辑器扩展VS Code / Cursor / Windsurf / VSCodium
浏览器扩展Chromium manifest.json、Firefox extensions.json
HomebrewFormula 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_idendpoint(hostname/os/arch/username/device_id)、profileecosystem、包名、版本与 confidencerecord_id 是规范身份元组的 content-address 哈希,跨轮稳定,适合做状态追踪。

confidence 分三档:

  • high:名称与版本来自权威元数据;
  • medium:包身份可靠,但版本/来源信息不完整;
  • low:只有配置/路径引用,不足以证明装了确切版本。

命中时是 finding 记录:finding_type=package_exposure,带 severitycatalog_idecosystempackage_nameversionsource_typeevidence 形如 exact name+version match (version=1.2.3)

Exposure catalog 匹配

  • entry 精确匹配 (ecosystem, name, version)version 可用 "*" 命中所有版本;
  • 顶层必须是完整对象,带 schema_version + entries,裸数组会被拒;schema_version 0.1.0 兼容但不支持 "*"
  • --exposure-catalog 可指向目录,合并其中多个 *.json,要求同一 schema_version

仓库自带 threat_intel/ 目录,维护公开情报 catalog 供参考。

使用取舍

它回答的是“当前哪些开发机磁盘状态命中 catalog”,不等于“这个版本真的被污染”或“这台机器跑过恶意代码”;low confidence 命中只是引用,别当实锤。周期盘点的节奏、NDJSON 消费与落库、持续维护当前状态视图都需要自己搭。v0.1.1 对 MCP 只认 JSON,Codex config.toml 与 Continue YAML 不解析;大规模多端聚合与自定义调度也还没有实测。

复制全文 生成海报 供应链安全 漏洞排查 Go DevOps NDJSON

推荐文章

程序员茄子在线接单