SAST

Что такое sast: определение, основные принципы, примеры и практические советы. Изучайте фундаментальной защите информации с подробными объяснениями для начинающих специалистов.

SAST - Статический анализ кода

Что такое SAST?

Static Application Security Testing (SAST) — это метод тестирования безопасности, который анализирует исходный код приложения на предмет уязвимостей без выполнения программы.

Ключевые особенности

  • Анализ исходного кода — работа с кодом, а не с исполняемыми файлами
  • Без выполнения — анализ происходит без запуска приложения
  • Раннее обнаружение — проблемы выявляются на этапе разработки
  • Автоматизация — легко интегрируется в CI/CD pipeline

Принципы работы SAST

Анализ потока данных

Отслеживание данных от источника до использования

Этапы анализа:

  1. Source Identification — идентификация источников данных
  2. Data Flow Tracking — отслеживание потока данных
  3. Sink Analysis — анализ точек использования
  4. Vulnerability Detection — обнаружение уязвимостей

Пример уязвимости:

// Источник данных (пользовательский ввод)
String userInput = request.getParameter("username");

// Обработка данных
String query = "SELECT * FROM users WHERE name = '" + userInput + "'";

// Точка использования (SQL запрос)
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query); // SQL Injection!

Анализ управления потоком

Отслеживание выполнения программы

Компоненты:

  • Control Flow Graph — граф потока управления
  • Data Dependencies — зависимости данных
  • Function Calls — вызовы функций
  • Exception Handling — обработка исключений

Семантический анализ

Понимание смысла кода

Методы:

  • Symbolic Execution — символьное выполнение
  • Abstract Interpretation — абстрактная интерпретация
  • Type Analysis — анализ типов
  • Pattern Matching — сопоставление с образцами

Типы обнаруживаемых уязвимостей

OWASP Top 10

Наиболее критичные уязвимости веб-приложений

A01:2021 – Broken Access Control

// Проблема: отсутствие проверки прав доступа
@GetMapping("/admin/users")
public List<User> getUsers() {
    return userService.getAllUsers(); // Любой может получить список пользователей
}

// Решение: проверка прав доступа
@GetMapping("/admin/users")
@PreAuthorize("hasRole('ADMIN')")
public List<User> getUsers() {
    return userService.getAllUsers();
}

A02:2021 – Cryptographic Failures

// Проблема: слабое шифрование
MessageDigest md = MessageDigest.getInstance("MD5"); // MD5 устарел

// Решение: использование сильного алгоритма
MessageDigest md = MessageDigest.getInstance("SHA-256");

A03:2021 – Injection

// Проблема: SQL Injection
String query = "SELECT * FROM users WHERE id = " + userId;

// Решение: использование prepared statements
String query = "SELECT * FROM users WHERE id = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setInt(1, userId);

CWE (Common Weakness Enumeration)

Каталог общих слабостей программного обеспечения

CWE-79: Cross-site Scripting (XSS)

// Проблема: отображение пользовательского ввода без экранирования
document.getElementById("output").innerHTML = userInput;

// Решение: экранирование HTML
document.getElementById("output").textContent = userInput;

CWE-89: SQL Injection

// Проблема: конкатенация строк в SQL
const query = "SELECT * FROM users WHERE name = '" + name + "'";

// Решение: использование параметризованных запросов
const query = "SELECT * FROM users WHERE name = ?";
db.query(query, [name]);

CWE-22: Path Traversal

// Проблема: использование пользовательского ввода в пути
String filename = request.getParameter("file");
File file = new File("/uploads/" + filename);

// Решение: валидация и санитизация пути
String filename = request.getParameter("file");
if (filename.contains("..") || filename.contains("/")) {
    throw new SecurityException("Invalid filename");
}

Популярные SAST инструменты

SonarQube

Открытая платформа для анализа качества кода

Возможности:

  • Multi-language Support — поддержка множества языков
  • Security Rules — правила безопасности
  • Quality Gates — ворота качества
  • Integration — интеграция с CI/CD

Настройка:

# sonar-project.properties
sonar.projectKey=my-project
sonar.sources=src
sonar.java.binaries=target/classes
sonar.security.hotspots.reviewed=true

Checkmarx

Коммерческая платформа для анализа безопасности

Особенности:

  • Advanced Analysis — продвинутый анализ
  • Custom Rules — пользовательские правила
  • IDE Integration — интеграция с IDE
  • Enterprise Features — корпоративные функции

Veracode

Облачная платформа для анализа безопасности

Возможности:

  • Cloud-based — облачная платформа
  • Multi-language — множественные языки
  • Compliance — соответствие стандартам
  • API Integration — интеграция через API

Semgrep

Быстрый статический анализатор кода

