npm v12: safer defaults не отменяют review install-time trust
Авторская схема Virusologia: сигналы, контрольные точки, evidence и критерий ретеста.
Коротко: Отключенные по умолчанию lifecycle scripts, git и remote dependencies резко уменьшают скрытую install-time поверхность. Но каждое исключение теперь должно стать явным trust decision с owner, diff и retest.

Проблема

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.
Первичные материалы

Материал написан Virusologia с нуля как авторская инженерная интерпретация. Факты сверены по первичным публикациям, формулировки и практические выводы не копируют исходные тексты.

Этическая рамка

Материал предназначен для защиты, controlled labs и аудита систем, которыми вы владеете или на проверку которых имеете явное разрешение. Он не содержит эксплуатационных payload-цепочек или инструкций для несанкционированного доступа.