mcpField
H
Husk

Husk

本地服务
husk-security.dev安全61 天前更新

关于 Husk

Husk 是面向开发者的本地优先安全扫描器,可检查依赖项、泄露的密钥、安装脚本及 AI/MCP 配置。它提供命令行、终端和网页界面、项目策略及 CI 门禁,帮助团队在本地审查并处理发现项。

主要功能

  1. 01扫描依赖项与泄露密钥
  2. 02检测高风险脚本和 Agent 配置
  3. 03离线扫描与安全公告查询
  4. 04项目策略与信任账本
  5. 05CI 门禁与修复计划
  6. 06命令行、TUI 和本地网页界面

适用场景

  1. 01检查项目中的安全问题
  2. 02安装前检查软件包
  3. 03按问题严重程度设置 CI 门禁
  4. 04规划安全修复并记录策略决定

MCP 相关

`husk mcp` 通过 stdio 运行 MCP 服务,让 Agent 读取发现项并启动范围受限的扫描。`husk mcp install` 可将配置注册到 Agent。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库
安装包
npmhusk-sec0.1.2
cargohusk-sec0.1.2

工具

10

收录的工具列表 · 更新于 2 周前

此工具无需参数。

详细介绍

husk

面向开发者、本地优先的安全扫描器。单个二进制文件,无需账号。

CI License: MIT

安装 · 快速入门 · 用法 · 命令 · 工作原理

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,还会验证签名)。请参阅验证版本。

其他安装来源
来源命令
cargocargo install husk-sec
cargo-binstallcargo binstall husk-sec
npmnpm 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 许可的第三方工具,而不是提供较弱的软件包管理器包装器:

查看 Aikido Safe Chain

提交项目策略(阻止/允许软件包、隐藏已分诊的发现、设置 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:在最新扫描结果上打开交互式终端 UI
  • husk web:在最新扫描结果上提供本地 Web UI
  • husk check:查询单个软件包的恶意软件/漏洞判定结果
  • husk ci:扫描并设置构建门禁;达到或超过阈值时退出码为 1
  • husk 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_versionnumber报告结构版本(当前为 4)。结构变更时会递增;深入解析前请先检查此字段。
generated_atstring (RFC 3339)扫描完成的时间。UI 会将超过 24 小时的报告视为过期。
rootsstring[]已扫描的目录。
contextobject系统上下文:用户、操作系统/架构、发行版、内核、git 身份、检测到的包管理器和开发配置。
packagesobject[]包清单:每个发现的坐标对应 {ecosystem, name, version, manifest_path, line}。
projectsobject[]发现的项目(关注单元);问题会通过 Finding.project_id 关联到这些项目。
summaryobject安全概览(UI 使用的计数和摘要信息)。
findingsobject[]未处理的问题。每项包含 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。
ignoredobject[]因项目策略或台账决策而被静默的问题,不计入 findings、统计数据和评分。
controlsobject[]已注册指南控件的结果:状态、本地证据和相关问题 ID。
remediationsobject[]由控件提供的类型化修复提案;包含执行类别、严重程度、操作和相关问题 ID。
guidanceobject已评估的 Markdown 指南:基线/建议条目、扫描优先级、审核决策和处理百分比。
providersobject[]每个情报源的信息:{name, ok, checked_packages, findings, message}。ok: false 表示覆盖不完整。
benchmarksobject[]各阶段耗时:{stage, elapsed_ms, files_checked, bytes_scanned, packages_checked, findings, workers, detail}。
statsobject总计:{packages, findings, critical, high, medium, low, info}。
deltaobject?与此前对相同根目录进行的缓存扫描相比的变化:{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/
修复结果确定:修复应用路径中不使用 LLMsrc/remediation/
**关于 `tst/`。** `tst/` 包含**有意设置的不安全测试样例**(如 `AKIAIOSFODNN7EXAMPLE` 这样的虚假 AWS 密钥、提示词注入 Markdown、存在漏洞的固定版本),用于确定性地测试 husk 的检测器。根据政策,这些内容都是虚假的,且不会包含在 crates.io 软件包中。如果扫描器在此仓库中将它们标记出来,说明它按预期工作;husk 也是如此。[`tst/README.md`](tst/README.md) 说明了其中的内容及其原因,而 `tst/` 不在 [SECURITY.md](SECURITY.md) 的处理范围内。

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。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。