Skip to content

Secure Code Review Cheat Sheet

Введение

Анализ безопасности кода (Secure Code Review) — это процесс ручного изучения исходного кода с целью выявления уязвимостей безопасности, которые автоматизированные инструменты зачастую упускают. Он включает анализ логики приложения, потоков данных и деталей реализации для обнаружения дефектов безопасности, требующих экспертных знаний и контекстного понимания.

Ручной анализ кода дополняет автоматизированные инструменты тестирования безопасности (SAST/DAST), концентрируясь на областях, где человеческий анализ даёт наибольшую ценность: валидация бизнес-логики, сложные реализации безопасности и контекстно-специфические уязвимости. В то время как автоматизированные инструменты могут помочь, выделяя потенциально проблемные места, основной анализ опирается на суждения человека и экспертизу в предметной области.

Проверка с фокусом на безопасность отличается от функционального код-ревью тем, что специально направлена на проблемы безопасности: валидация входных данных, механизмы аутентификации, контроль авторизации, криптографические реализации и потенциальные векторы атак.

Типы проверок

Базовые проверки (Baseline Reviews) охватывают всю кодовую базу комплексно. Применяются для:

  • Новых приложений или крупных релизов
  • Введения в работу унаследованных систем
  • Требований соответствия нормативным стандартам
  • Анализа после инцидентов

Проверки на основе изменений (Diff-Based Reviews) фокусируются только на изменениях кода. Применяются для:

  • Pull request'ов и коммитов
  • Ежедневного рабочего процесса разработки
  • Завершения функций
  • Непрерывной валидации безопасности

Данная шпаргалка содержит практические рекомендации по проведению эффективных ручных проверок безопасности кода с акцентом как на базовую, так и на инкрементальную методологию проверки.

Методология проверки

Подготовка

Для всех типов проверок:

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

Дополнительно для базовых проверок:

  • Нанести на карту полные границы приложения и зависимости
  • Проанализировать общую архитектуру безопасности
  • Изучить историю инцидентов безопасности
  • Проверить все сторонние библиотеки

Дополнительно для проверок на основе изменений:

  • Определить изменённые файлы и затронутые компоненты
  • Оценить влияние на существующие средства контроля безопасности
  • Понять цель изменений
  • Приоритизировать высокорискованные модификации

Процесс проверки

Шаги базовой проверки:

  1. Анализ архитектуры на предмет антипаттернов безопасности
  2. Анализ точек входа и валидация входных данных
  3. Проверка аутентификации и авторизации
  4. Трассировка потоков данных
  5. Анализ бизнес-логики
  6. Проверка криптографической реализации
  7. Проверка обработки ошибок
  8. Проверка конфигурации и развёртывания

Шаги проверки на основе изменений:

  1. Анализ влияния на существующие средства контроля безопасности
  2. Определение новых векторов атак
  3. Проверка безопасности на изменённых границах доверия
  4. Проверка новых интеграций
  5. Обеспечение отсутствия регрессий безопасности
  6. Применение релевантных паттернов безопасности

Распространённые паттерны уязвимостей

Уязвимости валидации входных данных

Проверяйте отсутствие серверной валидации, неправильную санитизацию и слабую фильтрацию входных данных. Подробнее см. Шпаргалку по валидации входных данных.

Уязвимости инъекций

SQL Injection:

Ищите конкатенацию строк в запросах к базе данных и небезопасное построение запросов. Подробнее см. Шпаргалку по предотвращению SQL Injection.

Cross-Site Scripting (XSS):

Проверяйте кодирование вывода, манипуляции с DOM и отображение пользовательского ввода. Подробнее см. Шпаргалку по предотвращению Cross Site Scripting.

Path Traversal:

Проверяйте небезопасное построение путей к файлам и уязвимости обхода директорий. Подробнее см. Шпаргалку по загрузке файлов.

Command Injection:

Выявляйте прямое выполнение команд с пользовательским вводом и небезопасные системные вызовы. Подробнее см. Шпаргалку по защите от инъекции команд ОС.

NoSQL Injection:

Изучайте построение запросов NoSQL и привязку параметров. Подробнее см. Шпаргалку по безопасности NoSQL.

Уязвимости аутентификации и управления сессиями

Проверяйте механизмы аутентификации, генерацию токенов сессий и обработку учётных данных пользователей. Подробнее см. Шпаргалку по аутентификации и Шпаргалку по управлению сессиями.

Уязвимости контроля доступа

Изучайте проверки авторизации, ролевое управление доступом и предотвращение повышения привилегий. Подробнее см. Шпаргалку по авторизации.

Уязвимости десериализации

Небезопасная десериализация:

