Secure Code Review Cheat Sheet¶
Введение¶
Анализ безопасности кода (Secure Code Review) — это процесс ручного изучения исходного кода с целью выявления уязвимостей безопасности, которые автоматизированные инструменты зачастую упускают. Он включает анализ логики приложения, потоков данных и деталей реализации для обнаружения дефектов безопасности, требующих экспертных знаний и контекстного понимания.
Ручной анализ кода дополняет автоматизированные инструменты тестирования безопасности (SAST/DAST), концентрируясь на областях, где человеческий анализ даёт наибольшую ценность: валидация бизнес-логики, сложные реализации безопасности и контекстно-специфические уязвимости. В то время как автоматизированные инструменты могут помочь, выделяя потенциально проблемные места, основной анализ опирается на суждения человека и экспертизу в предметной области.
Проверка с фокусом на безопасность отличается от функционального код-ревью тем, что специально направлена на проблемы безопасности: валидация входных данных, механизмы аутентификации, контроль авторизации, криптографические реализации и потенциальные векторы атак.
Типы проверок¶
Базовые проверки (Baseline Reviews) охватывают всю кодовую базу комплексно. Применяются для:
- Новых приложений или крупных релизов
- Введения в работу унаследованных систем
- Требований соответствия нормативным стандартам
- Анализа после инцидентов
Проверки на основе изменений (Diff-Based Reviews) фокусируются только на изменениях кода. Применяются для:
- Pull request'ов и коммитов
- Ежедневного рабочего процесса разработки
- Завершения функций
- Непрерывной валидации безопасности
Данная шпаргалка содержит практические рекомендации по проведению эффективных ручных проверок безопасности кода с акцентом как на базовую, так и на инкрементальную методологию проверки.
Методология проверки¶
Подготовка¶
Для всех типов проверок:
- Понять архитектуру приложения и бизнес-требования
- Собрать модели угроз и результаты предыдущих проверок безопасности
- Определить критические активы и функции высокого риска
- Изучить требования безопасности и документацию
Дополнительно для базовых проверок:
- Нанести на карту полные границы приложения и зависимости
- Проанализировать общую архитектуру безопасности
- Изучить историю инцидентов безопасности
- Проверить все сторонние библиотеки
Дополнительно для проверок на основе изменений:
- Определить изменённые файлы и затронутые компоненты
- Оценить влияние на существующие средства контроля безопасности
- Понять цель изменений
- Приоритизировать высокорискованные модификации
Процесс проверки¶
Шаги базовой проверки:
- Анализ архитектуры на предмет антипаттернов безопасности
- Анализ точек входа и валидация входных данных
- Проверка аутентификации и авторизации
- Трассировка потоков данных
- Анализ бизнес-логики
- Проверка криптографической реализации
- Проверка обработки ошибок
- Проверка конфигурации и развёртывания
Шаги проверки на основе изменений:
- Анализ влияния на существующие средства контроля безопасности
- Определение новых векторов атак
- Проверка безопасности на изменённых границах доверия
- Проверка новых интеграций
- Обеспечение отсутствия регрессий безопасности
- Применение релевантных паттернов безопасности
Распространённые паттерны уязвимостей¶
Уязвимости валидации входных данных¶
Проверяйте отсутствие серверной валидации, неправильную санитизацию и слабую фильтрацию входных данных. Подробнее см. Шпаргалку по валидации входных данных.
Уязвимости инъекций¶
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
- Файловые операции и обработка путей
- Логика аутентификации и управления сессиями
- Проверки авторизации и контроля доступа
- Криптографические операции и управление ключами
- Механизмы обработки ошибок и логирования
- Загрузка конфигурации и переменные окружения
Анализ потоков данных¶
Отслеживайте данные через приложение:
- Определите источники: пользовательский ввод, загрузка файлов, API-вызовы, чтение из базы данных, переменные окружения
- Следите за обработкой: валидация, преобразование, бизнес-логика, кэширование
- Проверяйте точки назначения: запросы к базе данных, запись файлов, отображение вывода, логирование, внешние API
- Валидируйте границы: валидация входных данных и кодирование вывода на границах доверия
- Зоны доверия: проверяйте средства контроля безопасности при каждом пересечении границ доверия
- Классификация данных: убедитесь, что чувствительные данные получают надлежащую защиту
Проверка на основе угроз¶
Согласовывайте проверку с распространёнными паттернами атак:
- 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
Конфигурация и развёртывание¶
- [ ] Безопасные значения по умолчанию: конфигурации с ориентацией на безопасность
- [ ] Разделение окружений: надлежащая изоляция между окружениями
- [ ] Управление секретами: отсутствие жёстко закодированных секретов, надлежащее хранение и ротация секретов (подробнее см. Шпаргалку по управлению секретами)
- [ ] Обработка ошибок: корректная обработка ошибок без раскрытия информации (подробнее см. Шпаргалку по обработке ошибок)
- [ ] Безопасность логирования: чувствительные данные не логируются, надлежащая защита логов (подробнее см. Шпаргалку по логированию)
- [ ] Заголовки безопасности: настроены соответствующие HTTP-заголовки безопасности (подробнее см. Шпаргалку по HTTP-заголовкам)
- [ ] Конфигурация TLS: надёжные наборы шифров и версии протокола (подробнее см. Шпаргалку по безопасности транспортного уровня)
- [ ] Управление зависимостями: актуальные библиотеки без известных уязвимостей (подробнее см. Шпаргалку по управлению уязвимыми зависимостями)
Мониторинг безопасности¶
- [ ] События безопасности: логируются сбои аутентификации, нарушения авторизации
- [ ] Обнаружение аномалий: отслеживаются необычные паттерны и поведение
- [ ] Журналы аудита: полные журналы аудита для чувствительных операций
- [ ] Оповещения в реальном времени: критические события безопасности вызывают немедленные уведомления
- [ ] Целостность логов: логи защищены от подделки и несанкционированного доступа
- [ ] Реагирование на инциденты: чёткие процедуры обработки инцидентов безопасности
Инструменты и техники¶
Редакторы кода¶
Используйте редакторы с расширениями безопасности:
- 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 Code Review Guide
- OWASP Testing Guide
- OWASP Top 10
- OWASP Application Security Verification Standard (ASVS)
- OWASP Secure Coding Practices
Связанные шпаргалки OWASP:
- Шпаргалка по моделированию угроз
- Шпаргалка по случаям злоупотреблений
- Шпаргалка по анализу поверхности атаки
- Шпаргалка по безопасному дизайну продукта
- Шпаргалка по массовому присваиванию
- Шпаргалка по предотвращению небезопасных прямых ссылок на объекты
- Шпаргалка по предотвращению подделки межсайтовых запросов
- Шпаргалка по предотвращению SSRF
- Шпаргалка по неверифицированным перенаправлениям
- Шпаргалка по отказу в обслуживании
Отраслевые стандарты:
- CWE/SANS Top 25 Most Dangerous Software Errors
- NIST Secure Software Development Framework (SSDF)
- ISO/IEC 27034 - Application Security
Дополнительные ресурсы: