
Laboratorio isolato di regressione e controllo di sicurezza per CVE-2026-59891 in @sigstore/oci
Progetto di laboratorio isolato e di audit in sola lettura che confronta la versione realmente vulnerabile e quella corretta di @sigstore/oci con lo stesso input e verifica le condizioni di esposizione per ambiente.
Il CVE Reporter di questo progetto è gyubin02.
Riepilogo per assunzioni e colloqui: Caso di automazione della gestione della vulnerabilità CVE-2026-59891
Il cuore di CVE-2026-59891 è la confusione di hostname che si verifica quando vengono selezionate le credenziali del Registry.
0.7.0: può selezionare le credenziali di ghcr.io per il solo fatto che cr.io è contenuta nella stringa ghcr.io.0.7.1: dopo aver normalizzato l'hostname, seleziona solo le credenziali che corrispondono esattamente.Questo repository verifica automaticamente due scenari di selezione delle credenziali.
ghcr.io, ma la destinazione è cr.iocr.io che corrispondono esattamente alla destinazioneLa versione vulnerabile deve selezionare erroneamente le credenziali nel primo scenario, mentre la versione corretta deve rifiutarle. Entrambe le versioni devono invece superare con successo il secondo scenario normale.
È stato inoltre aggiunto un confronto dinamico che utilizza un mock Registry usa-e-getta su 127.0.0.1 invece di un Registry esterno reale. La versione vulnerabile 0.7.0 effettua 2 richieste in locale e, dopo la sfida di autenticazione, nella seconda richiesta viene osservato un header Authorization sintetico. La versione corretta 0.7.1 viene rifiutata in fase di selezione delle credenziali e le richieste sono 0. Nel risultato restano solo l'osservazione e il numero di richieste, non il valore dell'header.
cve-2026-59891-audit legge solo i metadati di package-lock.json del progetto target e del Docker config specificato esplicitamente, distinguendo quanto segue.
@sigstore/oci interessateEsecuzione immediata con fixture sintetiche:
npm run audit:demo
Verifica di un altro progetto Node.js:
npm run audit:project -- \
--project ../target-project \
--docker-config ../review-copy/config.json \
--image cr.io/example/demo \
--destination-trust unknown \
--format markdown \
--output reports/cve-2026-59891.md
--destination-trust deve essere specificato con uno dei seguenti valori.
trusted: conferma che la destinazione è limitata dal codice e da una allowlistuntrusted: input esterni o input del workflow influenzano la destinazioneunknown: non ancora verificatoIl verdetto si divide in exposure_conditions_met, potential_exposure, affected_component_only, not_detected e indeterminate. Anche not_detected è solo il risultato relativo all'ambito di input registrato e non significa “sicuro” né “conforme alle normative”.
~/.docker/config.json reale.HOME dedicata e isolata e credenziali senza valore lab-user / LAB_ONLY_FAKE_TOKEN.HOME, il marcatore del lab e i valori fittizi sono tutti corretti.fetch.127.0.0.1 assegnata esattamente dal sistema operativo. HTTP esterno o su altre porte, resolver DNS, TLS, UDP, fetch globale e WebSocket sono bloccati.--docker-config e non deduce il file da HOME o DOCKER_CONFIG.Poiché il pacchetto vulnerabile viene installato intenzionalmente, la pubblicazione del pacchetto npm è bloccata tramite "private": true. Non deve essere usato come dipendenza di codice di produzione. Per questo motivo, la segnalazione di 0.7.0 da parte di npm audit è un risultato atteso; ambito e motivazione dell'eccezione sono documentati in SECURITY.md.
Requisiti: Node.js 22.22.2+, 24.15.0+ o 26 e successive. La versione consigliata è fissata in .nvmrc.
npm ci --ignore-scripts
npm test
npm run demo
npm run dynamic:demo
npm run audit:fixture
npm run audit:demo
npm run evidence
Risultati principali attesi di npm run demo:
0.7.0 collision credential-selected
0.7.1 collision credential-rejected
0.7.0 exact credential-selected
0.7.1 exact credential-selected
Regression result: PASS
Risultati principali attesi di npm run dynamic:demo:
{
"vulnerable": {
"packageVersion": "0.7.0",
"credentialSelection": "credential-selected",
"requestCount": 2,
"authorizationObserved": true,
"digestVerified": true,
"networkPolicy": "exact-loopback-only"
},
"fixed": {
"packageVersion": "0.7.1",
"credentialSelection": "credential-rejected",
"requestCount": 0,
"authorizationObserved": false,
"digestVerified": false,
"networkPolicy": "exact-loopback-only"
},
"regressionResult": "PASS"
}
I test automatizzati sono in tutto 34. npm run evidence genera in totale 7 file: 6 artefatti da esaminare più SHA256SUMS, che ne verifica l'integrità.
Questo progetto è una valutazione di controllo limitata e a scopo didattico. I risultati loopback dimostrano solo le differenze di comportamento in un ambiente sintetico e non dimostrano l'esposizione o la compromissione di credenziali, né l'efficacia dei controlli in un ambiente aziendale reale. Non implica una qualifica CISA, una certificazione ISMS-P o la conformità normativa di una specifica organizzazione. Il Node API guard è un livello di difesa per i percorsi di esecuzione osservati delle dependency bloccate, non un network namespace o un firewall a livello di sistema operativo.
La documentazione dettagliata su ambito, test, rischi e controlli è disponibile in docs/; npm run evidence genera prove di esecuzione riproducibili e un manifest SHA-256.
npm-shrinkwrap.json con priorità maggiore, fallisce senza affermare che sia sicuro.