При заказе аудита безопасности исходного кода легко получить не тот результат, на который рассчитывали. В предложении могут обещать «полный SAST и ручной анализ», но не назвать коммит, профиль сборки, принятые анализатором файлы, исключённый из ручной проверки код и доказательства, необходимые для закрытия находки. В отчёте окажутся полезные дефекты, однако связать их с конкретным релизом будет невозможно.

Заказчику нужен конкретный ответ: какой код и какие критические для безопасности пути проверялись, какими методами, с какими ограничениями и как работа связана с артефактом, который планируется выпустить? Ответ должен оставаться понятным после передачи от команды безопасности разработчикам, релизному менеджеру, аудитору заказчика или специалисту, который позже будет проводить повторную проверку.

Эта статья объясняет, как зафиксировать объём проверки и критерии приёмки в техническом задании. Более широкий аудит безопасности приложения может также охватывать архитектуру, работающую инфраструктуру, API и операционные меры защиты. Анализ исходного кода рассматривает согласованное состояние репозиториев изнутри. Он помогает другим проверкам, но сам по себе не доказывает поведение развёрнутого сервиса и не подтверждает, что бинарный файл содержит только проверенный код.

Сначала определите решение, затем вид проверки

Назовите решение, которое должен поддержать аудит. Например, принять релиз-кандидат, исследовать критичный унаследованный компонент, предоставить независимые доказательства заказчику или проверить рискованное изменение до слияния. От решения зависит, нужен ли анализ базового состояния, проверка различий между версиями или их сочетание.

Анализ базового состояния описывает согласованную кодовую базу и подробно проверяет наиболее рискованные участки. Он подходит для первой независимой оценки или крупного релиза, но слово «базовый» не означает, что эксперт уделит одинаковое внимание каждой строке. Проверка различий рассматривает изменения между двумя неизменяемыми ревизиями и оценивает их влияние на существующие меры защиты и границы доверия. Такой подход экономит время при проверке очередного релиза, только если прежнее базовое состояние всё ещё актуально. Гибридный вариант прослеживает критичные пути в базовой версии, а затем проверяет изменения вокруг них.

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

Зафиксируйте объект проверки

Имя ветки или метка версии могут измениться. В описании границ следует указать каноническое расположение каждого репозитория и неизменяемый идентификатор коммита, а также ревизии подмодулей, если они используются. Зафиксируйте, получил ли аудитор чистый архив, read-only клон или временный доступ к платформе. Сохраните манифест, использованный в начале работ, и итоговый перечень проверенных и исключённых компонентов вместе с отчётом.

Затем опишите, как этот исходный код превращается в планируемый релиз. Полезная цепочка — не просто «проверен тег 3.4». Нужны коммит, состояние lock-файлов зависимостей, цель и режим сборки, значимые для безопасности флаги, входы генераторов, полученный артефакт и его криптографическая контрольная сумма либо другой неизменяемый идентификатор. Если конвейер уже формирует проверяемую запись о происхождении сборки, связанную с конкретным артефактом, такая запись укрепляет последнее звено. Но такая запись не доказывает надёжность сборки или безопасность программы; она лишь указывает, к какому артефакту относится утверждение о сборке.

Цепочка доказательств от границ проверки до исправления
  1. Базовое состояниеЗафиксировать репозитории, неизменяемые коммиты, подмодули, lock-файлы, цели сборки, предположения о конфигурации и исключения
  2. Охват анализатораСохранить версии инструментов и правил, режим сборки, целевые и пропущенные файлы, предупреждения, ошибки и обработку сгенерированного кода
  3. Ручная проверкаПроследить выбранные точки входа через идентификацию, авторизацию, преобразования, решения безопасности и чувствительные операции
  4. Релиз и ретестСвязать находки и исправления с ревизиями, пересобрать планируемый артефакт и проверить исходный путь и близкие варианты

Для компилируемых и генерируемых систем эта разница особенно важна. Некоторые анализаторы строят модель без сборки для поддерживаемых языков. Другие анализируют фактическую сборку, способ которой выбирается автоматически или задаётся явными командами; эти команды могут намеренно охватить только часть целей. Фраза «сканирование успешно» не отвечает на вопрос, какой исходный код попал в анализ. Требуйте режим и команду или цель сборки, сводку извлечения, предупреждения, пропущенные файлы и сверку с ожидаемым деревом репозитория.

Определите включённый код, исключения и конфигурацию

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

