Husk について
Huskは、依存関係、漏えいしたシークレット、インストールスクリプト、AI/MCP設定を調べる、開発者向けのローカル優先セキュリティスキャナーです。CLI、ターミナルとウェブのUI、プロジェクトポリシー、CIゲートにより、チームでローカルに検出結果を確認し対処できます。
主な機能
- 01依存関係と漏えいシークレットのスキャン
- 02危険なスクリプトとエージェント設定の検出
- 03オフラインスキャンとアドバイザリ照会
- 04プロジェクトポリシーと信頼台帳
- 05CIゲートと修正プラン
- 06CLI、TUI、ローカルウェブUI
活用シーン
- 01プロジェクトのセキュリティ検出結果を確認
- 02インストール前にパッケージを検査
- 03検出結果の重大度でCIをゲート
- 04安全な修正を計画しポリシー判断を記録
MCP 対応
`husk mcp`はstdio経由でMCPサーバーを実行し、エージェントが検出結果を読み、範囲を限定したスキャンを開始できるようにします。`husk mcp install`で設定をエージェントに登録できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
10掲載時のツール一覧 · 2 週間前に更新
このツールにパラメーターはありません。
詳細
husk は、侵害されたパッケージ、漏えいしたシークレット、リスクの高いインストールスクリプト、安全でない AI/MCP 設定をマシン上でスキャンし、修正が必要な項目を表示します。ローカルで実行されるため、ログインもアカウントも不要で、ファイルがマシンの外に送信されることはありません。オンラインスキャンで公開アドバイザリーデータベース(OSV.dev、npm、PyPI、GitHub、CISA KEV/FIRST EPSS)に送信されるのは、パッケージ名、バージョン、CVE ID のみです。--offline を指定すると、ネットワーク呼び出しは一切行われません。
独立した監査を受けていない、バージョン 1.0 未満のソフトウェアです。 リリース間でインターフェースが変更されることがあります。不具合の報告や質問は、Issues までお寄せください。
インストール
husk は Linux と macOS で動作します。Windows では WSL 内で実行してください。WSL ではインストールも動作も Linux とまったく同じです。Windows ネイティブ版はありません。
最新の署名付きリリースをダウンロードし、チェックサムを検証してインストールします。
curl -fsSL https://husk-security.dev/install.sh | sh
~/.local/bin にインストールされます。インストール先は HUSK_INSTALL_DIR または
--install-dir で変更できます。このディレクトリがすでに PATH に含まれていない場合、シェルの起動ファイルへの追加を実行前に確認し、変更対象となるファイルの正確な名前を表示します。拒否した場合、またはターミナルなしで実行した場合は、代わりに追加するコマンドが 1 つ表示されます。--no-modify-path を指定すると、起動ファイルへの書き込みは一切行われません。
シェルにパイプするのは避けたいですか? 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 -- scanflake は 2 つのパッケージを公開しています。
husk(デフォルト。localhost のウェブ UI を含みます)と、husk-tui(ウェブ UI を含まない同じバイナリのため、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、ブラウザーで開くローカルのウェブ UI husk web、ターミナル UI の 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 とみなしてマルウェアに関する勧告のみを確認します。
Guide にある追跡対象の 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 を出力し、しきい値以上の場合はゼロ以外の終了コードを返します。
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 | クラウドコマンドで使用するベアラートークンを上書きします(CI または一時的な使用向け)。 |
コマンドリファレンス
1 つのバイナリに、多数のサブコマンドが用意されています。各コマンドのすべてのフラグを確認するには、husk <command> --help を実行してください。
husk scan:今すぐスキャンし、検出結果レポートを表示しますhusk status:再スキャンせずに、前回のスキャンのレポートを表示しますhusk tui:最新のスキャン結果を対話型ターミナル UI で開きますhusk web:最新のスキャン結果をローカルの Web UI で提供しますhusk check:1 つのパッケージのマルウェア/脆弱性に関する判定を照会します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 エージェントに登録します
JSON 出力
複数のコマンドが、スキャンレポート全体を JSON で出力します。husk scan --json、
husk status --json、husk tui --json、および husk ci(常に JSON)です。構造は
どのコマンドでも同じで、ローカルキャッシュに保存され、すべての UI で表示されるレポートです。
標準出力にプレーンな JSON を出力します。ページャーも色付けも使わないため、そのまま
jq に渡しても安全です。
| フィールド | 型 | 意味 |
|---|---|---|
api_version | number | レポート構造のバージョン(現在は 4)。構造が変更されると更新されます。詳細な解析を行う前に確認してください。 |
generated_at | string (RFC 3339) | スキャンが完了した日時です。UI では、24 時間を超えたレポートは古いものと見なされます。 |
roots | string[] | スキャンされたディレクトリです。 |
context | object | システムコンテキストです。ユーザー、OS/アーキテクチャ、ディストリビューション、カーネル、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 のパッケージエコシステム(言語のパッケージマネージャー、OS/ディストリビューションのデータベース、AI/エージェント/エディター関連、CI/IaC/コンテナー、CycloneDX/SPDX SBOM)を網羅しています。詳細は
src/scan/targets/を参照してください。 - エクスプロイトを考慮。 CISA KEV と FIRST EPSS の情報を加味し、区別のない CVE リストを並べるのではなく、実際に悪用されている CVE を上位に表示します。
- 蓄積される状態。 リポジトリにコミットした
.husk/policy.toml(ブロック/許可、抑制、CI のしきい値)はリポジトリとともに引き継がれます。個人用のハッシュチェーン付き信頼台帳~/.husk/ledger.jsonlには、すべてのapproveが記録されます。どちらもローカルに保存され、内容を確認でき、削除できます。 - エージェント向けに設計。
husk mcpは標準入出力経由で Model Context Protocol サーバーを提供し、AI エージェントが検出結果を読み取り、対象を限定したスキャンを実行できるようにします。husk mcp install <agent>は設定を書き込みます。Model Context Protocol Registry にはmcp-name: io.github.husk-security/huskとして登録されています。エージェント向けの詳細は 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 feature のもと、バイナリに(rust-embed を介して)埋め込まれます。ビルド方法は 2 つあります。いずれかを選んでください。
-
フルビルド(デフォルトの feature)。 まずフロントエンドをビルドし、その後コンパイルします。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 feature には web/dist が必要なため、上記の 2 つの方法のいずれかを案内する明確なエラーが表示され、失敗します。
すでに Nix をお使いの場合、flake には同じツールチェーンが固定されています。nix develop でそのツールチェーンを含むシェルを起動でき、nix build .#husk(Web UI を含む)または nix build .#husk-tui(Node 不要)でバイナリを直接ビルドできます。いずれも必須ではありません。
開発者向けドキュメント(モジュール構成、3 つのプラグイン可能なレジストリ、スキャナーの追加方法)は AGENTS.md にあります。
プライバシーと信頼:husk が読み取るもの、お使いのマシンから外に出ないもの、リリースの署名方法
husk はセキュリティツールであるため、スキャン対象よりも高い基準を自らに課しています。以下のすべての主張は、このリポジトリのコードまたは CI によって保証されています。
husk が読み取るもの。 マニフェストとロックファイル、パッケージマネージャーのデータベース、ドットファイルと設定ファイル、git フックファイル、CI ワークフローファイル、MCP/エージェントの設定、テキストファイル(シークレットのパターン検出用)です。スキャンは厳密に読み取り専用です。husk が書き込むのは独自の状態(台帳、デーモンの状態、クラウド設定)を保存する ~/.husk/ とキャッシュディレクトリだけです。いずれも通常のファイルなので、いつでも確認して削除できます。
husk が決して行わないこと。
- スキャン対象を実行しません。 パッケージマネージャー、インストールスクリプト、git フック、エディター拡張機能、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 独自のフィードや署名ルートはありません | src/providers.rs、src/check.rs |
| リリースに署名済み(cosign keyless + SLSA provenance。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自体の脆弱性は、公開のIssueではなく、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と表示されます。IDまたは発行者が一致しない場合、署名は拒否されます。それが目的です。リリースプロセスの詳細は.github/workflows/release.ymlに記載されています。公開には、mainから到達可能なコミットに付けられた安定版のvX.Y.Zタグ、Cargo.tomlとflake.nix内の一致するバージョン、さらに元のワークフロー実行と再実行のそれぞれに対する、明示的に許可された担当者が必要です。このワークフローはタグ保護ルールに依存しません。公開の直前に、リモート上の最新タグとそのmainからの系譜を再確認します。許可されていないタグでも実行を開始できますが、署名ジョブには到達できません。
サポートとライセンス
- ビルドと開発:上記のソースからのビルドとAGENTS.mdをご覧ください。新しい検出機能には、フィクスチャとテストが付属します。
- コントリビューション:ビルドとプルリクエストの手順についてはCONTRIBUTING.mdをご覧ください。
- ヘルプの利用:使い方に関する質問、検出結果の解釈に関する相談、具体的なバグ、機能リクエストは、すべてIssuesで受け付けています。
- セキュリティ:husk自体の脆弱性は、SECURITY.mdに従って非公開で報告してください。公開のIssueは絶対に作成しないでください。
- ライセンス:MIT。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。