Проблема
Dependency review часто заканчивается проверкой имени, версии и CVE. Но вредоносный или скомпрометированный package может получить выполнение еще во время install через lifecycle script, implicit build, git dependency или remote archive.
npm v12 включает install-time security defaults: scripts становятся opt-in, а git и remote URL dependencies по умолчанию не разрешаются. Это сильный boundary, но он не отвечает автоматически, какие исключения действительно допустимы.
Решение: исключение как change request
Allowlist install script должен иметь owner, конкретный package и version range, объяснение необходимости, review diff, sandbox trace и срок пересмотра. Разрешение git dependency требует immutable commit, а remote archive — отдельной проверки provenance и digest.
Publish pipeline лучше переводить с long-lived token на OIDC trusted publishing. Build выполняется в ephemeral runner, artifact получает provenance, а deployment принимает только ожидаемый digest и identity сборочного workflow.
Что проверить руками
- Найти packages с lifecycle scripts и назначить владельца каждому разрешению.
- Проверить lockfile на git, remote URL, local path и unexpected registry sources.
- Сравнить clean install с пустым cache и обычный CI build по artifact digest.
- Убедиться, что untrusted triggers не имеют write access к shared cache и publish identity.
- Зафиксировать network egress install phase и объяснить каждый внешний destination.
Безопасный пример: минимальный allowlist
Пример демонстрирует reviewable intent. Конкретный список должен формироваться только после проверки dependency в вашей owned build-среде.
{
"name": "owned-application",
"private": true,
"allowScripts": {
"approved-native-module": true
},
"securityPolicy": {
"owner": "platform-security",
"reviewTicket": "SEC-142",
"gitDependencies": "deny",
"remoteDependencies": "deny"
}
}
# Review pending scripts, commit the explicit decision, then retest clean.
npm approve-scripts --allow-scripts-pending
npm ci --ignore-scripts
Типичные ошибки
- Разрешить все scripts после первого сломанного build и считать миграцию завершенной.
- Доверять package name без проверки publisher, provenance и version transition.
- Использовать общий writable cache для untrusted и release workflows.
- Хранить publish token в CI, хотя registry поддерживает trusted publishing.
Evidence и критерий ретеста
- Allowlist связан с owner, review ticket, package digest и sandbox trace.
- Clean runner с пустым cache создает тот же подписанный artifact digest.
- Untrusted workflow не может записать cache или получить publish authority.
- GitHub / npm: install-time security and token changes
- GitHub: read-only Actions cache for untrusted triggers
- GitHub: secure open-source supply chain
Материал написан Virusologia с нуля как авторская инженерная интерпретация. Факты сверены по первичным публикациям, формулировки и практические выводы не копируют исходные тексты.
Материал предназначен для защиты, controlled labs и аудита систем, которыми вы владеете или на проверку которых имеете явное разрешение. Он не содержит эксплуатационных payload-цепочек или инструкций для несанкционированного доступа.