SAST и DAST — статический и динамический анализ

SAST (Static Application Security Testing) анализирует исходный код без выполнения; DAST (Dynamic Application Security Testing) тестирует работающее приложение, имитируя атаки снаружи. Вместе они покрывают разные классы уязвимостей.

Зачем нужно

Ни SAST, ни DAST не покрывают 100% уязвимостей в одиночку. SAST находит проблемы рано (в коде), DAST — реальные уязвимости в контексте запущенного приложения. Интеграция в CI/CD автоматизирует безопасность на каждом деплое.

Где используется

  • SAST: pull request checks в GitHub Actions, pre-commit хуки
  • DAST: staging-окружение перед релизом, scheduled scan production
  • IAST (Interactive): runtime-анализ во время тестирования QA

Основной контент

Сравнение подходов

Критерий SAST DAST
Когда Во время разработки На запущенном приложении
Что находит Инъекции, hardcoded secrets, опасные API XSS, Auth bypass, конфиг-ошибки
Ложные срабатывания Высоко Низко
Инструменты Semgrep, SonarQube, ESLint OWASP ZAP, Burp Suite, Nikto

SAST: Semgrep в CI

# .github/workflows/sast.yml
name: SAST
on: [push, pull_request]

jobs:
  semgrep:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run Semgrep
        uses: semgrep/semgrep-action@v1
        with:
          config: >-
            p/javascript
            p/nodejs
            p/owasp-top-ten

SAST: ESLint Security Plugin

npm install --save-dev eslint-plugin-security eslint-plugin-no-unsanitized
// .eslintrc.json
{
  "plugins": ["security", "no-unsanitized"],
  "extends": ["plugin:security/recommended"],
  "rules": {
    "no-unsanitized/method": "error",
    "no-unsanitized/property": "error",
    "security/detect-eval-with-expression": "error",
    "security/detect-non-literal-regexp": "warn"
  }
}

DAST: OWASP ZAP в CI

# Запуск baseline scan на staging
docker run -t owasp/zap2docker-stable zap-baseline.py \
  -t https://staging.example.com \
  -r zap-report.html \
  --exit-code 1  # Завалить CI при критических находках

Пример находки SAST (Semgrep)

// SAST обнаружит и пометит:
const query = "SELECT * FROM users WHERE id = " + userId; // SQL injection risk
eval(userInput);                                            // Code injection
const regex = new RegExp(userInput);                       // ReDoS risk
res.setHeader('Access-Control-Allow-Origin', '*');          // Loose CORS

Частые ошибки

  • Запуск SAST только локально, а не в CI — разработчики пропускают проверку
  • Игнорирование false positives вместо их анализа и правильного suppression
  • DAST на production-окружении без изоляции — можно создать реальный ущерб
  • Отсутствие DAST на staging перед релизом — дорогостоящие находки в production

Связанные темы

Ресурсы