Особенности:

  • Fast — быстрый анализ
  • Custom Rules — пользовательские правила
  • CLI Tool — инструмент командной строки
  • Open Source — открытый исходный код

Интеграция в CI/CD

GitHub Actions

Интеграция с GitHub Actions

name: Security Scan
on: [push, pull_request]

jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Run SonarQube
        uses: sonarqube-quality-gate-action@master
        env:
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}

GitLab CI

Интеграция с GitLab CI

stages:
  - security

sonarqube:
  stage: security
  script:
    - sonar-scanner
  only:
    - merge_requests
    - main

Jenkins

Интеграция с Jenkins

pipeline {
    agent any
    stages {
        stage('Security Scan') {
            steps {
                sh 'sonar-scanner'
            }
        }
    }
    post {
        always {
            publishHTML([
                allowMissing: false,
                alwaysLinkToLastBuild: true,
                keepAll: true,
                reportDir: 'target/sonar',
                reportFiles: 'index.html',
                reportName: 'SonarQube Report'
            ])
        }
    }
}

Настройка и конфигурация

Правила анализа

Настройка правил для обнаружения уязвимостей

Типы правил:

  • Security Rules — правила безопасности
  • Quality Rules — правила качества
  • Maintainability Rules — правила поддерживаемости
  • Reliability Rules — правила надежности

Пример конфигурации:

<!-- sonar-project.xml -->
<sonar>
    <property name="sonar.security.hotspots.reviewed" value="true"/>
    <property name="sonar.java.security.hotspots" value="true"/>
    <property name="sonar.java.security.owasp" value="true"/>
</sonar>

Исключения и фильтры

Настройка исключений для ложных срабатываний

Методы исключения:

  • @SuppressWarnings — подавление предупреждений
  • sonar.ignore — игнорирование файлов
  • Custom Rules — пользовательские правила
  • False Positive Management — управление ложными срабатываниями

Пример исключения:

@SuppressWarnings("squid:S2070") // Suppress password in URL warning
public void connectToDatabase(String url) {
    // URL contains password for legacy system
    Connection conn = DriverManager.getConnection(url);
}

Лучшие практики

Рекомендации

  • Интегрируйте в CI/CD — автоматизируйте анализ
  • Настройте качественные ворота — блокируйте небезопасный код
  • Обучайте команду — объясняйте найденные проблемы
  • Регулярно обновляйте — используйте актуальные правила
  • Управляйте ложными срабатываниями — настройте исключения

Чего избегать

  • Игнорирования результатов — не игнорируйте найденные проблемы
  • Слишком строгих правил — это может заблокировать разработку
  • Отсутствия контекста — учитывайте бизнес-требования
  • Игнорирования производительности — настройте оптимальную конфигурацию

Метрики и отчетность

Ключевые метрики

  • Vulnerability Count — количество уязвимостей
  • Security Hotspots — горячие точки безопасности
  • Code Coverage — покрытие кода тестами
  • Technical Debt — технический долг

Отчеты

  • Security Dashboard — дашборд безопасности
  • Trend Analysis — анализ тенденций
  • Compliance Reports — отчеты о соответствии
  • Executive Summary — исполнительное резюме

Ограничения SAST

Ложные срабатывания

Проблема ложных срабатываний

Причины:

  • Контекст — отсутствие понимания контекста
  • Сложная логика — сложная бизнес-логика
  • Внешние зависимости — зависимости от внешних систем
  • Устаревшие правила — устаревшие правила анализа

Решения:

  • Настройка правил — адаптация правил под проект
  • Исключения — настройка исключений
  • Обучение — обучение команды
  • Регулярный пересмотр — регулярный пересмотр результатов

Пропущенные уязвимости

Проблема пропуска реальных уязвимостей

Причины:

  • Сложные уязвимости — сложные для обнаружения уязвимости
  • Runtime зависимости — зависимости от времени выполнения
  • Внешние системы — интеграция с внешними системами
  • Ограничения анализа — ограничения статического анализа

Решения:

  • Комбинированный подход — использование SAST + DAST
  • Ручное тестирование — дополнительное ручное тестирование
  • Code Reviews — проверки кода
  • Penetration Testing — тестирование на проникновение

Заключение

SAST — это мощный инструмент для обнаружения уязвимостей на раннем этапе разработки. Успешное использование SAST требует:

  • Правильной настройки — адаптации под проект
  • Интеграции в процессы — встраивания в CI/CD
  • Обучения команды — понимания принципов работы
  • Управления результатами — обработки ложных срабатываний

Помните: SAST — это не панацея, а часть комплексного подхода к безопасности. Используйте его в сочетании с другими методами тестирования для максимальной эффективности.