Безопасность зависимостей
Компрометация одной зависимости означает компрометацию проекта. 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/javascriptp/typescriptp/reactp/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"