Проверяйте небезопасную десериализацию ненадёжных данных и уязвимости инъекции объектов. Подробнее см. Шпаргалку по десериализации.

XML External Entity (XXE):

Проверяйте конфигурации парсинга XML и обработку внешних сущностей. Подробнее см. Шпаргалку по предотвращению XML External Entity.

Недостатки криптографической реализации

Изучайте алгоритмы шифрования, управление ключами и криптографические реализации. Подробнее см. Шпаргалку по криптографическому хранению.

Техники проверки

Анализ паттернов кода

Концентрируйтесь на высокорискованных паттернах кода:

  • Функции обработки и валидации входных данных
  • Построение запросов к базе данных и использование ORM
  • Файловые операции и обработка путей
  • Логика аутентификации и управления сессиями
  • Проверки авторизации и контроля доступа
  • Криптографические операции и управление ключами
  • Механизмы обработки ошибок и логирования
  • Загрузка конфигурации и переменные окружения

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

Отслеживайте данные через приложение:

  1. Определите источники: пользовательский ввод, загрузка файлов, API-вызовы, чтение из базы данных, переменные окружения
  2. Следите за обработкой: валидация, преобразование, бизнес-логика, кэширование
  3. Проверяйте точки назначения: запросы к базе данных, запись файлов, отображение вывода, логирование, внешние API
  4. Валидируйте границы: валидация входных данных и кодирование вывода на границах доверия
  5. Зоны доверия: проверяйте средства контроля безопасности при каждом пересечении границ доверия
  6. Классификация данных: убедитесь, что чувствительные данные получают надлежащую защиту

Проверка на основе угроз

Согласовывайте проверку с распространёнными паттернами атак:

  • OWASP Top 10: акцент на преобладающих рисках веб-приложений
  • Модель STRIDE: Spoofing, Tampering, Repudiation, Information Disclosure, DoS, Elevation
  • Деревья атак: карта потенциальных путей атак через приложение
  • Случаи злоупотреблений: рассматривайте, как злоумышленники могут неправомерно использовать функции
  • Средства контроля безопасности: проверяйте реализацию эшелонированной защиты

Анализ бизнес-логики

Анализируйте рабочие процессы приложения на предмет:

  • Управления состоянием и валидации переходов
  • Гонок состояний и проблем параллелизма
  • Целостности транзакций и механизмов отката
  • Ограничений ресурсов и соблюдения квот
  • Авторизации на каждом шаге рабочего процесса
  • Возможностей обхода рабочего процесса

Чек-листы проверки

Валидация входных данных

  • [ ] Серверная валидация: все входные данные валидируются на сервере независимо от проверок на стороне клиента
  • [ ] Валидация по разрешённому списку: используются белые списки, а не чёрные для валидации входных данных
  • [ ] Кодирование вывода: контекстно-зависимое кодирование (HTML, JavaScript, CSS, URL, SQL)
  • [ ] Безопасность загрузки файлов: валидация на основе содержимого, ограничения размера, безопасное хранение
  • [ ] Предотвращение SQL injection: используются параметризованные запросы или хранимые процедуры
  • [ ] Ограничения длины: ограничения длины входных данных соблюдаются
  • [ ] Обработка символов: специальные символы и Unicode обрабатываются корректно
  • [ ] Сообщения об ошибках: в ответах на ошибки не раскрывается чувствительная информация

Аутентификация и управление сессиями

  • [ ] Безопасность паролей: надёжные алгоритмы хэширования с использованием соли (подробнее см. Шпаргалку по хранению паролей)
  • [ ] Защита аккаунта: механизмы блокировки с подходящими порогами
  • [ ] Управление сессиями: безопасная генерация токенов (энтропия ≥128 бит)
  • [ ] Жизненный цикл сессии: правильная инвалидация при выходе/тайм-ауте
  • [ ] Повторная аутентификация: требуется для чувствительных операций
  • [ ] Многофакторная аутентификация: реализация для аккаунтов высокого риска (подробнее см. Шпаргалку по многофакторной аутентификации)
  • [ ] Сброс пароля: безопасные механизмы сброса с ограничением по времени (подробнее см. Шпаргалку по восстановлению пароля)
  • [ ] Безопасность сессии: атрибуты cookie HttpOnly, Secure, SameSite
  • [ ] Параллельные сессии: соответствующие ограничения и мониторинг

