eric-sabe/honey

GitHub: eric-sabe/honey

honey是一款自动化供应链安全监控工具,通过整合多个安全扫描器,为开发环境提供全面的安全检查。

Stars: 1 | Forks: 0

# 蜂蜜 [![ci](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/e55801a10c025434.svg)](https://github.com/eric-sabe/honey/actions/workflows/ci.yml) 为您的开发机器提供一个无需动手的供应链看门狗。honey按照计划运行最佳安全扫描器,将结果统一成一个结论,并(可选地)每天通过Claude DM向您发送一个分类报告。 honey本身不检测任何内容——它**编排**扫描器,每个扫描器都是一个针对不同风险的“镜头”: | 镜头 | 答案 | 上游 | |---|---|---| | **bumblebee** *(核心)* | "我是否有已知的受损害的包/扩展?" | [Perplexity](https://github.com/perplexityai/bumblebee) | | osv-scanner | "我的依赖项是否有已知的CVE?"(所有生态系统) | [Google/OSV](https://github.com/google/osv-scanner) | | govulncheck | "我是否实际*调用*了一个有漏洞的Go函数?" | [Go team](https://golang.org/x/vuln) | | skillspector | "安装的AI代理技能是否表现恶意?" | [NVIDIA](https://github.com/NVIDIA/skillspector) | bumblebee(唯一必需的扫描器)是一个只读的库存收集器,它会标记与威胁情报目录中已知的受损害条目匹配的磁盘上的包/扩展/版本元数据。镜头是**可选的**,直到您安装它们的工具才会激活。honey添加了更新→扫描→报告循环、最坏情况结论、调度和报告——**所有检测能力和威胁数据都是上游的**,首先是[Perplexity](https://www.perplexity.ai)的bumblebee。参见[Acknowledgements](#acknowledgements)。 使用honey三种方式,最小占用资源优先: - **普通扫描器** — `./daily-cycle.sh`,读取结论。没有Claude,没有调度器,没有账户。 - **计划加桌面通知** — 一个launchd/cron作业在发现问题时提醒您,并生成一个确定性的报告。不需要Claude。 - **每日Claude常规** — 一个Claude Code *Local*常规按计划扫描,并将丰富的分类报告DM到Slack。 ## 快速入门 ``` git clone https://github.com//honey && cd honey ./setup.sh # clones bumblebee, installs the binary + Go vuln lenses, verifies ./daily-cycle.sh # run a scan; read runs/latest/manifest.json for the verdict ``` `setup.sh`是幂等的,并在最后运行`./doctor.sh`,它会为每个依赖项打印一个✓/✗行,以及任何缺失内容的精确修复命令。如果扫描出现异常,请首先运行`./doctor.sh`。 默认情况下,`setup.sh`还提供安装两个基于Go的漏洞[lenses](#lenses--additional-scanners-optional)(osv-scanner,govulncheck)——您已经安装了Go。基于Python的skillspector镜头指向,但不自动安装。通过`HONEY_SETUP_INSTALL_LENSES=0 ./setup.sh`跳过镜头。 ### 要求 **核心:** `bash`、`git`、[`jq`](https://jqlang.org)、和[Go](https://go.dev) **1.25+**(bumblebee需要1.25+)。macOS或Linux。`setup.sh`检查所有这些,并告诉您安装缺失内容的命令——它不会猜测您的包管理器。这些还包括两个基于Go的漏洞镜头(osv-scanner,govulncheck),它们通过`go install`安装。 **可选镜头:** 只有`skillspector`镜头添加了一个要求——**Python 3.12+**(按照[SkillSpector的README](https://github.com/NVIDIA/skillspector)安装)。漏洞镜头不需要除核心工具链之外的东西。`./doctor.sh`显示哪些镜头是活动的,以及如何启用非活动的镜头。 ## 扫描周期的工作原理 1. `git pull --ff-only` bumblebee checkout——新鲜的`threat_intel/`目录(它们通过PR在上游更新)。 2. `go install github.com/perplexityai/bumblebee/cmd/bumblebee@latest`——新鲜的二进制文件。 3. `bumblebee scan --profile deep --root $HOME --exposure-catalog /threat_intel --findings-only` → 写入一个带时间戳的运行目录 + `manifest.json`。 4. `daily-cycle.sh`在`status`为`clean`时退出`0`,否则为`1`——因此,调度器或常规可以根据它分支。一个干净的机器不会产生任何发现——这就是“全部清除”。结果位于**外部**bumblebee checkout和`~/go`,因此`git pull`和`go install`都不能删除它们。 ### manifest `status`值 - `clean` — 扫描完成,没有匹配项。 - `exposed` — 一个或多个目录匹配(见`findings.ndjson`)。 - `incomplete` — 达到`--max-duration`;覆盖率部分,不是全部清除。 - `scan_error` — 扫描失败;见`cycle.log` / `diagnostics.ndjson`。 ## 镜头——附加扫描器(可选) bumblebee是honey的规范镜头(已知坏目录匹配)。honey可以与它一起运行**附加镜头**——独立扫描器,覆盖不同的表面,并将它们的结果合并到一个报告中。每个镜头都位于[`lenses/`](lenses)中,是一个小的脚本;如果其底层工具未安装,镜头是**惰性的**(一个没有镜头工具的干净机器的行为与仅bumblebee相同)。周期的总体结论是bumblebee和每个活动镜头中的**最坏情况**——镜头可以升级关注点,永远不会掩盖bumblebee的发现。 每个镜头都是**可选的**:honey永远不会为您安装镜头的工具,未安装的镜头是完全惰性的。安装工具,镜头将在下一次运行时激活。`./doctor.sh`显示哪些镜头是活动的。 | 镜头 | 工具 | 覆盖范围 | 安装 | |---|---|---|---| | `skillspector` | [NVIDIA SkillSpector](https://github.com/NVIDIA/skillspector) | AI代理技能(`SKILL.md` + 脚本):提示注入、数据泄露、过度代理、工具中毒 | 按其README(Python 3.12+)安装 | | `osv-scanner` | [Google/OSV osv-scanner](https://github.com/google/osv-scanner) | 在**所有**生态系统中的锁文件/清单中的已知漏洞(npm、pypi、cargo、go、…) | `go install github.com/google/osv-scanner/cmd/osv-scanner@latest` | | `govulncheck` | [Go vuln team govulncheck](https://golang.org/x/vuln) | 您的代码**实际调用**的Go漏洞(可达性感知→噪音更少) | `go install golang.org/x/vuln/cmd/govulncheck@latest` | **每个镜头回答的内容。** bumblebee:*"我是否有已知的受损害的包?"* (精确目录匹配)。skillspector:*"这个代理技能是否表现恶意?"*(内容分析)。osv-scanner:*"我的依赖项是否有已知的CVE?"*(广泛)。govulncheck:*"我是否实际到达一个有漏洞的Go函数?"*(深入,噪音少)。它们共同涵盖了反应性、主动性、广度和深度。 **漏洞镜头扫描的位置。** osv-scanner和govulncheck扫描您的*项目*目录,而不是整个`$HOME`。设置`HONEY_PROJECT_ROOTS`(冒号分隔;默认`~/git:~/code:~/Developer:~/src`)来控制这一点。skillspector镜头扫描`~/.claude`下的技能目录(使用`HONEY_SKILL_ROOTS`覆盖)。 **声明的依赖项,而不是vendored副本。** osv-scanner进入`node_modules`、`vendor/`、`.pnpm`、和每个嵌套的`.claude/worktrees/*`——标记相同传递依赖项的数十个副本(一次实际运行产生了2,954个发现,其中81%是重复的vendored包;过滤后,402个是真实的)。默认情况下,honey**排除这些路径并去重`package@version`+advisory跨锁文件中的相同`package@version`+advisory**,因此您只会看到每个真实的受损害依赖项一次。通过`HONEY_OSV_EXCLUDE_PATHS`(设置为空以扫描所有内容)和`HONEY_OSV_NO_DEDUPE=1`进行调整。 **Go的分工。** osv-scanner和govulncheck在Go上重叠。默认情况下,osv-scanner**将Go标准库建议推迟到govulncheck**——否则它会为您的`go`指令标记每个标准库CVE(通常是数十个,不可达,没有CVSS)。govulncheck仅报告您实际调用的标准库漏洞。设置`HONEY_OSV_INCLUDE_GO_STDLIB=1`以在osv-scanner中保留它们。 两个漏洞镜头都运行静态数据库查找(osv-scanner → OSV.dev,使用`HONEY_OSV_OFFLINE=1`进行本地数据库;govulncheck → vuln.go.dev)。skillspector默认使用静态(`--no-llm`)——honey的Claude常规是语义层;设置`HONEY_SKILLSPECTOR_LLM=1`以使用SkillSpector自己的LLM阶段。 ### 保持最新 有两件事可能会过时——漏洞**数据**和扫描器**二进制文件**——honey以不同的方式处理它们: - **漏洞数据始终是实时的。** osv-scanner和govulncheck在每次扫描时都会查询其数据库(OSV.dev、vuln.go.dev),因此昨天发布的CVE今天就会被捕获,无需更新步骤。 - **Go镜头二进制文件自动更新。** 在扫描之前,honey `go install @latest`s osv-scanner和govulncheck(就像它对bumblebee二进制文件所做的那样)。设置`HONEY_UPDATE_LENSES=0`以禁用。更新不是致命的:如果它失败(离线等),镜头将保留其现有的二进制文件并继续扫描。破坏性的上游更改会以`scan_error`(可见)的形式出现,永远不会是错误的清除。 - **skillspector不会自动更新。** 它的检测模式捆绑在安装的包中,其安装方法(pip/pipx/venv)由您决定——honey永远不会更改Python环境。按照其README定期重新安装它以获取新模式。 ## 可选:通过Claude Local常规每天进行Slack分类 如果您使用[Claude Code](https://claude.com/claude-code)并且启用了Slack连接器,您可以让整个流程每天运行,并DM给您分析——无需额外的凭证,因为一个*Local*常规重用您自己的Claude身份验证和连接器。 1. 在常规中心:**新建常规 → Local**。 2. 将`[`routine-prompt.md](routine-prompt.md)`中的提示粘贴(它运行`daily-cycle.sh`进行扫描,`report.sh`用于事实基础,然后DM给您一个丰富的报告)。在它里面设置`HONEY_DIR`为您checkout路径。 3. 设置计划(例如,每天中午)。 在干净的运行中,您将获得一条单行全部清除的消息;在`exposed`运行中,您将获得每个发现的分类以及起草的修复方案,将Claude的定制判断叠加在`report.sh`的确定性事实之上。因为它是*Local*,它可以查看您的真实文件系统(因此扫描是有意义的)——一个*Remote*云常规不能,并且总是会报告清除。 **常规中的镜头——已经处理。** 提示运行`report.sh`,它涵盖了bumblebee *和每个活动镜头*,因此一旦安装了它们的工具,常规就会自动获取osv-scanner / govulncheck / skillspector——无需更改提示。两件事使这在不手动配置的情况下工作: - `daily-cycle.sh`设置其自己的PATH(包括`~/go/bin`和`~/.local/bin`),因此即使Local常规以裸环境开始,镜头工具也可以解析。 - 漏洞镜头默认扫描`~/git:~/code:~/Developer:~/src`。Local常规不会继承您的shell环境变量,因此如果您的项目位于其他位置,请将它们持久化到`honey.conf`(添加`export HONEY_PROJECT_ROOTS="${HONEY_PROJECT_ROOTS:-/my/projects:/other}"`)——每个脚本,包括常规的,都会读取它。(或者,在运行脚本之前,在提示中添加`Set HONEY_PROJECT_ROOTS=…`行)。同样适用于非默认的`BUMBLEBEE_REPO`,`setup.sh`为您持久化它——参见[Configuration](#configuration-env-vars-all-optional)。 要手动在聊天中进行分类(“对最新的honey运行进行分类”),请参阅[`triage-guide.md`](triage-guide.md)。 ## 可选:每天扫描+桌面通知(没有Claude,没有Slack) 不使用Claude或Slack?使用您的操作系统安排扫描,并在需要关注时收到本机桌面通知——无需账户,无需连接器。 ``` ./install-schedule.sh # daily at noon (local); pass HH:MM to change ./install-schedule.sh status # is it scheduled? ./install-schedule.sh uninstall # remove it ``` - **macOS** → 安装一个针对用户的**launchd**代理(`com.honey.bumblebee.notify`)并通过`osascript`(内置)或`terminal-notifier`(如果已安装)进行通知。 - **Linux** → 安装一个用户**cron**行,并通过`notify-send`(libnotify)进行,前提是有一个图形会话处于活动状态。 它运行[`notify-cycle.sh`](notify-cycle.sh),它扫描,并且——只有在结论是`exposed` / `incomplete` / `scan_error`时——弹出一个指向`runs/latest/report.txt`的通知。干净的运行是静默的。 **您仍然可以获得没有Claude的分析。** [`report.sh`](report.sh)直接从结构化发现中渲染一个可读的分类报告——结论、覆盖率以及每个匹配项按严重性分组,包括其位置、置信度和每个生态系统的标准修复步骤(npm/pip/go/bundler/composer/brew/extension)。通知路径会自动将其写入`runs/latest/report.txt`;您也可以随时运行它: ``` ./report.sh # report on the latest run ./report.sh runs/ # report on a specific run ``` Claude常规产生更丰富、针对特定项目的散文和理由,但事实和标准修复都是通过`report.sh`以确定性的方式——因此没有Claude的路径是真正可操作的,而不仅仅是“有匹配项”的ping。 ## 手动使用 ``` ./doctor.sh # health check + which lenses are active ./run-scan.sh # just bumblebee (no cycle wrapper, no lenses) ./daily-cycle.sh # bumblebee + all active lenses + overall verdict ./report.sh # render the latest run (bumblebee + every lens) # 缩小扫描范围或更改时间预算: BUMBLEBEE_SCAN_ROOT="$HOME/code" BUMBLEBEE_MAX_DURATION=20m ./run-scan.sh # 将漏洞镜头对准您的项目: HONEY_PROJECT_ROOTS="$HOME/work:$HOME/repos" ./daily-cycle.sh ``` 在每次运行之后,`runs/latest/manifest.json`都有结论,`runs/latest/findings.ndjson`都有任何匹配项。 ## 配置(环境变量,所有都是可选的) 所有设置都是环境变量,具有默认值——默认安装不需要它们。直接设置(`HONEY_PROJECT_ROOTS=… ./daily-cycle.sh`)或在shell中导出它们。 **持久化设置(`honey.conf`)。** 环境变量不会在shell之间持续存在,并且Claude *Local*常规/cron作业以裸环境开始,不会看到它们。对于必须持续存在的设置——通常是非默认的`BUMBLEBEE_REPO`——`setup.sh`在仓库根目录中写入一个gitignored的`honey.conf`,每个脚本都会读取它。如果`setup.sh`在非默认路径上找到一个现有的bumblebee checkout,它会提供使用它并在此处持久化选择(而不是克隆一个副本)。优先级是**环境变量 > honey.conf | 变量 | 默认值 | 目的 | |---|---|---| | `HONEY` | 脚本自己的目录 | 运行写入的位置 | | `BUMBLEBEE_REPO` | `$HOME/git/bumblebee` | bumblebee checkout(用于目录) | | `BUMBLEBEE_SCAN_ROOT` | `$HOME` | bumblebee扫描的内容 | | `BUMBLEBEE_MAX_DURATION` | `30m` | bumblebee扫描时间上限 | | `HONEY_PROJECT_ROOTS` | `~/git:~/code:~/Developer:~/src` | 漏洞镜头(osv-scanner,govulncheck)查找项目的地方 | | `HONEY_SKILL_ROOTS` | `~/.claude`下的技能目录 | skillspector镜头查找代理技能的地方 | | `HONEY_UPDATE_LENSES` | `1` | 在扫描之前`go install @latest`s Go镜头二进制文件(osv-scanner,govulncheck);`0`以跳过 | | `HONEY_OSV_OFFLINE` | `0` | osv-scanner:使用本地漏洞数据库而不是OSV.dev | | `HONEY_OSV_INCLUDE_GO_STDLIB` | `0` | osv-scanner:保留Go标准库建议(默认推迟到govulncheck) | | `HONEY_OSV_EXCLUDE_PATHS` | `node_modules`/`vendor`/`.pnpm`/`testdata`/
标签:CLI 工具, CVE, Google, Go 语言, Nuclei, OSV, PB级数据处理, Perplexity, Slack 通知, Vercel, 代码安全, 依赖管理, 反取证, 威胁情报, 安全合规, 安全响应, 安全扫描, 安全报告, 安全漏洞, 安全策略, 安全评估, 安全运维, 应用安全, 开发者工具, 开源框架, 持续集成, 提示词设计, 数字签名, 日志审计, 时序注入, 桌面通知, 漏洞枚举, 网络代理, 网络安全研究, 逆向工具, 风险监控