Перейти к содержимому

Supply Chain Security

Атаки на цепочку поставок (event-stream 2018, ua-parser-js 2021, node-ipc 2022, xz-utils 2024) нанесли ущерб миллионам проектов; TechLead обязан выстроить процессы верификации зависимостей, а вопросы о npm audit, lockfile и SRI встречаются в security-собеседованиях всё чаще.

// Аудит зависимостей и управление версиями
// npm audit: проверка зависимостей против базы CVE
// $ npm audit — показать все уязвимости
// $ npm audit --audit-level=high — fail CI при high/critical
// $ npm audit fix — автоматическое исправление (minor/patch)
// $ npm audit fix --force — включает major updates (может сломать API)
// Lockfile: ВСЕГДА коммитить package-lock.json / yarn.lock / pnpm-lock.yaml
// Без lockfile: npm install на CI может поставить другую версию → непредсказуемость
// npm ci vs npm install:
// npm ci: строго по lockfile, удаляет node_modules, fail если lockfile расходится
// npm install: обновляет lockfile → непредсказуемо в CI, не использовать!
// package.json: exact pinning vs ranges
// "lodash": "4.17.21" ← точная версия → предсказуемо, но нет auto-patch
// "lodash": "^4.17.21" ← minor+patch → может поставить уязвимую 4.17.22
// Рекомендация: использовать точные версии + Dependabot для controlled updates
// Subresource Integrity (SRI): верификация CDN-ресурсов
// Браузер вычисляет хэш загруженного ресурса и сравнивает с integrity-атрибутом.
// Если CDN скомпрометирован → другой хэш → ресурс заблокирован.
// Генерация хэша:
// $ openssl dgst -sha384 -binary app.js | openssl base64 -A
// Или online: https://www.srihash.org
// HTML с SRI
const sriExample = `
<script
src="https://cdn.example.com/lib.min.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
crossorigin="anonymous"
></script>
<link
rel="stylesheet"
href="https://cdn.example.com/style.css"
integrity="sha384-abc123..."
crossorigin="anonymous"
/>
`;
// В Node.js: package-lock.json хранит integrity (sha512) для каждого пакета
// "integrity": "sha512-abc...=="
// npm install перепроверяет хэши при каждой установке → защита от tampered registry
// Продвинутые практики Supply Chain Security
// 1. ignore-scripts: отключить postinstall-скрипты (главный вектор атаки)
// .npmrc или npm config:
// ignore-scripts=true
// Осторожно: node-gyp-зависимые пакеты требуют scripts (native modules)
// 2. npm provenance (npm 9.5+): привязка пакета к конкретному CI-билду на GitHub Actions
// $ npm publish --provenance
// Пользователи могут проверить: npm view <pkg> dist.integrity + provenance
// 3. Dependabot / Renovate: автоматические PR на обновление зависимостей
// .github/dependabot.yml:
// version: 2
// updates:
// - package-ecosystem: npm
// directory: /
// schedule: { interval: weekly }
// groups:
// patch-updates: { update-types: ['patch'] } // авто-merge патчей
// open-pull-requests-limit: 10
// 4. SBOM (Software Bill of Materials): инвентаризация для compliance + incident response
// $ npx @cyclonedx/cyclonedx-npm --output-file sbom.cdx.json --output-format JSON
// 5. Поведенческий анализ: Socket.dev / Snyk / OSS Index
// Обнаруживают: network calls в install scripts, obfuscated code,
// typosquatting (lodahs вместо lodash), смену maintainer с подозрительными коммитами,
// новые зависимости добавленные без изменения функциональности (backdoor pattern)

Итог: Supply chain безопасность строится на lockfile + npm audit + SRI + минимизации install-скриптов + автоматическом мониторинге через Dependabot/Socket.