
Protege contra ataques de cadena de suministro, slopsquatting y typosquatting provenientes de dependencias y código.
cargo install sloppy-joe
Las versiones comprometidas pueden usar el nombre legítimo de un paquete. El informe del mantenedor de LiteLLM identifica las versiones maliciosas 1.82.7 y 1.82.8 en marzo de 2026. La barrera predeterminada de 72 horas de antigüedad de publicación de sloppy-joe puede rechazar versiones recién publicadas cuando se escanea el grafo de dependencias resuelto con
--cio--fullantes de la instalación. Se trata de una política de temporización, no de una inspección de la carga maliciosa.
La investigación documenta alucinaciones de paquetes en código generado. sloppy-joe verifica los nombres y metadatos de las dependencias antes de la instalación; la mera existencia no puede establecer que un paquete registrado sea seguro.
Los nombres de paquetes están limitados a 214 bytes para npm y 1,024 bytes para otros ecosistemas para acotar el trabajo de análisis de errores tipográficos. Los nombres más largos informan Scan not supported (salida 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
El flake en main fija la versión binaria publicada y sus sumas de verificación.
Modos de escaneo:
sloppy-joe check ejecuta la barrera de protección local rápida. Siempre aplica el análisis del manifiesto, la sincronización del lockfile, la procedencia y la política de fuentes no compatibles. Si el estado de dependencias o de políticas cambió, o si el último escaneo completo exitoso tiene más de 24 horas, recomienda sloppy-joe check --full.sloppy-joe check --full ejecuta el escaneo estricto en línea y actualiza el estado registrado del último escaneo completo exitoso.sloppy-joe check --ci ejecuta la misma cobertura estricta que --full, con un enfoque orientado a CI.sloppy-joe check evalúa el perfil runtime por defecto. Si existen dependencias con alcance definido, advierte y te indica que pases explícitamente las flags --python-groups, --python-extras, --python-platform y/o --python-version para lograr paridad con CI/build.sloppy-joe check siempre te recuerda usar --ci o --full para el control de calidad en CI y producción.Códigos de salida: 0 = no se encontraron problemas bloqueantes en el modo seleccionado, 1 = hallazgos bloqueantes, 2 = entrada de escaneo no compatible o error de ejecución. La sintaxis/configuración no compatible no es un hallazgo de malware.
Compatible con: JavaScript (npm, pnpm, Yarn, Bun), Python, Rust, Go, Ruby, PHP, JVM (Gradle/Maven) y .NET — detectado automáticamente a partir de los archivos de manifiesto.
Guías de ecosistemas: consulta docs/ecosystems/README.md para conocer el modelo de confianza actual, las funciones compatibles y los límites de fallo seguro de cada ecosistema.
| Ecosistema | Manifiesto requerido | Lockfile / estado del proyecto de confianza |
|---|---|---|
| JavaScript / npm | package.json | package-lock.json o npm-shrinkwrap.json; el npm v1 heredado está bloqueado por defecto |
| 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 o setup.py | la ruta de confianza de Poetry usa poetry.lock, la ruta de confianza de uv usa uv.lock, y pip-tools completamente bloqueado por hash es de confianza solo cuando el grafo de requirements confirmado vincula --index-url y cualquier valor de --extra-index-url exactamente; los índices de Python visibles en el repositorio se pueden incluir en la lista de permitidos mediante trusted_indexes.pypi; los modos de Python de confianza evalúan un perfil de instalación seleccionado a la vez (runtime por defecto, grupos/extras/plataforma/arquitectura/versión explícitos mediante CLI); los manifiestos heredados se permiten con advertencias por defecto |
| Rust | Cargo.toml | Cargo.lock |
| Go | go.mod | go.sum requerido para dependencias externas |
| Ruby | Gemfile | Gemfile.lock |
| PHP / Composer | composer.json | composer.lock |
| JVM / Gradle | build.gradle o build.gradle.kts | gradle.lockfile |
| JVM / Maven | pom.xml | solo advertencia: aún no existe una ruta de lockfile local del proyecto de confianza |
| .NET / NuGet | .csproj | packages.lock.json |
Alcance del escaneo: los escaneos recursivos ignoran .planning por defecto. Configura "ignore_dirs": [".planning", "experiments"] en la política externa para excluir otros nombres de directorio, o usa "ignore_dirs": [] para deshabilitar las exclusiones configurables. Consulta exclusiones de directorios.