关于 Husk
Husk 是面向开发者的本地优先安全扫描器,可检查依赖项、泄露的密钥、安装脚本及 AI/MCP 配置。它提供命令行、终端和网页界面、项目策略及 CI 门禁,帮助团队在本地审查并处理发现项。
主要功能
- 01扫描依赖项与泄露密钥
- 02检测高风险脚本和 Agent 配置
- 03离线扫描与安全公告查询
- 04项目策略与信任账本
- 05CI 门禁与修复计划
- 06命令行、TUI 和本地网页界面
适用场景
- 01检查项目中的安全问题
- 02安装前检查软件包
- 03按问题严重程度设置 CI 门禁
- 04规划安全修复并记录策略决定
MCP 相关
`husk mcp` 通过 stdio 运行 MCP 服务,让 Agent 读取发现项并启动范围受限的扫描。`husk mcp install` 可将配置注册到 Agent。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
10收录的工具列表 · 更新于 2 周前
此工具无需参数。
详细介绍
husk 会扫描你的机器,检查是否存在遭入侵的软件包、泄露的密钥、有风险的安装脚本以及不安全的 AI/MCP 配置,然后告诉你需要修复什么。它在本地运行:无需登录或账号,任何文件都不会离开你的机器。在线扫描只会向公共安全公告数据库(OSV.dev、npm、PyPI、GitHub、CISA KEV / FIRST EPSS)发送软件包名称、版本和 CVE 编号;--offline 不会进行任何网络调用。
尚未达到 1.0 版本的软件,且未经独立审计。 不同版本之间的接口可能发生变化。欢迎在 Issues 中提交错误报告和问题。
安装
husk 可在 Linux 和 macOS 上运行。在 Windows 上,请在 WSL 中运行;安装和使用方式与 Linux 完全相同。没有原生 Windows 版本。
下载最新的签名版本,验证其校验和,然后安装:
curl -fsSL https://husk-security.dev/install.sh | sh
它会安装到 ~/.local/bin,可通过 HUSK_INSTALL_DIR 或 --install-dir 更改。如果该目录尚未加入 PATH,安装程序会在将其添加到 Shell 启动文件之前征求同意,并明确指出要修改的文件。如果你拒绝,或在没有终端的情况下运行,安装程序会输出添加该目录所需的一条命令。使用 --no-modify-path 则完全不会写入启动文件。
不想将内容通过管道传给 Shell?请下载 install.sh,阅读后再运行。每个版本都经过 cosign 签名并附有 SLSA 证明;安装程序会验证 SHA-256 校验和(如果 cosign 已加入 PATH,还会验证签名)。请参阅验证版本。
其他安装来源
来源 命令 cargo cargo install husk-seccargo-binstall cargo binstall husk-secnpm npm install -g husk-sec
Nix
无需安装即可运行:
nix run github:husk-security/husk -- scan此 flake 提供两个软件包:
husk(默认版本,包含 localhost Web 界面)和husk-tui(相同的二进制文件,但不包含该界面,因此无需 Node 工具链)。如需长期使用,请将此 flake 添加为输入,并将软件包加入配置。NixOS:
{ inputs.husk.url = "github:husk-security/husk"; inputs.husk.inputs.nixpkgs.follows = "nixpkgs"; outputs = { nixpkgs, husk, ... }: { nixosConfigurations.myhost = nixpkgs.lib.nixosSystem { system = "x86_64-linux"; modules = [ { environment.systemPackages = [ husk.packages.x86_64-linux.husk ]; } ]; }; }; }Home Manager 使用相同的输入:
home.packages = [ husk.packages.x86_64-linux.husk ];如果你更愿意通过命令直接将其加入
PATH,而不是在配置中声明,也可以使用nix profile install github:husk-security/husk。
快速入门
husk # print help (no subcommand does nothing else)
husk scan # one-shot scan of the current directory, plain terminal summary
husk web # serve the local web UI and open it in your browser
husk tui # browse the latest scan in the terminal UI
不带子命令运行 husk 会显示帮助并退出,与 git 或 cargo 一样。入口命令包括 husk scan(扫描并输出报告)、husk web(在浏览器中打开本地 Web 界面)和 husk tui(终端界面)。
用法
以下是一些日常实际会运行的命令。完整列表(每个子命令和标志)请参阅命令参考。
扫描目录并打印发现报告:
$ husk scan --offline .
packages: 286 findings: 36 critical: 5 high: 16 medium: 15 low: 0 info: 0
critical risky-agent-config AI agent is allowed unrestricted shell access
.claude/settings.local.json:4
high lifecycle-script Dangerous npm postinstall script
package.json:6
high risky-agent-config MCP config contains hardcoded secret
.mcp.json:7
...
审查单个软件包,然后再安装(实时查询 OSV.dev):
$ husk check [email protected]
!! vulnerable npm [email protected]
advisory GHSA-35jh-r3h4-6jhm via OSV.dev
Command Injection in lodash
Install a fixed version instead, or avoid the dependency until one is available.
版本可以使用 @version 后缀(按最后一个 @ 拆分,因此
@scope/[email protected] 可用),也可以作为单独参数:husk check npm lodash 4.17.20。
仅使用软件包名称(husk check lodash)时,默认使用 npm,且只检查恶意软件公告。
使用指南中跟踪的 Safe Chain 任务,保护常规安装和锁文件安装。Husk 推荐使用免费的、采用 MIT 许可的第三方工具,而不是提供较弱的软件包管理器包装器:
提交项目策略(阻止/允许软件包、隐藏已分诊的发现、设置 CI 阈值);.husk/ 目录应提交到版本库:
$ husk init
Created ./.husk/policy.toml
`husk scan` and `husk ci` in this project now read this policy.
$ husk approve npm:lodash # allow a package; recorded in policy + ledger
规划安全修复(默认试运行;--apply 会写入修复,并创建备份):
husk fix # show the plan, change nothing
husk fix --apply # write the auto-safe fixes
在 CI 中设置构建门禁,JSON 输出到 stdout,达到或超过阈值时返回非零退出码:
husk ci # exit 1 on high+ findings (see JSON output below)
环境变量
husk 会读取几个环境变量:
| 变量 | 作用 |
|---|---|
HUSK_HOME | 状态目录(账本、守护进程状态、凭据);默认值为 ~/.husk。 |
HUSK_CACHE_DIR | 缓存目录(报告、扫描索引);默认值为 ~/.cache/husk。 |
HUSK_PAGER、PAGER | 长报告使用的分页器(默认值为 less);值为空或为 cat 时会禁用分页。 |
NO_COLOR | 禁用 CLI 输出中的 ANSI 颜色。 |
HUSK_TOKEN | 云端命令的 Bearer 令牌覆盖值(用于 CI 或临时操作)。 |
命令参考
一个二进制文件,包含许多子命令。运行 husk <command> --help 可查看任一子命令的完整标志列表。
husk scan:立即扫描并打印发现报告husk status:打印上次扫描的报告,不重新扫描husk tui:在最新扫描结果上打开交互式终端 UIhusk web:在最新扫描结果上提供本地 Web UIhusk check:查询单个软件包的恶意软件/漏洞判定结果husk ci:扫描并设置构建门禁;达到或超过阈值时退出码为 1husk fix:根据最新扫描结果规划修复;使用 --apply 写入修复husk init:创建并提交.husk/policy.toml项目策略husk approve:在策略中记录允许/阻止/隐藏决定husk policy:显示当前项目策略及其计数husk ledger:显示或验证个人信任账本husk daemon:按间隔扫描;报告自上次运行以来的新发现husk login:登录 husk 账户(即将推出)husk logout:删除此计算机上存储的凭据husk account:显示已登录账户和设备关联信息husk sync:上传上次扫描的软件包清单,以接收追溯警报husk alerts:列出此账户的追溯警报husk telemetry:管理匿名遥测数据的自愿加入(默认关闭)husk feedback:向 husk 开发者发送反馈husk mcp:运行 MCP 服务,或将其注册到 AI Agent
JSON 输出
多个命令会以 JSON 格式输出完整扫描报告:husk scan --json、
husk status --json、husk tui --json 和 husk ci(始终输出 JSON)。所有命令的
报告结构都相同;本地缓存存储的就是这份报告,所有 UI 也都会渲染它。报告以纯 JSON 格式输出到 stdout:不会分页或着色,可安全地直接传给
jq。
| 字段 | 类型 | 含义 |
|---|---|---|
api_version | number | 报告结构版本(当前为 4)。结构变更时会递增;深入解析前请先检查此字段。 |
generated_at | string (RFC 3339) | 扫描完成的时间。UI 会将超过 24 小时的报告视为过期。 |
roots | string[] | 已扫描的目录。 |
context | object | 系统上下文:用户、操作系统/架构、发行版、内核、git 身份、检测到的包管理器和开发配置。 |
packages | object[] | 包清单:每个发现的坐标对应 {ecosystem, name, version, manifest_path, line}。 |
projects | object[] | 发现的项目(关注单元);问题会通过 Finding.project_id 关联到这些项目。 |
summary | object | 安全概览(UI 使用的计数和摘要信息)。 |
findings | object[] | 未处理的问题。每项包含 id、title、severity(critical/high/medium/low/info)、category、source、path、line、summary、evidence(已预先脱敏)、recommendation、references、cves,以及可选的 package、project_id、rule_id、confidence、priority、exploit(CISA KEV / EPSS)和 fixed_version。 |
ignored | object[] | 因项目策略或台账决策而被静默的问题,不计入 findings、统计数据和评分。 |
controls | object[] | 已注册指南控件的结果:状态、本地证据和相关问题 ID。 |
remediations | object[] | 由控件提供的类型化修复提案;包含执行类别、严重程度、操作和相关问题 ID。 |
guidance | object | 已评估的 Markdown 指南:基线/建议条目、扫描优先级、审核决策和处理百分比。 |
providers | object[] | 每个情报源的信息:{name, ok, checked_packages, findings, message}。ok: false 表示覆盖不完整。 |
benchmarks | object[] | 各阶段耗时:{stage, elapsed_ms, files_checked, bytes_scanned, packages_checked, findings, workers, detail}。 |
stats | object | 总计:{packages, findings, critical, high, medium, low, info}。 |
delta | object? | 与此前对相同根目录进行的缓存扫描相比的变化:{previous_at, previous_score, score, new_count, unchanged_count, resolved_count, resolved}。首次扫描时不存在此字段。 |
husk scan --json | jq -r '.findings[].id' # every finding id, worst first
test "$(husk status --json | jq .stats.critical)" -eq 0 # fail a script on any critical
husk ci | jq '.providers[] | select(.ok | not)' # which intel sources had problems
工作原理
- 本地优先。 扫描会读取文件并进行静态解析;husk 绝不会执行所扫描的内容。结果和状态都保留在你的机器上;在线扫描只会向公共安全公告数据库发送包坐标和 CVE ID。
- 包覆盖范围广。 通过可插拔注册表发现包,涵盖约 68 个包生态系统(语言管理器、操作系统/发行版数据库、AI/Agent/编辑器相关内容、CI/IaC/容器,以及 CycloneDX/SPDX SBOM),参见
src/scan/targets/。 - 考虑漏洞利用情况。 CISA KEV 和 FIRST EPSS 增强信息会将正遭利用的 CVE 排在前面,而不是倾倒一份不加区分的 CVE 列表。
- 状态持续积累。 提交到仓库的
.husk/policy.toml(阻止/允许、抑制、CI 阈值)会随仓库一起传递;个人哈希链信任台账~/.husk/ledger.jsonl会记录每次approve。两者都保存在本地、可供检查,也可删除。 - 专为 Agent 打造。
husk mcp会通过 stdio 提供 Model Context Protocol 服务,让 AI Agent 读取问题并触发限定范围的扫描;husk mcp install <agent>会写入配置。该服务已列入 Model Context Protocol Registry,名称为mcp-name: io.github.husk-security/husk。面向 Agent 的详细信息见 AGENTS.md 和integrations/。
从源代码构建
Cargo 和 Rust 1.95 或更高版本即可。
git clone https://github.com/husk-security/husk
cd husk
cargo build --release --no-default-features
./target/release/husk scan /path/to/your/project
localhost web UI 是 web/ 中的 Vite + React 应用,二进制会在默认的 web Cargo 功能下通过 rust-embed 将其嵌入。有两种构建方式,任选其一:
-
完整构建(默认功能)。 先构建前端,再编译。这是唯一需要 Node 的方式:
npm --prefix web ci npm --prefix web run build # → web/dist cargo build --release # rust-embed embeds web/dist -
仅 CLI/TUI(无需 Node)。 完全移除 web UI;无需预先构建:
cargo build --release --no-default-features
web/dist 是生成的产物,已加入 gitignore。若未先构建前端就直接运行 cargo build,会失败并给出清晰提示,指引你选择上述两种方式之一,因为 web 功能要求 web/dist 存在。
如果你已经在使用 Nix,flake 会固定使用相同的工具链:运行 nix develop 即可进入包含该工具链的 shell;运行 nix build .#husk(包含 web UI)或 nix build .#husk-tui(无需 Node)即可直接构建二进制。这些都不是必需的。
开发者文档(模块布局、三个可插拔注册表,以及如何添加扫描器)见 AGENTS.md。
隐私与信任:husk 会读取什么、哪些内容绝不会离开你的计算机,以及如何对发布版本签名
husk 是一款安全工具,因此对自身的要求高于它所扫描的对象。以下每项声明都由本仓库中的代码或 CI 保证。
husk 会读取什么。 清单和锁文件、包管理器数据库、点文件和配置文件、git hook 文件、CI 工作流文件、MCP/Agent 配置,以及文本文件(用于检测机密信息模式)。扫描严格只读。husk 只会写入自身状态(~/.husk/ 下的账本、守护进程状态和云配置)以及缓存目录;这些都是你随时可以检查和删除的普通文件。
husk 绝不会做什么。
- 绝不执行扫描到的内容。 不会运行包管理器、安装脚本、git hook、编辑器扩展、MCP 服务或仓库代码;检测仅通过静态解析完成。唯一需要在每次调用时选择启用的例外是
husk fix --apply --deps,它会运行你的包管理器的版本固定命令,并事先向你展示该命令。 - 绝不上传你的文件。 在线扫描期间,husk 只会向公共公告数据库(OSV.dev、npm、PyPI、
GitHub、CISA KEV / FIRST EPSS)发送包名、版本和 CVE ID,绝不发送文件内容、路径或机密信息。
husk scan --offline不会发起任何网络请求。 - 默认绝不向外联络。 无需账户,也没有登录限制;只有在运行
husk telemetry on后才会启用遥测,并且会遵守DO_NOT_TRACK和HUSK_TELEMETRY_DISABLED紧急停用开关。所有云功能都需要主动选择启用,在使用前均处于未激活状态。 - 绝不在输出中包含机密信息。 机密信息发现项会附带简短且已预先脱敏的摘录,而非匹配到的凭据。
可验证的属性。
| 声明 | 验证方式 |
|---|---|
100% 使用安全 Rust(#![forbid(unsafe_code)]) | grep -rn "forbid(unsafe_code)" src/lib.rs src/main.rs |
不存在专有信任路径:每个判定都来自通过 TLS 查询的公共来源;扫描 / husk check 路径中没有由 husk 筛选的 feed 或签名根 | src/providers.rs、src/check.rs |
| 发布版本已签名(无密钥 cosign + SLSA 来源证明,由 CI 从标签构建) | 验证发布版本 |
| 依赖经过供应链检查(cargo-deny / cargo-machete / Dependabot / Scorecard) | ci.yml、scorecard.yml |
| 每个第三方 GitHub Action 都固定到完整的提交 SHA(husk 会标记未固定的 Action) | grep -rn "uses:" .github/workflows/ |
| 修复结果确定:修复应用路径中不使用 LLM | src/remediation/ |
husk 本身的漏洞应通过 SECURITY.md 中的私密渠道报告,而非提交公开问题。
验证发布版本
发布版本验证详情
每个发布归档都附带 SHA-256 校验和、cosign 无密钥签名(Sigstore Fulcio + Rekor 透明日志,无需担心长期密钥被盗),以及 SLSA 构建来源证明证明;这些内容均由 CI 基于带标签的提交生成。install.sh 会自动验证校验和(如果存在 cosign,也会验证签名)。手动验证:
VERSION="v0.0.1"
TARGET="x86_64-unknown-linux-gnu" # or aarch64-apple-darwin, etc.
ARCHIVE="husk-${VERSION}-${TARGET}.tar.gz"
# 1. Checksum
sha256sum -c "${ARCHIVE}.sha256" # macOS: shasum -a 256 -c ...
# 2. cosign signature: pin the workflow identity and the OIDC issuer
cosign verify-blob \
--bundle "${ARCHIVE}.sigstore.json" \
--certificate-identity-regexp "^https://github.com/husk-security/husk/\.github/workflows/release\.yml@refs/tags/v" \
--certificate-oidc-issuer "https://token.actions.githubusercontent.com" \
"${ARCHIVE}"
# 3. SLSA provenance
gh attestation verify "${ARCHIVE}" --repo husk-security/husk
运行成功时会显示 Verified OK。如果身份或签发者不匹配,签名就会被拒绝;这正是预期效果。具体发布流程见 .github/workflows/release.yml。发布要求:在可从 main 访问的提交上创建稳定的 vX.Y.Z 标签;Cargo.toml 和 flake.nix 中的版本必须匹配;原始工作流运行及任何重新运行都必须由明确获准的人员发起。工作流不依赖标签保护规则:它会在发布前立即重新检查远程标签的当前状态及其是否属于 main 的祖先。未经授权的标签可以触发运行,但无法进入签名任务。
支持与许可
- 构建与开发:请参阅上文的从源代码构建和 AGENTS.md。新增检测功能时,请同时提供测试样例和测试。
- 贡献:请参阅 CONTRIBUTING.md,了解构建和拉取请求流程。
- 获取帮助:使用问题、解读检测结果方面的帮助、具体 Bug 和功能请求,均可提交至 Issues。
- 安全:请按照 SECURITY.md 中的说明,通过私密渠道报告 husk 本身的漏洞。切勿为此提交公开问题。
- 许可证:MIT。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。