Авторизация

  • [ ] Серверное применение: все средства контроля доступа применяются на стороне сервера
  • [ ] Безопасные значения по умолчанию: политика запрета доступа по умолчанию
  • [ ] Предотвращение IDOR: надлежащая авторизация для доступа к ресурсам
  • [ ] Контроль на уровне функций: административные функции должным образом защищены
  • [ ] Валидация ролей: назначения ролей не могут быть изменены
  • [ ] Повышение привилегий: горизонтальное и вертикальное повышение предотвращено
  • [ ] Централизованные решения: логика контроля доступа централизована
  • [ ] Проверки после аутентификации: авторизация проверяется после аутентификации

Криптография

  • [ ] Надёжные алгоритмы: современные алгоритмы (AES-256, RSA-2048+, ECDSA P-256+)
  • [ ] Управление ключами: надлежащая генерация, хранение и ротация ключей (подробнее см. Шпаргалку по управлению ключами)
  • [ ] Валидация сертификатов: надлежащая валидация, включая проверку имени хоста
  • [ ] Генерация случайных чисел: криптографически безопасная генерация случайных чисел
  • [ ] Защита данных: шифрование в состоянии покоя и при передаче
  • [ ] Обработка IV/Nonce: уникальные и непредсказуемые векторы инициализации
  • [ ] Обслуживание библиотек: актуальные криптографические библиотеки
  • [ ] Защита от побочных каналов: учёт атак по времени и других атак по побочным каналам

Бизнес-логика

  • [ ] Целостность рабочего процесса: надлежащая валидация состояния в многоэтапных процессах
  • [ ] Предотвращение гонок состояний: синхронизация в параллельных операциях
  • [ ] Атомарность транзакций: надлежащие механизмы отката и согласованности
  • [ ] Ограничения ресурсов: реализованы ограничение частоты запросов и квоты ресурсов
  • [ ] Применение бизнес-правил: правила нельзя обойти через прямой доступ к API

Конфигурация и развёртывание

Мониторинг безопасности

  • [ ] События безопасности: логируются сбои аутентификации, нарушения авторизации
  • [ ] Обнаружение аномалий: отслеживаются необычные паттерны и поведение
  • [ ] Журналы аудита: полные журналы аудита для чувствительных операций
  • [ ] Оповещения в реальном времени: критические события безопасности вызывают немедленные уведомления
  • [ ] Целостность логов: логи защищены от подделки и несанкционированного доступа
  • [ ] Реагирование на инциденты: чёткие процедуры обработки инцидентов безопасности

Инструменты и техники

Редакторы кода

Используйте редакторы с расширениями безопасности:

  • Visual Studio Code с ESLint, SonarLint
  • IntelliJ IDEA с SpotBugs, SonarLint
  • Eclipse с плагинами безопасности
  • Vim/Neovim с линтерами безопасности

Обнаружение паттернов через командную строку

# Find hardcoded secrets
grep -ri "password\s*=\|api_key\s*=\|secret\s*=" source/

# Find unsafe functions
grep -r "eval(\|exec(\|innerHTML\|document\.write" source/

# Find potential injections
grep -r "SELECT.*+\|executeQuery.*+" source/

Области фокусировки при ручной проверке

Преимущества человеческой экспертизы:

  • Недостатки бизнес-логики: сложные рабочие процессы и проблемы управления состоянием, требующие понимания предметной области
  • Контекстно-специфические уязвимости: проблемы безопасности, зависящие от специфических бизнес-правил приложения
  • Логика авторизации: сложные модели разрешений и реализации контроля доступа
  • Гонки состояний: уязвимости, основанные на времени, в параллельных операциях
  • Ненадлежащее использование криптографии: корректная реализация криптографических примитивов и протоколов
  • Безопасность архитектуры: высокоуровневые конструктивные недостатки и антипаттерны безопасности

Техники ручного анализа:

  • Трассировка путей кода: следование по путям выполнения через сложную бизнес-логику
  • Анализ состояния: понимание переходов состояний приложения и валидации
  • Картирование границ доверия: определение и анализ точек контроля безопасности
  • Интеграция моделирования угроз: применение моделей угроз к конкретным реализациям кода
  • Симуляция сценариев атак: мысленная симуляция путей атак через код

Интеграция автоматизированных инструментов

Поддержка ручных проверок:

  • Сортировка результатов SAST: использование результатов автоматизации для приоритизации областей ручной проверки
  • Сканирование зависимостей: определение уязвимых библиотек, требующих ручной оценки
  • Метрики качества кода: концентрация ручных усилий на сложном или часто изменяемом коде
  • Обнаружение паттернов: использование инструментов для выделения потенциальных антипаттернов безопасности для анализа человеком

Стратегия интеграции инструментов:

  • Сканирование перед проверкой: запуск автоматизированных инструментов перед ручной проверкой для выявления очевидных проблем
  • Дополнительный анализ: использование результатов инструментов для направления более глубокого ручного исследования
  • Фильтрация ложных срабатываний: применение суждений человека для валидации результатов автоматизации
  • Пробелы в покрытии: фокусировка ручной проверки на областях, которые автоматизированные инструменты не могут эффективно анализировать

