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
Связанные темы
- _MOC Безопасность
- Dependency Scanning -- npm audit
- Secure SDLC -- безопасный жизненный цикл
- Security Code Review -- чек-лист