Для сгенерированного кода нужно отдельное решение. Проверка сгенерированного кода может выявить уязвимость, а для устойчивого исправления может понадобиться изменить генератор, схему, шаблон или его параметры. Исключение также может скрыть код, который реально исполняется. В перечне должны быть названы генератор и вход, указано, поставляется ли результат, и объяснено, какой слой проверяется. То же относится к собственным фреймворкам: если анализатор не понимает внутренний роутинг, оболочку авторизации, шаблонизатор или санитайзер, общий набор правил способен пропустить путь. Исполнитель должен раскрыть использованные модели, заглушки и собственные правила, а также оставшиеся ограничения анализа.

Конфигурация инструмента является доказательством. Сохраните версии анализатора и наборов правил, включённые и отключённые правила, фильтры серьёзности, включения и исключения путей, сбои языковых модулей, тайм-ауты, ошибки разбора и способность анализа пересекать границы файлов или функций. Разные редакции и режимы одного продукта могут иметь разную семантическую глубину. Счётчик на панели без такого контекста не показывает воспроизводимый охват.

Листайте таблицу по горизонтали

Слой проверкиЧто он способен установитьКакие доказательства запроситьКакую границу записать
SAST и семантический анализСовпадения правил и смоделированные потоки в реально проанализированных файлахВерсии инструмента и правил, режим сборки, цели, пропуски, предупреждения, сырые и разобранные результатыНеподдерживаемый язык, отсутствующая модель фреймворка, пофайловый режим, тайм-аут или ошибка разбора
Анализ зависимостейЗаявленные зависимости, фактически выбранные версии и применимые сигналы об уязвимостях или политикеLock-файлы, вывод резолвера, точное имя и версия пакета, обоснование достижимости, если она оцениваласьНеобъявленные, включённые в репозиторий, загружаемые во время исполнения или серверные компоненты
Проверка конфигурацииЗначимые для безопасности настройки и значения по умолчанию в переданных материалахИменованные профили, манифесты, предположения о среде и фактически применяемые значения, когда они доступныНепереданные секреты и production-переопределения; инфраструктура вне границ
Ручной анализКонтекст авторизации, потоков данных, состояний и бизнес-правил на выбранных путяхПеречень проверенных цепочек, точки входа, решения, чувствительные операции, записи эксперта и подтверждённые находкиНевыбранные пути, недоступные сервисы и предположения без проверки
Проверка работающей системы с опорой на кодВоспроизводится ли согласованное поведение в разрешённой сборке или средеИдентичность сборки и ревизии, учётные записи, запросы, ответы, журналы и условия тестаРасхождение с production, внешние сервисы, непроверенные роли и поведение только в production

Вручную проследите критические пути безопасности

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

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

Рассмотрим гипотетический сервис счетов для нескольких клиентов с разделением по контексту клиента (тенанта). Основной API получает контекст клиента из подписанного токена и вызывает общую функцию loadInvoice. Фоновый обработчик экспорта принимает идентификатор клиента из сообщения очереди и вызывает ту же функцию. Инструменты способны находить некоторые ошибки авторизации, но общие правила без знания этой прикладной связи могут не выдать предупреждение, хотя все значения корректны по типу. Эксперт выясняет, кто создаёт сообщение, связан ли указанный клиент с владельцем задания и проверяет ли функция это отношение. В перечне охвата должны быть обе точки входа, общий узел решения, операция экспорта и предположения, требующие динамического подтверждения.

Ручной охват выражайте проверенными путями и решениями, а не фразой «прочитано 70% кода». Ведите перечень цепочек аутентификации, авторизации, криптографии, десериализации, работы с файлами, построения команд и запросов, секретов, исходящих запросов, журналирования, административных действий и критичных переходов бизнес-процесса. Для каждой отметьте: прослежена вручную, проверена только инструментом, исследована выборочно, заблокирована или исключена — и укажите причину.

Подтвердите находки до приёмки отчёта

Автоматическое предупреждение — кандидат. Прежде чем назвать его уязвимостью, исполнитель должен проверить реальный путь вызовов, конфигурацию, предусловия, существующие меры защиты и вероятное влияние. Если это безопасно и разрешено, точечный тест согласованной сборки помогает отличить достижимую слабость от мёртвого кода или ошибочной модели. Когда динамическое подтверждение недоступно, отчёт должен сохранить неопределённость, а не подразумевать эксплуатацию.

Каждая принятая находка должна указывать затронутую ревизию, файл, символ или устойчивое место в коде; нарушенное правило безопасности; соответствующий путь от источника к чувствительной операции или цепочку авторизации; необходимые возможности атакующего и условия; влияние; уверенность; обоснование серьёзности и направление исправления. Номер строки устаревает сразу после изменения кода. Функция, путь, ревизия и короткий фрагмент доказательства делают запись долговечной.