Метрики безопасности:

  • Охват ручной проверки: процент критических путей кода, проверенных людьми
  • Качество находок: соотношение реальных проблем безопасности к общему числу находок
  • Эффективность проверки: время, затраченное на ручную проверку, по сравнению с ценностью для безопасности
  • Анализ тенденций: улучшение состояния безопасности со временем

Шаблоны документации

Шаблон отчёта о находке:

Title: [Vulnerability Type] in [Component]
Severity: [Critical/High/Medium/Low]
CWE: [CWE Number and Name]
Location: [File:Line or Function]
Description: [Detailed explanation of the vulnerability]
Impact: [Security implications and potential attack scenarios]
Reproduction: [Steps to reproduce or proof of concept]
Recommendation: [Specific fix guidance with code examples]
References: [CWE links, OWASP references, vendor documentation]
Status: [Open/In Progress/Fixed/Accepted Risk]
Assignee: [Developer responsible for fix]
Due Date: [Target fix date]

Шаблон сводки проверки:

Review Summary
==============
Application: [Application Name]
Version: [Version/Commit Hash]
Reviewer(s): [Names]
Review Date: [Date]
Scope: [Files/Components Reviewed]

Findings Summary:
- Critical: [Count]
- High: [Count]
- Medium: [Count]
- Low: [Count]
- Informational: [Count]

Key Recommendations:
1. [Priority recommendation]
2. [Priority recommendation]
3. [Priority recommendation]

Overall Risk Assessment: [Low/Medium/High/Critical]

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

Сроки проверки

Интеграция базовой проверки

  • Инициация проекта: комплексная оценка безопасности существующей кодовой базы
  • Крупные релизы: полная проверка безопасности перед значительными выпусками версий
  • Архитектурные изменения: полная проверка при фундаментальных изменениях дизайна
  • Циклы соответствия: периодические комплексные проверки для регуляторных требований
  • Инциденты безопасности: тщательная проверка после нарушений безопасности или крупных уязвимостей
  • Введение в работу унаследованных систем: первоначальная оценка безопасности при включении существующих приложений в практики безопасной разработки

Интеграция проверок на основе изменений

  • Pull Request'ы: проверка изменений кода с фокусом на безопасность как часть стандартного процесса PR
  • Pre-commit хуки: лёгкие проверки безопасности на коммитах разработчика
  • Завершение функций: проверка безопасности завершённых пользовательских историй или функций
  • Sprint-ревью: регулярная оценка последствий для безопасности результатов спринта
  • Проверки хотфиксов: быстрая оценка безопасности экстренных исправлений
  • Непрерывная интеграция: автоматическое инициирование проверок безопасности на основе изменений кода

Гибридный подход

  • Планирование на основе рисков: сочетание базовых проверок для высокорискованных компонентов с проверками на основе изменений для рутинных изменений
  • Инкрементальные обновления базовой проверки: постепенное расширение охвата базовой проверки в нескольких циклах разработки
  • Проверки на основе триггеров: эскалация от проверки на основе изменений к базовой при выявлении значительных проблем безопасности

Для интеграции CI/CD и автоматизированного тестирования безопасности подробнее см. Шпаргалку по безопасности CI/CD.

Командное взаимодействие

Роли:

  • Рецензенты безопасности: проводят анализ и дают рекомендации
  • Разработчики: реализуют исправления и следуют практикам безопасного кодирования
  • Чемпионы безопасности: служат мостом между командами безопасности и разработки

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

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

Продвинутые техники

Анализ гонок состояний

Концентрируйтесь на уязвимостях Time-of-Check vs Time-of-Use (TOCTOU) и обеспечивайте атомарность операций.

Анализ бизнес-логики

Анализируйте рабочие процессы на предмет:

  • Переходов состояний и их валидации
  • Возможностей обхода шагов или валидации
  • Надлежащей валидации на каждом шаге рабочего процесса
  • Механизмов отката и очистки при сбоях
  • Поведения при параллельном доступе
  • Граничных условий и сценариев ошибок

Проверка архитектуры безопасности

Проверяйте архитектурные паттерны на предмет согласованного применения безопасности и надлежащих средств контроля безопасности API.

Безопасность памяти

Проверяйте управление буфером, защиту от целочисленного переполнения и ограничения ресурсов.

Ссылки

Ресурсы OWASP:

Связанные шпаргалки OWASP:

Отраслевые стандарты:

Дополнительные ресурсы: