Repository navigation
fix(audit-deps): severidad de origen, dedupe de conteos y estado INCOMPLETE explicito - #5
javier20dev25 wants to merge 4 commits into
Conversation
…COMPLETE status
- OSV /querybatch returns only advisory stubs (id+modified); hydrate each
unique advisory via /v1/vulns/{id} so published severity and fixed versions
are actually available. Previously parseFloat(vector)=NaN defaulted every
finding to MEDIUM.
- Add source severity extraction (database_specific.severity, else CVSS v3.x
vector score) and record provenance; never fabricate a level (UNKNOWN).
- Separate counts: instances vs package@version x advisory vs unique advisories;
severity distributions computed over unique advisories.
- Emit explicit INCOMPLETE (unsupported pnpm/Yarn Berry, missing lockfile,
0-dependency parse) with coverageReason; exit 2 under --ci instead of a
misleading clean result.
- Wire through CLI and MCP; add tests for vector parsing, source severity and
dedupe counters.
…hed @sentinel/cli The audit job failed on every PR with npm 404 because it ran pm install -g @sentinel/cli@latest, but no such package exists (the repo package is sntnl-cli). The installed binary is also sntnl, not sentinel. Build and install the CLI from the checked-out repository so the PR is audited with the branch's own code, and invoke the correct sntnl binary.
🟢 Sentinel PR Audit — ApprovedAction: SAFE TO PROCEED — No security threats detected.
🔵 LOW (2)
|
Parse pnpm-lock.yaml (lockfileVersion 5/6/9, importers/packages/snapshots) and Yarn Berry yarn.lock (__metadata) into the unified LockfileEntry shape so audit-deps can analyze them instead of emitting INCOMPLETE. Keep the INCOMPLETE contract for truly unparseable files.
🟢 Sentinel PR Audit — ApprovedAction: SAFE TO PROCEED — No security threats detected.
🔵 LOW (2)
|
🟢 Sentinel PR Audit — ApprovedAction: SAFE TO PROCEED — No security threats detected.
🔵 LOW (2)
|
Problema
sentinel audit-depsreportaba todos los hallazgos de dependencias comoMEDIUM, independientemente de la severidad publicada por OSV/GHSA.Causa raíz (dos bugs encadenados)
OSVIntegrator.queryBatchusaPOST /v1/querybatch, que devuelve solo stubs (id+modified), sinseverity,database_specificniaffected. Nunca se traía la severidad real.getMaxSeverityhacíaparseFloat(s.score)sobre un vector CVSS ("CVSS:3.1/AV:N/...") →NaN→null→ el caller aplicaba el default'MEDIUM'.Evidencia (lockfile controlado, 2 paquetes): antes →
19 findings, todos MEDIUM; las fuentes publican HIGH / MODERATE / LOW.Cambios
GET /v1/vulns/{id}(dedupe por ID, concurrencia 8). Ahora hay severidad,affectedyfixed.sourceSeverity): dedatabase_specific.severity; si falta, del vector CVSS v3.0/3.1 (score local); si es v4.0 se registra el vector pero quedaUNKNOWN(no se inventa). Se guardasourceSeveritySource(procedencia) ysentinelSeverity(severityMapping).UNKNOWN, jamásMEDIUM.instances(ocurrencias crudas) vspkgVersionGhsa(únicopaquete@versión:aviso) vsuniqueGhsa(avisos únicos). Las distribuciones de severidad se calculan sobre avisos únicos.INCOMPLETE: pnpm / Yarn Berry / sin lockfile / parse de 0 deps →status: "INCOMPLETE"+coverageReason, y exit 2 bajo--ci(antes:exit 0silencioso, indistinguible de “limpio”).fixedVersionssale de cada advisory, no de una versión asumida por paquete.Verificación
tsc --noEmitlimpio.vitest: 35/35 ensupply_chain_a2.test.ts(nuevos tests: parseo de vector, severidad de origen, dedupe). Suite completa: 1363 pasan; 2 fallos preexistentes y ajenos (src/core/network/captureBuildIdentity, timeout 30s).HIGH 10 / MEDIUM 6 / LOW 3, con CVEs yfixedVersionscorrectos.--ci --jsonconpnpm-lock.yamly Yarn Berry →status: INCOMPLETE,exit 2.Gates cubiertos
KNOWN_SAFEINCOMPLETEexplícitofindings[]confixedVersionsUNKNOWN+sourceSeveritySourceuniqueGhsavsinstancesINCOMPLETE+ exit 2Pendiente (fuera de este PR)
Parsers nativos de
pnpm-lock.yamly Yarn Berry (hoyINCOMPLETE); y re-medir el benchmark con casos controlados antes de calcular precisión/cobertura.