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

Безопасность зависимостей

Компрометация одной зависимости означает компрометацию проекта. Supply chain атаки — один из основных векторов угроз (пример).

Правила

MUST

  • Lock-файлы (pnpm-lock.yaml, yarn.lock, package-lock.json) обязательны и должны быть в git-репозитории
  • В CI/CD использовать npm ci / yarn --frozen-lockfile / pnpm --frozen-lockfile
  • Установка пакетов с --ignore-scripts по умолчанию
  • Если пакету необходимы install-скрипты — разрешать явно только для проверенных пакетов
  • Регулярный аудит через npm audit (или аналоги)
  • Автоматические проверки уязвимостей в CI/CD
  • Code Review должен включать проверку изменений в lock-файле

SHOULD

  • Проверять новые пакеты перед добавлением (активность, размер, лицензия)

Lock-файлы

# ✅ MUST: Lock-файлы в git
git add pnpm-lock.yaml # pnpm
git add yarn.lock # yarn
git add package-lock.json # npm

# ❌ FORBIDDEN: Игнорирование lock-файлов
# .gitignore
package-lock.json # НЕ ДЕЛАЙТЕ ТАК!

Установка зависимостей

MUST: --ignore-scripts

Хуки preinstall / postinstall могут выполнять произвольный код — отключайте их по умолчанию.

# ✅ MUST: Установка с игнорированием скриптов
npm install some-package --ignore-scripts
pnpm add some-package --ignore-scripts
yarn add some-package --ignore-scripts
# .npmrc
ignore-scripts=true

Явное разрешение для проверенных пакетов

Если пакет требует install-скриптов — разрешать явно:

// package.json (pnpm)
{
"pnpm": {
"onlyBuiltDependencies": ["esbuild", "sharp"]
}
}
# npm / yarn — через @lavamoat/allow-scripts
npx @lavamoat/allow-scripts setup

Аудит зависимостей

MUST: Регулярная проверка

# npm
npm audit
npm audit --audit-level=moderate

# pnpm
pnpm audit
pnpm audit --audit-level=moderate

# yarn
yarn audit --level moderate

CI/CD

# .github/workflows/security.yml
name: Security Audit

on:
pull_request:
schedule:
- cron: '0 0 * * 0' # Еженедельно

jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '20'

- name: Install dependencies
run: npm ci --ignore-scripts # ✅ MUST: --ignore-scripts в CI

- name: Security audit
run: npm audit --audit-level=moderate

- name: Check for secrets
uses: trufflesecurity/trufflehog@main
with:
path: ./
base: ${{ github.event.repository.default_branch }}

Dependabot

# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: 'npm'
directory: '/'
schedule:
interval: 'weekly'
open-pull-requests-limit: 5
groups:
react:
patterns:
- 'react*'
- '@types/react*'

SAST (Static Application Security Testing)

SHOULD

OpenGrep — статический анализ на security-паттерны.

# Установка
curl -fsSL https://raw.githubusercontent.com/opengrep/opengrep/main/install.sh | bash

# Запуск минимального ruleset
opengrep scan --config p/javascript --config p/typescript --config p/react --config p/security-audit src/

Запуск:

  • В CI на каждый PR
  • Локально как self-review перед созданием PR

Минимальный ruleset:

  • p/javascript
  • p/typescript
  • p/react
  • p/security-audit

При необходимости — кастомные правила под проект.

# .github/workflows/sast.yml
name: SAST

on: [pull_request]

jobs:
opengrep:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run OpenGrep
run: |
curl -fsSL https://raw.githubusercontent.com/opengrep/opengrep/main/install.sh | bash
opengrep scan \
--config p/javascript \
--config p/typescript \
--config p/react \
--config p/security-audit \
src/

Обновление зависимостей

# ✅ Безопасное обновление
npm outdated # Проверка доступных обновлений
npm update package-name
npm test # Тесты после обновления
npm audit # Проверка уязвимостей
npm run build # Проверка сборки

# Коммит только после успешных тестов
git commit -m "chore: update package-name to vX.Y.Z"