
Защищает от атак на цепочку поставок, слопсквоттинга и тайпсквоттинга со стороны зависимостей и кода.
cargo install sloppy-joe
Скомпрометированные релизы могут использовать легитимное имя пакета. Отчёт мейнтейнера LiteLLM указывает на вредоносные версии 1.82.7 и 1.82.8 в марте 2026 года. Порог по возрасту публикации по умолчанию в 72 часа в sloppy-joe может отклонить недавно опубликованные версии, когда вы сканируете разрешённый граф зависимостей с помощью
--ciили--fullдо установки. Это временная политика, а не инспекция вредоносной полезной нагрузки.
Исследования документируют галлюцинации пакетов в сгенерированном коде. sloppy-joe проверяет имена и метаданные зависимостей до установки; само по себе существование не может подтвердить, что зарегистрированный пакет безопасен.
Имена пакетов ограничены 214 байтами для npm и 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
Flake на main закрепляет опубликованный бинарный релиз и его контрольные суммы.
Режимы сканирования:
sloppy-joe check запускает быструю локальную проверку. Он всегда обеспечивает разбор манифеста, lockfile/синхронизацию, происхождение и политику неподдерживаемых источников. Если состояние зависимостей или политики изменилось, или последнее успешное полное сканирование старше 24 часов, он рекомендует sloppy-joe check --full.sloppy-joe check --full запускает строгое онлайн-сканирование и обновляет записанное состояние успешного полного сканирования.sloppy-joe check --ci запускает то же строгое покрытие, что и --full, с ориентацией на CI.sloppy-joe check по умолчанию оценивает профиль runtime. Если существуют scoped-зависимости, он предупреждает и предлагает передать явные флаги --python-groups, --python-extras, --python-platform и/или --python-version для соответствия CI/сборке.sloppy-joe check всегда напоминает использовать --ci или --full для CI и production-гейтинга.Коды выхода: 0 = блокирующих проблем в выбранном режиме не найдено, 1 = блокирующие находки, 2 = неподдерживаемый вход сканирования или ошибка выполнения. Неподдерживаемый синтаксис/конфигурация не является находкой вредоносного ПО.
Поддерживается: JavaScript (npm, pnpm, Yarn, Bun), Python, Rust, Go, Ruby, PHP, JVM (Gradle/Maven) и .NET — автоматически определяется по файлам манифестов.
Руководства по экосистемам: см. docs/ecosystems/README.md для текущей модели доверия, поддерживаемых возможностей и fail-closed ограничений для каждой экосистемы.
| Экосистема | Обязательный манифест | Доверенный 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, а полностью hash-locked pip-tools считается доверенным только когда зафиксированный граф requirements привязывает --index-url и любые значения --extra-index-url в точности; видимые в репозитории Python-индексы можно добавить в allowlist через trusted_indexes.pypi; доверенные режимы Python оценивают один выбранный профиль установки за раз (runtime по умолчанию, явные groups/extras/platform/arch/version через CLI); устаревшие манифесты разрешены с предупреждениями по умолчанию |
| 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": [], чтобы отключить настраиваемые исключения. См. исключения каталогов.