SAST: статическое тестирование безопасности приложения
SAST (Static Application Security Testing) анализирует исходный код без выполнения — находит уязвимости на этапе разработки. SQL injection, XSS, hardcoded secrets, небезопасные функции — до попадания в production.
Инструменты SAST
Semgrep — быстрый, правила для 30+ языков, можно писать кастомные:
# Установка
pip install semgrep
# Сканирование с набором правил для безопасности
semgrep scan --config=p/security-audit \
--config=p/owasp-top-ten \
--config=p/typescript \
--json > semgrep-results.json
# Кастомное правило: поиск прямой конкатенации SQL
cat > rules/sql-injection.yml << 'EOF'
rules:
- id: raw-sql-concatenation
patterns:
- pattern: |
"SELECT ... " + $VAR
- pattern: |
`SELECT ... ${$VAR}`
message: "Potential SQL injection: use parameterized queries"
severity: ERROR
languages: [typescript, javascript]
EOF
semgrep scan --config=rules/sql-injection.yml src/
GitHub Advanced Security (CodeQL):
# .github/workflows/codeql.yml
name: CodeQL
on:
push:
branches: [main]
pull_request:
branches: [main]
schedule:
- cron: '0 0 * * 1' # Еженедельно
jobs:
analyze:
runs-on: ubuntu-latest
permissions:
security-events: write
actions: read
strategy:
matrix:
language: [javascript-typescript]
steps:
- uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
queries: security-and-quality
- name: Autobuild
uses: github/codeql-action/autobuild@v3
- name: Analyze
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{ matrix.language }}"
Поиск секретов
# Gitleaks: поиск секретов в коде и истории git
docker run --rm -v $(pwd):/path \
zricethezav/gitleaks:latest detect \
--source /path \
--report-format json \
--report-path /path/gitleaks-report.json
# truffleHog: анализ git истории
trufflehog git file://. --json > secrets-report.json
# GitHub Actions: pre-commit hook на секреты
- name: Check for secrets
uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITLEAKS_LICENSE: ${{ secrets.GITLEAKS_LICENSE }}
ESLint Security плагины
npm install --save-dev eslint-plugin-security \
eslint-plugin-no-unsanitized \
@microsoft/eslint-plugin-sdl
// .eslintrc.json
{
"plugins": ["security", "no-unsanitized", "@microsoft/sdl"],
"extends": [
"plugin:security/recommended",
"plugin:@microsoft/sdl/required"
],
"rules": {
"security/detect-object-injection": "error",
"security/detect-non-literal-regexp": "warn",
"security/detect-possible-timing-attacks": "error",
"no-unsanitized/method": "error",
"no-unsanitized/property": "error"
}
}
Интеграция в CI/CD
# .github/workflows/sast.yml
name: SAST
on: [push, pull_request]
jobs:
semgrep:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: returntocorp/semgrep-action@v1
with:
config: >-
p/security-audit
p/owasp-top-ten
p/typescript
auditOn: push
env:
SEMGREP_APP_TOKEN: ${{ secrets.SEMGREP_APP_TOKEN }}
secrets-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: gitleaks/gitleaks-action@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Правило SAST: не блокируем PR при каждом предупреждении — только при HIGH и CRITICAL. Все остальные — в backlog security debt.
Настройка Semgrep + CodeQL + Gitleaks в CI/CD — 1–2 рабочих дня.







