
サプライチェーン攻撃、スロップスクワッティング、タイポスクワッティングから依存関係やコードを防御します。
cargo install sloppy-joe
侵害されたリリースは正規のパッケージ名を使用する可能性があります。LiteLLM メンテナーの報告では、2026年3月に悪意のあるバージョン 1.82.7 および 1.82.8 が確認されています。sloppy-joe のデフォルトの公開経過時間 72 時間ゲートは、インストール前に
--ciまたは--fullで解決済みの依存関係グラフをスキャンする際、新しく公開されたバージョンを拒否できます。これはタイミングポリシーであり、悪意のあるペイロードを検査するものではありません。
研究文献は生成コードにおけるパッケージの幻覚を報告しています。sloppy-joe はインストール前に依存関係の名前とメタデータをチェックします。存在するだけでは、登録済みのパッケージが安全であることを証明できません。
パッケージ名は、タイポ分析の作業量を制限するため、npm では 214 バイト、その他のエコシステムでは 1,024 バイトに制限されています。それより長い名前は Scan not supported(終了コード 2)を報告します。
# Install (single static binary, no runtime dependencies)
cargo install sloppy-joe
# Or download a prebuilt binary archive from GitHub Releases
# https://github.com/brennhill/sloppy-joe/releases
# Fast local guardrail — auto-detects ecosystem from manifest files
sloppy-joe check
# Strict online scan (recommended before push / release)
sloppy-joe check --full
# Strict CI-oriented scan
sloppy-joe check --ci
# Check a specific directory
sloppy-joe check --dir ./my-project
# Check only npm dependencies
sloppy-joe check --type npm
# Check the Python runtime plus selected groups/extras
sloppy-joe check --python-groups dev,test --python-version 3.12
sloppy-joe check --python-extras docs --python-platform linux --python-version 3.12
# Enforce canonical rules and org standards via config
sloppy-joe check --config /etc/sloppy-joe/config.json
# Config from a URL (useful in CI — no secrets to manage)
sloppy-joe check --config https://raw.githubusercontent.com/yourorg/security-configs/main/sloppy-joe.json
# JSON output for CI pipelines
sloppy-joe check --json
# Review exact maintainer-change exceptions with evidence
sloppy-joe check --review-exceptions
# Create and register a safe per-repo config outside the repo
sloppy-joe init --register
# Create an ecosystem-specific greenfield starter policy
sloppy-joe init --greenfield --ecosystem npm
# Print review-only bootstrap suggestions for an npm or Cargo repo
sloppy-joe init --from-current
# Or write/register those suggestions safely outside the repo
sloppy-joe init --from-current --register
# Or write a config manually to a secure path outside the repo
sloppy-joe init > /secure/location/sloppy-joe.json
nix profile install github:brennhill/sloppy-joe
main 上の flake は公開済みのバイナリリリースとそのチェックサムを固定します。
スキャンモード:
sloppy-joe check は高速なローカルガードレールを実行します。マニフェストの解析、lockfile/同期、provenance、および未サポートソースポリシーを常に強制します。依存関係やポリシーの状態が変化した場合、または最後に成功したフルスキャンが 24 時間より古い場合、sloppy-joe check --full を推奨します。sloppy-joe check --full は厳格なオンラインスキャンを実行し、記録された成功済みフルスキャン状態を更新します。sloppy-joe check --ci は --full と同じ厳格なカバレッジを、CI 向けの意図で実行します。sloppy-joe check はデフォルトで runtime プロファイルを評価します。スコープ付き依存関係が存在する場合は警告を表示し、CI/ビルドのパリティのために明示的な --python-groups、--python-extras、--python-platform、および/または --python-version フラグを渡すよう促します。sloppy-joe check の出力は、CI および本番ゲーティングには --ci または --full を使用するよう常に促します。終了コード: 0 = 選択したモードでブロッキングな問題が見つからなかった、1 = ブロッキングな検出事項あり、2 = 未サポートのスキャン入力またはランタイムエラー。未サポートの構文/設定はマルウェアの検出結果ではありません。
サポート対象: JavaScript (npm、pnpm、Yarn、Bun)、Python、Rust、Go、Ruby、PHP、JVM (Gradle/Maven)、および .NET — マニフェストファイルから自動検出されます。
エコシステムガイド: 各エコシステムの現在の信頼モデル、サポートされる機能、およびフェイルクローズドの制限については docs/ecosystems/README.md を参照してください。
| エコシステム | 必須マニフェスト | 信頼済み lockfile / プロジェクト状態 |
|---|---|---|
| JavaScript / npm | package.json | package-lock.json または npm-shrinkwrap.json。レガシーな npm v1 はデフォルトでブロック |
| JavaScript / pnpm | package.json | pnpm-lock.yaml |
| JavaScript / Yarn | package.json | yarn.lock |
| JavaScript / Bun | package.json | bun.lock |
| Python | pyproject.toml、requirements*.txt、Pipfile、setup.cfg、または setup.py | 信頼済みの Poetry パスは poetry.lock を使用し、信頼済みの uv パスは uv.lock を使用し、完全にハッシュロックされた pip-tools は、コミットされた requirements グラフが --index-url および任意の --extra-index-url の値を正確に束縛している場合にのみ信頼されます。リポジトリで可視の Python インデックスは trusted_indexes.pypi 経由で許可リストに登録できます。信頼済みの Python モードは一度に 1 つの選択されたインストールプロファイルを評価します (デフォルトは runtime、CLI 経由で明示的な groups/extras/platform/arch/version)。レガシーマニフェストはデフォルトで警告付きで許可 |
| Rust | Cargo.toml | Cargo.lock |
| Go | go.mod | 外部依存関係には go.sum が必須 |
| Ruby | Gemfile | Gemfile.lock |
| PHP / Composer | composer.json | composer.lock |
| JVM / Gradle | build.gradle または build.gradle.kts | gradle.lockfile |
| JVM / Maven | pom.xml | 警告のみ: 信頼済みのプロジェクトローカルな lockfile パスはまだありません |
| .NET / NuGet | .csproj | packages.lock.json |
スキャン範囲: 再帰スキャンはデフォルトで .planning を無視します。他のディレクトリ名を除外するには、外部ポリシーで "ignore_dirs": [".planning", "experiments"] を設定するか、設定可能な除外を無効にするには "ignore_dirs": [] を使用してください。ディレクトリ除外 を参照してください。
複数プロジェクトを含むリポジトリ: Sloppy Joe は検出された各プロジェクトの依存関係チェーンを個別に実行し、結果を統合します。バックエンド、UI、管理アプリ、ツールがそれぞれ異なるマネージャーやロックファイルを使用している場合があります。不完全な祖先の npm/pnpm ワークスペース宣言は、祖先が packageManager を明示的に宣言していない限り、独立してロックされた子を主張しません。Sloppy Joe はその選択を警告として報告します。アクティブなワークスペースは共有ロックファイルのチェックを維持します。人間向けおよび JSON レポートは、各マニフェスト、マネージャー、ロックファイル、パッケージ数、および結果を識別します。マルチプロジェクトスキャンでは、サポートされていないプロジェクトは不完全な結果(終了コード 2)を生成しますが、他の独立してバインドされたプロジェクトは引き続き実行されます。パッケージ数には各プロジェクトのカバレッジが含まれるため、共有依存関係が複数のプロジェクト実行に現れることがあります。
プライベート npm レジストリ(npm および pnpm): プロジェクトローカルの .npmrc のデフォルトおよびスコープ付き HTTPS レジストリルートがサポートされています。カスタムレジストリにルーティングされたパッケージは、人間向けおよび JSON 出力で非ブロッキングの resolution/private-registry-unvetted 警告を生成します。パブリックパッケージ(プライベートパッケージのパブリック依存関係を含む)は通常のチェックを維持します。プライベートパッケージの識別情報はパブリックレジストリや OSV に送信されません。その存在、タイポ類似性、リリース経過時間、パブリッシャー履歴、および脆弱性は未検証のままです。ロックファイルの整合性、整合性メタデータ、および宣言されたレジストリソース境界は引き続き適用されます。スキャナーはレジストリ認証情報を展開したり送信したりすることはありません。詳細は JavaScript ガイド を参照してください。
設定ソース: ローカルファイルパス、HTTPS URL、または SLOPPY_JOE_CONFIG 環境変数。設定はプロジェクトディレクトリから読み取られることはありません(理由については CONFIG.md を参照)。
オンボーディング: リポジトリに合ったブートストラップモードを使用してください:
sloppy-joe init --greenfield --ecosystem <eco> は、新規プロジェクト向けのエコシステム固有のスターターポリシーを出力します。現在、グリーンフィールドプリセットは npm、pypi、および cargo 向けに実装されています。他のエコシステムは「not supported yet」エラーで失敗します。--register を追加すると、リポジトリ外に書き込み、安全に登録します。sloppy-joe init --from-current は現在のリポジトリを検査し、レビュー専用のブートストラップ提案を出力します。現在、--from-current はファーストパーティコードが npm および/または cargo であるリポジトリに対してのみ実装されています。他のエコシステムは「not implemented yet」エラーでフェイルクローズします。--register を追加すると、生成された設定を書き込み、登録します。sloppy-joe init は、中立的な手動テンプレートを出力します。sloppy-joe は、パッケージの存在、名前類似性ヒューリスティクス、正規パッケージポリシー、公開経過時間ゲート、メタデータリスクシグナル、および OSV アドバイザリクエリを 1 つの Rust バイナリに統合します。