
Laboratório isolado de regressão e controle de segurança para CVE-2026-59891 em @sigstore/oci
Um projeto de laboratório isolado e auditoria somente leitura que compara as versões vulnerável e corrigida reais do @sigstore/oci com a mesma entrada e verifica as condições de exposição por ambiente.
O CVE Reporter deste projeto é o gyubin02.
Resumo para recrutamento/entrevistas: Caso de automação do gerenciamento da vulnerabilidade CVE-2026-59891
O núcleo do CVE-2026-59891 é a confusão de hostname que ocorre ao selecionar as credenciais do Registry.
0.7.0: pode selecionar as credenciais de ghcr.io pelo fato de cr.io estar contido na string ghcr.io.0.7.1: normaliza o hostname e seleciona apenas as credenciais que correspondem exatamente.Este repositório primeiro valida automaticamente dois cenários de seleção de credenciais.
ghcr.io, mas o destino é cr.iocr.io que correspondem exatamente ao destinoA versão vulnerável deve selecionar incorretamente as credenciais no primeiro cenário, e a versão corrigida deve rejeitá-las. Ambas as versões devem ter sucesso no segundo cenário, que é o normal.
Além disso, foi adicionada uma comparação dinâmica que usa um Registry mock descartável em 127.0.0.1 em vez de um Registry externo real. A versão vulnerável 0.7.0 faz 2 solicitações localmente e, após o desafio de autenticação, um header Authorization sintético é observado na segunda solicitação. A versão corrigida 0.7.1 é rejeitada na etapa de seleção de credenciais, resultando em 0 solicitações. Nos resultados, restam apenas a indicação de observação e o número de solicitações, em vez do valor do header.
O cve-2026-59891-audit lê apenas os metadados do package-lock.json do projeto alvo e do Docker config especificado explicitamente, distinguindo o seguinte:
@sigstore/ociExecute diretamente com um fixture sintético:
npm run audit:demo
Para verificar outro projeto 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
O --destination-trust deve ser explicitamente definido como um dos seguintes valores:
trusted: confirma que o destination é restrito por código e allowlistuntrusted: entradas externas ou entradas de workflow afetam o destinationunknown: ainda não foi possível confirmarO veredito é dividido em exposure_conditions_met, potential_exposure, affected_component_only, not_detected e indeterminate. O not_detected também é apenas um resultado para o escopo de entrada registrado; não significa “seguro” nem “conformidade”.
~/.docker/config.json real.HOME dedicado e isolado e o lab-user / LAB_ONLY_FAKE_TOKEN sem valor.HOME, o marcador do laboratório e os valores falsos estão todos corretos.fetch como tripwire.127.0.0.1 atribuída pelo SO são permitidas. HTTP externo ou em outras portas, resolver DNS, TLS, UDP, fetch global e WebSocket são bloqueados.--docker-config e não infere o arquivo a partir de HOME nem de DOCKER_CONFIG.Como o pacote vulnerável é instalado intencionalmente, a publicação do pacote npm foi bloqueada com "private": true. Ele não deve ser usado como dependência em código de produção.
Por isso, o npm audit relatar 0.7.0 é um resultado esperado; o escopo e o motivo da exceção estão documentados no SECURITY.md.
Requisitos: Node.js 22.22.2+, 24.15.0+ ou 26 ou superior. A versão recomendada está fixada no .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
Principais resultados esperados do 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
Principais resultados esperados do 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"
}
São 34 testes automatizados no total. O npm run evidence gera 7 arquivos no total: os 6 artefatos inspecionados mais o SHA256SUMS, que verifica a integridade deles.
Este projeto é uma avaliação controlada limitada, de caráter educacional. Os resultados de loopback demonstram apenas diferenças de comportamento em um ambiente sintético; eles não demonstram exposição ou comprometimento de credenciais nem a eficácia de controles em um ambiente corporativo real. Não significa qualificação CISA, certificação ISMS-P nem conformidade regulatória de qualquer organização específica. O Node API guard é uma camada de defesa para os caminhos de execução observados da dependência bloqueada; não é um network namespace nem um firewall no nível do SO.
A documentação detalhada de escopo, testes, riscos e controles está em docs/, e o npm run evidence gera evidências de execução reproduzíveis e um manifest SHA-256.
npm-shrinkwrap.json com prioridade mais alta, o projeto falha em vez de afirmar que é seguro.