
Изолированная лаборатория регрессионного тестирования и контроля безопасности для CVE-2026-59891 в @sigstore/oci
Изолированная лаборатория и аудит в режиме «только чтение» для сравнения реально уязвимой и исправленной версий @sigstore/oci с одинаковыми входными данными, а также для проверки условий эксплуатации в различных окружениях.
CVE Reporter этого проекта — gyubin02.
Краткое описание для найма и собеседований: Пример автоматизации управления уязвимостью CVE-2026-59891
Суть CVE-2026-59891 — путаница с hostname при выборе учётных данных Registry.
0.7.0: из-за того, что cr.io содержится в строке ghcr.io, могут быть выбраны учётные данные ghcr.io.0.7.1: после нормализации hostname выбираются только точно совпадающие учётные данные.Этот репозиторий сначала автоматически проверяет два сценария выбора учётных данных.
ghcr.io, а целевой хост — cr.iocr.io, точно совпадающие с целевым хостомУязвимая версия должна ошибочно выбрать учётные данные в первом сценарии, а исправленная — отклонить их. Обе версии должны успешно пройти второй, штатный сценарий.
Дополнительно добавлено динамическое сравнение с использованием одноразового mock Registry на 127.0.0.1 вместо реального внешнего Registry. Уязвимая версия 0.7.0 выполняет 2 локальных запроса, и во втором запросе после authentication challenge наблюдается синтезированный заголовок Authorization. Исправленная версия 0.7.1 отклоняет запрос на этапе выбора учётных данных, поэтому количество запросов равно 0. В результатах остаются только факт наблюдения и количество запросов, а не значения заголовков.
cve-2026-59891-audit читает только metadata файла package-lock.json целевого проекта и явно указанного Docker config и различает следующее:
@sigstore/ociЗапуск на синтетическом фикстуре:
npm run audit:demo
Проверка другого 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 нужно обязательно указать одно из следующих значений:
trusted: подтверждено, что destination ограничен кодом и allowlistuntrusted: внешние входные данные или входные данные workflow влияют на destinationunknown: пока не подтвержденоВердикт делится на exposure_conditions_met, potential_exposure, affected_component_only, not_detected и indeterminate. not_detected — это результат только для зафиксированного диапазона входных данных и не означает «безопасно» или «соответствие требованиям».
~/.docker/config.json.HOME и ничего не значащие lab-user / LAB_ONLY_FAKE_TOKEN.HOME, лабораторной метки и фейкового значения.fetch как tripwire.127.0.0.1, назначенному ОС. Внешние HTTP и HTTP на других портах, DNS resolver, TLS, UDP, глобальные fetch и WebSocket блокируются.--docker-config и не выводит файлы из HOME или DOCKER_CONFIG.Поскольку уязвимый пакет устанавливается намеренно, публикация npm-пакета запрещена через "private": true. Его нельзя использовать как зависимость продуктового кода.
По этой причине сообщение npm audit о версии 0.7.0 — ожидаемый результат; границы и причины исключения задокументированы в SECURITY.md.
Требования: Node.js 22.22.2+, 24.15.0+ или 26 и выше. Рекомендуемая версия зафиксирована в .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
Ключевые ожидаемые результаты 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
Ключевые ожидаемые результаты 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"
}
Всего автоматизированных тестов — 34. npm run evidence создаёт в сумме 7 файлов: 6 проверяемых артефактов и SHA256SUMS, подтверждающий их целостность.
Этот проект — ограниченная контролируемая оценка в учебных целях. Результаты loopback демонстрируют только разницу в поведении в синтетическом окружении и не подтверждают экспозицию учётных данных, компрометацию или эффективность контроля в реальной корпоративной среде. Они не означают сертификацию CISA, ISMS-P или соответствие требованиям какой-либо конкретной организации. Node API guard — это защитный слой для наблюдаемых путей выполнения заблокированных зависимостей, а не network namespace или межсетевой экран на уровне ОС.
Подробные документы об области применения, тестах, рисках и контролях находятся в docs/, а npm run evidence создаёт воспроизводимые артефакты выполнения и SHA-256 manifest.
npm-shrinkwrap.json работа завершается с ошибкой, а не объявляет результат безопасным.