Для триажа тоже нужен журнал. Сохраните сырые находки и решение по каждой: подтверждена, дубликат, ложное срабатывание, принятый риск, компенсирована другой мерой, не подтверждена или вне границ. Исчезновение предупреждения из следующего сканирования само по себе не доказывает исправление. Могло измениться или отключиться правило, файл мог попасть в исключения или исчезнуть, а запуск — пройти на другой ветке.

Отчёт должен объяснять и отрицательный результат. «Критичных находок нет» означает только, что применённые методы не подтвердили их в указанном объёме и за указанное время. Это не сертификация и не доказательство отсутствия уязвимостей. Пример отчёта о пентесте показывает необходимый уровень доказательств для технической находки, но приёмка анализа кода также требует ревизии, данных о сборке и перечня охвата.

Принимайте исправления по доказательствам, связанным с ревизией

Согласуйте условия повторной проверки до начала работ: какие уровни или находки входят, окно подачи исправлений, число циклов, материалы от разработчиков и необходимость поиска вариантов той же ошибки. Каждое исправление должно поступать как неизменяемая ревизия или узкий diff, связанный с исходной находкой. Проверяющий оценивает изменённую меру защиты, исходный уязвимый путь, ожидаемые соседние варианты и новое поведение, появившееся из-за патча.

Заранее договоритесь о смысле статусов закрытия и не смешивайте их. Например, исправлено может означать, что проверенное изменение устраняет причину, а исходная слабость не воспроизводится согласованным методом в сопоставимых условиях. При повторной проверке только исходного кода всё равно сохраняется неопределённость о поведении во время исполнения. Частично исправлено может означать, что риск снизился, но путь или вариант остался. Компенсировано — что другая мера ограничивает влияние при сохранении причины. Риск принят — решение владельца, а не техническое исправление. Нельзя подтвердить фиксирует нехватку сборки, доступа или данных о среде.

Для гипотетической ошибки экспорта убедительный ретест включает коммит исправления, изменённые проверки при создании задания и в воркере, тесты изоляции данных и заданий разных клиентов, анализ других вызовов loadInvoice и — если динамическая проверка входит в объём — доказательства из сборки этой ревизии. Закрытая задача или пропавшее предупреждение слабее. Отдельное руководство объясняет, как строить валидацию исправлений для находок и их вариантов.

Защитите исходный код и согласуйте результат аудита

До выдачи доступа согласуйте, кто видит исходный код, где могут существовать копии, как журналируется доступ, участвуют ли субподрядчики, сколько хранятся рабочие копии и журналы и как подтверждается удаление. Где возможно, используйте контролируемые тестовые учётные данные, а для действительно необходимых доказательств о секретах согласуйте защищённый порядок обращения. Документируйте каждое скрытие или замену данных: они меняют переданную базовую версию и способны скрыть значимый путь. Предпочитайте read-only и ограниченный по времени доступ, если он позволяет выполнить методику.

Для анализа с помощью ИИ или облачного сервиса нужна отдельная граница. Исполнитель должен назвать, какие фрагменты кода, находки, промпты, метаданные и журналы покидают среду заказчика; какой сервис и регион их принимают; условия хранения и обучения; сторонних обработчиков данных; доступ операторов; локальную или офлайн-альтернативу. Согласуйте, считается ли текст репозитория недоверенным входом для агента и какие действия агенту разрешены. Фразы «мы используем ИИ» и «мы не обучаемся на ваших данных» не описывают поток данных.

Цена и срок должны зависеть от объёма доказательств: языков и нестандартности фреймворков, числа целей сборки, сложности зависимостей и генерации, критичных путей, готовности среды, глубины подтверждения и циклов ретеста. Сравнивайте предложения по одной матрице охвата. Низкая фиксированная цена может быть разумна для узкого diff, но её нельзя честно сопоставить с базовым анализом, собственными моделями и динамическим подтверждением.

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

Если важно влияние во время исполнения, закажите этот этап явно. Согласованный white-box пентест веб-приложения может использовать исходный код для точной проверки работающей системы, а анализ кода — объяснить путь реализации. С Pentest.red можно согласовать пентест с доступом к исходному коду или проверку конкретных сценариев с опорой на код. Работы с исходниками, разрешённые действия и ожидаемый результат нужно прямо перечислить в техническом задании. Начните с планировщика объёма пентеста, чтобы записать системы, ревизии, роли, доказательства сборки, исключения, правила обращения с кодом и материалы для приёмки. Вы получите техническую оценку согласованного объёма и доказательства найденных проблем. Такой результат не является сертификацией или гарантией обнаружения всех уязвимостей.

PENTEST.RED

Обсудить объём и стоимость пентеста

Сначала согласуем системы, доступы, ограничения и ожидаемый результат.

Подготовить контур проверки

Статья подготовлена на основе глубокого исследования и прошла редакционную переработку.

PENTEST.RED / RED JOURNAL