Как принять код от подрядчика и не получить скрытые риски
Чек-лист и практическое руководство для CTO, Tech Lead и AppSec-инженера
Почему это проблема сегодня, а не когда-нибудь потом
Аутсорсинг разработки стал стандартной практикой. Внешние команды пишут отдельные модули, интеграции с внешними сервисами, MVP и сервисы внутренней автоматизации. При этом внутренний контроль изменений зачастую не поспевает за темпом приёмки.
Типичная картина выглядит так: подрядчик присылает финальный Pull Request или архив с кодом, дедлайн горит, несколько человек бегло смотрят в PR, убеждаются, что «вроде работает», и мёрджат. Security-ревью — если оно вообще есть — превращается в формальность. Инструменты сканирования либо не настроены на чужой код, либо их результаты никто не читает до конца.
Проблема не в доверии к конкретному подрядчику. Проблема в том, что даже добросовестный исполнитель может принести:
- зависимость с незакрытой CVE, о которой он не знал;
- библиотеку с вирусной лицензией (GPL/AGPL), которая создаёт юридическое обязательство;
- хардкодированный секрет, который остался из тестовой среды;
- CI/CD-конфигурацию с избыточными правами;
- транзитивную зависимость, которую никто не запрашивал явно, но которая несёт в себе уязвимость.
По данным Verizon DBIR 2025, доля взломов с участием третьей стороны удвоилась год к году и достигла 30% [1]. Sonatype в отчёте 2024 года зафиксировали удвоение атак на цепочку поставок в том же году [4]. OWASP Top 10 2025 ввёл отдельную категорию A03: Software Supply Chain Failures — она набрала наибольший средний показатель распространённости в 5,19% среди всех изученных приложений [5].
Что именно идёт не так: карта рисков
Разберём, где конкретно возникают проблемы при приёмке кода от внешней команды.
1. Уязвимые зависимости
Современное приложение на 70–90% состоит из стороннего кода: библиотек, фреймворков, опенсорс-компонентов [6]. Подрядчик добавляет зависимости, которые работают у него в окружении, но не проходили аудит с вашей стороны.
По данным Synopsys 2024 Open Source Security and Risk Analysis, 91% изученных кодовых баз содержали компоненты, которые на 10 и более версий отстают от актуального релиза [7]. Согласно исследованию Veracode 2024, около 70% приложений содержат уязвимости именно в коде сторонних библиотек, а время устранения таких уязвимостей в среднем на 50% больше, чем для первичного кода [2].
Особенно коварны транзитивные зависимости — те, что вы не запрашиваете явно, но которые автоматически подтягиваются как зависимости зависимостей. По данным AppSec Santa, 95% уязвимостей находятся именно в транзитивных, а не в прямых зависимостях [8]. При этом 80% корпоративных зависимостей остаются необновлёнными больше года.
2. Хардкодированные секреты и утечки из истории git
По данным GitGuardian, в 2025 году в публичные репозитории GitHub было загружено 28,65 млн новых хардкодированных секретов — на 34% больше, чем в 2024 году [3]. GitHub самостоятельно зафиксировал 39 млн утечек секретов в 2024 году [9].
Подрядчики особенно уязвимы в этом отношении: они могут использовать тестовые ключи из вашей staging-среды, конфигурации с реальными токенами, .env-файлы с паролями. Даже если секрет удалён из последнего коммита, он остаётся в истории git — навсегда, пока история не будет перезаписана.
Отдельная проблема — приватные репозитории. GitGuardian выяснил, что внутренние репозитории в 6 раз чаще содержат хардкодированные секреты, чем публичные (32,2% против 5,6%) [3]. Разработчики внутри периметра чаще «забывают» об осторожности.
AI-инструменты усугубляют ситуацию. Репозитории с GitHub Copilot демонстрируют утечку секретов на уровне 6,4% — примерно в 1,4 раза выше базового уровня [10].
3. Небезопасная конфигурация и CI/CD
Подрядчики нередко сдают не только код приложения, но и конфигурацию пайплайнов, docker-образы, terraform-манифесты, workflow-файлы для GitHub Actions. Именно эти файлы читают хуже всего при приёмке.
Типовые проблемы:
- избыточные права в CI/CD (например, токен с write-доступом ко всему репозиторию вместо минимального);
- широкий CORS с
*вместо конкретного списка доменов; - debug-настройки, оставшиеся включёнными в prod-конфигурации;
- fallback-ключи или дефолтные пароли вендора, которые подрядчик не сменил.
По данным OWASP Secure Coding Practices, одной из первых задач при ревью стороннего кода является проверка и замена всех паролей и идентификаторов по умолчанию, поставляемых вендором [11].
4. Лицензионные риски
Это риск, о котором вспоминают в последнюю очередь — чаще всего уже в процессе M&A due diligence или при получении претензии.
Если подрядчик использовал библиотеку под GPL или AGPL, это может создать обязательство открыть исходный код вашего продукта. По данным Synopsys 2024, более 53% кодовых баз имеют конфликты лицензий опенсорс-компонентов [7]. Показательный прецедент: в 2024 году дело Software Freedom Conservancy против Vizio устояло при попытке ответчика добиться отклонения иска — суд постановил, что потребители имеют право требовать исполнения условий GPL как третьи бенефициары [12].
AGPL — отдельная история для SaaS: лицензия распространяется не только на дистрибуцию, но и на предоставление доступа по сети. Именно поэтому компании вроде Google запрещают использование AGPL-кода во внутренних продуктах [13].
5. Недокументированная бизнес-логика и скрытые backdoor-паттерны
Если подрядчик передаёт код без нормальной документации и без возможности верифицировать историю разработки, вы принимаете чёрный ящик. Уязвимости бизнес-логики — неправильные проверки авторизации, обходы access control, скрытые административные эндпоинты — не детектируются автоматическими сканерами и требуют ручного ревью.
По данным OWASP Cheat Sheet по secure code review, полноценный процесс ревью включает помимо SAST и ручную проверку логики: анализ trust boundaries, потоков данных, контроля доступа и особенно того, что подрядчик делает со входящими пользовательскими данными [14].
Что проверять и когда: практический фреймворк
Надёжная приёмка кода — это не одно большое ревью перед слиянием, а несколько уровней контроля, каждый из которых закрывает свой класс рисков.
До начала работы: договорная база
Проблемы с безопасностью кода от подрядчика начинаются задолго до финального PR. Чтобы иметь рычаги влияния, нужно зафиксировать требования в договоре:
- Перечень допустимых open source лицензий (запрет AGPL, GPL без явного согласования).
- Обязательство передавать SBOM (Software Bill of Materials) с каждым релизом.
- Запрет на хардкодирование секретов; требование использовать только переменные окружения.
- Стандарты кодирования: OWASP Secure Coding Practices или внутренние гайдлайны.
- Право на аудит зависимостей и истории git.
- Обязательство уведомить о новых CVE в использованных компонентах в течение согласованного срока.
Venable LLP (2026) специально акцентирует, что без явных договорных обязательств по раскрытию состава open source управление лицензионным риском остаётся реактивным, а не управляемым [15].
При получении кода: первичный инспекционный слой
До того как код попадёт в основную ветку, выполните следующее:
Сканирование секретов и истории git Запустите gitleaks, truffleHog или аналог по всей истории коммитов — не только по последнему состоянию. Исследования GitHub Docs подтверждают: секреты сохраняются в истории git даже после удаления из текущего кода, распространяются в форки, CI/CD-логи и резервные копии [9].
SCA — анализ состава зависимостей SCA-инструменты (Dependabot, Snyk, FOSSA, Black Duck) сканируют манифесты зависимостей и сверяют с базами CVE (NVD, GitHub Security Advisories). Важно запускать SCA раньше SAST: подрядчик часто «привозит» именно зависимости с известными CVE, а не уязвимый собственный код [16].
На что смотреть:
- прямые зависимости с известными CVE уровня High/Critical;
- транзитивные зависимости — они составляют 90% от всех зависимостей, по данным Ivanti 2025 [17];
- версии, зафиксированные в lock-файлах (package-lock.json, poetry.lock, go.sum);
- неиспользуемые зависимости, которые были добавлены без объяснений.
Проверка лицензий SCA-инструменты с лицензионным модулем автоматически выявляют зависимости под вирусными лицензиями. Минимальный флаг: любое использование GPL, AGPL, LGPL требует оценки того, как именно используется компонент — статическая линковка, динамическая или сетевой доступ.
SAST — статический анализ SAST-сканер (SonarQube, Semgrep, Checkmarx) анализирует исходный код на типовые уязвимости: SQL-инъекции, XSS, небезопасная криптография, отсутствие валидации входных данных. SAST можно интегрировать в CI/CD как gate на PR: не прошёл сканирование — не мёрджится.
Важное ограничение: SAST не обнаруживает уязвимости бизнес-логики. Инструмент видит шаблонные паттерны, но не понимает, правильно ли реализован контроль доступа именно в вашем контексте [18].
Ревью конфигурационных файлов
Этот слой — самый часто пропускаемый. При приёмке кода явно проверяйте:
- docker-compose.yml и Dockerfile — нет ли монтирования секретных директорий, привилегированных контейнеров, образов с тегом
latestбез пиннинга; - .github/workflows/ и аналоги в GitLab CI — какие секреты запрашиваются, какие permissions установлены на токены;
- конфигурационные файлы приложения — нет ли дефолтных паролей, широкого CORS, отключённого TLS, debug-режима.
Ручное ревью бизнес-логики
Автоматика закрывает известные паттерны. Ручное ревью нужно для:
- проверки потоков авторизации и аутентификации — где и как принимаются решения о доступе;
- анализа обработки ввода пользователя — особенно в API-эндпоинтах, принимающих данные без авторизации;
- проверки того, как подрядчик обращается с внешними интеграциями — куда уходят данные, какие таймауты, как обрабатываются ошибки;
- trust boundaries — код подрядчика доверяет вашему коду? Ваш — его? Это нужно сделать явным.
OWASP Code Review Guide описывает структурированный подход: подготовка → выполнение → отчёт → верификация исправлений [14].
Чек-лист приёмки кода: что проверять перед merge
Ниже — практический список, который команда может использовать как обязательный gate перед слиянием кода подрядчика в основную ветку.
Зависимости и состав
- Запущен SCA-сканер, нет CVE уровня Critical без обоснования или плана устранения.
- Лицензионный состав проверен: нет AGPL/GPL-компонентов без явного согласования с юристами.
- Все зависимости зафиксированы в lock-файлах с конкретными версиями, не с floating-диапазонами.
- Нет неиспользуемых или «лишних» зависимостей, появившихся без объяснений.
- Получен SBOM или подрядчик может его предоставить.
Секреты и конфигурация
- Запущен сканер секретов по всей истории git (gitleaks, truffleHog), не только по последнему коммиту.
- В коде нет хардкодированных API-ключей, паролей, токенов, сертификатов.
- В конфигурационных файлах нет дефолтных паролей вендора или debug-режима, включённого для production.
- CORS не настроен на
*, если явно не требуется. - CI/CD-конфигурации проверены: минимально необходимые права на токены и секреты.
Статический анализ и ручной осмотр
- SAST-сканер запущен, все Critical и High findings разобраны (исправлены или обоснованно исключены).
- Проверены эндпоинты авторизации и аутентификации.
- Проверена обработка пользовательского ввода в публичных API.
- Нет скрытых административных эндпоинтов или backdoor-паттернов.
- Внешние интеграции проверены: куда уходят данные, как обрабатываются ошибки, есть ли таймауты.
Документация и история
- Подрядчик предоставил описание архитектуры изменений.
- Описание PR/задачи соответствует фактическим изменениям в diff.
- История коммитов читаема и не содержит «чудо-коммитов» с огромным diff без объяснений.
Типичные ошибки при приёмке
«Тесты проходят — значит безопасно» Тесты верифицируют функциональность, не безопасность. Они не обнаруживают уязвимые зависимости, секреты в истории git или неправильные проверки авторизации.
«Это внутренний инструмент, значит можно упростить» Внутренние инструменты, миграции и CI/CD-скрипты читают и проверяют хуже всего. При этом они зачастую имеют расширенные права доступа к инфраструктуре.
«SCA запустили один раз при приёмке — достаточно» Зависимости стареют. CVE публикуются постоянно. Snyk, Dependabot и аналоги нужно запускать в CI/CD непрерывно, а не только в момент приёмки.
«Подрядчик не злоумышленник, поэтому backdoor не ищем» Проблема не в умысле. Проблема в том, что подрядчик мог использовать скомпрометированный пакет, не зная об этом. По данным Sonatype, в 2024 году в открытых реестрах было зафиксировано более 512 847 вредоносных пакетов — рост на 156% год к году [4].
«Лицензии — это проблема юристов, не разработчиков» К тому моменту, когда юристы обнаруживают AGPL-компонент в закрытом продукте, исправить ситуацию без переписывания части кода уже невозможно. Это нужно ловить до merge.
Кейсы и примеры из практики
XZ Utils (2024) — один из самых обсуждаемых supply chain-инцидентов: бэкдор был внедрён через социальную инженерию против мейнтейнера проекта, а не через прямой взлом. Вредоносный код попал в утилиту сжатия, используемую в миллионах Linux-систем. ReversingLabs в 2025-м назвали этот случай примером растущей изощрённости атак на цепочку поставок [19].
axios (npm, 2025) — аккаунт мейнтейнера был захвачен, в релизах 1.14.1 и 0.30.4 появилась скрытая зависимость, устанавливавшая RAT (remote access trojan). Это один из крупнейших supply chain-инцидентов по числу загрузок [20].
SolarWinds (2020) — классический пример: злоумышленники встроили вредоносный код в процесс сборки, и он был подписан и распространён как легитимное обновление более чем 18 000 организациям, включая государственные структуры США [4].
Все три случая объединяет одно: компрометация произошла не в собственном коде пострадавших компаний, а в компонентах, которым они доверяли.
Как встроить контроль в процесс, не замедляя разработку
Страх замедлить delivery — главная причина, по которой команды пропускают security-ревью. Но большинство проверок можно автоматизировать.
Практический подход по уровням:
Автоматические блокеры на PR Настройте CI/CD так, чтобы PR не мог быть смёрджен, если: обнаружены Critical CVE в зависимостях; сканер секретов нашёл хардкодированные данные; SAST-гейт не пройден. Это занимает минуты на настройку и не требует ручного участия в рутинных случаях.
Асинхронное ревью для Medium-находок Находки уровня Medium и ниже не должны блокировать merge, но должны попасть в трекер задач с конкретным дедлайном. Избегайте паттерна, при котором все находки вываливаются в один длинный отчёт и никто не знает, что из этого действительно критично.
Ручной фокус на логике Ручное ревью — для архитектурных решений, граничных случаев бизнес-логики, нестандартных интеграций. Это то, что автоматика не заменит.
Практический вывод из рекомендаций по русскоязычному рынку: начните с SCA + secret scanning + простого PR-чек-листа, затем добавляйте блокировки только для новых критичных находок, а исключения оформляйте со сроком действия [21].
Именно здесь появляется потребность в дополнительном слое контроля, встроенном в сам процесс приёмки. HighVibe работает как gate на уровне конкретного изменения: анализирует PR, зависимости, конфиги и контекст релиза, формулирует короткий и понятный сигнал — что именно критично прямо сейчас и можно ли безопасно принять именно это изменение. Не очередной длинный отчёт, а ответ на вопрос «мёрджить или нет».
Будущее: куда движется область
Несколько трендов, которые будут усиливаться:
AI-ассистенты усугубляют утечку секретов. По данным GitGuardian 2026, AI-assisted commits демонстрируют ставку утечки секретов в 3,2% — примерно вдвое выше базовой. Рост AI-кодинга означает рост этой проблемы [3].
Регуляторные требования к SBOM усиливаются. Директива ЕС Cyber Resilience Act обязывает поставщиков публиковать SBOM и обеспечивать безопасность продукта по умолчанию. Американские Executive Orders вводят требования по управлению рисками цепочки поставок [22]. Для команд, работающих с заказчиками из ЕС или US federal, SBOM из опции превращается в обязательство.
Атаки на цепочку поставок кратно растут. По данным Cyble, в октябре 2025 года число supply chain-атак установило новый рекорд — на 30% выше предыдущего пика. С апреля 2025 года среднемесячное число атак более чем удвоилось [23].
Практика MCP-конфигов как новой утечки. GitGuardian 2026 зафиксировал 24 008 уникальных секретов, экспонированных в MCP-конфигурациях на публичном GitHub в 2025 году [3]. Новый класс конфигурационных файлов — новая поверхность атаки.
Заключение: что делать прямо сейчас
Приёмка кода от подрядчика — это точка наибольшего риска в цепочке изменений. Именно здесь в кодовую базу попадает то, что команда не писала, не проверяла досконально и часто не понимает на уровне деталей реализации.
Хорошая новость: большинство рисков можно закрыть систематически, без замедления разработки, если встроить проверки в процесс, а не делать их постфактум.
Три шага, с которых можно начать сегодня:
- Запустите SCA-сканер и сканер секретов по репозиторию с кодом последнего подрядчика. Посмотрите на результаты.
- Добавьте в договор с подрядчиками два пункта: обязательство передавать SBOM и запрет на использование GPL/AGPL без согласования.
- Настройте автоматический блокирующий gate на PR: Critical CVE + хардкодированные секреты = запрет на merge без ручного разбора.
Это не про паранойю и не про бюрократию. Это про то, чтобы иметь контроль над тем, что попадает в ваш продукт — особенно когда это написал кто-то другой.
Источники
[1] Verizon — "2025 Data Breach Investigations Report" — https://www.verizon.com/business/resources/reports/dbir/
[2] Veracode — "State of Software Security 2024" — https://www.veracode.com/blog/addressing-threat-security-debt-unveiling-state-software-security-2024/
[3] GitGuardian / Passwork — "The State of Secrets Sprawl 2026: Key findings" — https://passwork.pro/blog/the-state-of-secrets-sprawl-in-2026/
[4] Sonatype — "State of the Software Supply Chain 2024: 10-Year Look" — https://www.sonatype.com/state-of-the-software-supply-chain/2024/10-year-look
[5] OWASP — "A03:2025 – Software Supply Chain Failures" — https://owasp.org/Top10/2025/A03_2025-Software_Supply_Chain_Failures/
[6] Wiz — "SCA Scanning: Definition, Process and License Compliance" — https://www.wiz.io/academy/application-security/sca-scanning
[7] Synopsys / Wiz — "2024 Open Source Security and Risk Analysis" — https://www.wiz.io/academy/application-security/sca-scanning
[8] AppSec Santa — "Supply Chain Attack Statistics 2026: 65+ Key Facts & Data" — https://appsecsanta.com/research/supply-chain-attack-statistics
[9] GitHub Docs — "Secret leakage risks" — https://docs.github.com/en/code-security/concepts/secret-security/secret-leakage-risks
[10] Snyk — "Why 28 million credentials leaked on GitHub in 2025, and what to do about it" — https://snyk.io/articles/state-of-secrets/
[11] OWASP — "Secure Coding Practices – Quick Reference Guide" — https://owasp.org/www-project-secure-coding-practices-quick-reference-guide/stable-en/02-checklist/05-checklist
[12] AppSec Santa — "Open Source License Compliance (2026)" — https://appsecsanta.com/sca-tools/open-source-license-compliance
[13] Google Open Source — "AGPL Policy" — https://opensource.google/documentation/reference/using/agpl-policy
[14] OWASP — "Secure Code Review Cheat Sheet" — https://cheatsheetseries.owasp.org/cheatsheets/Secure_Code_Review_Cheat_Sheet.html
[15] Venable LLP — "What Companies Get Wrong About Open-Source Software Licensing" — https://www.venable.com/insights/publications/ip-quick-bytes/what-companies-get-wrong-about-open-source
[16] CISOCLUB — "Заблуждения про анализ кода или зачем нужен SCA" — https://cisoclub.ru/zabluzhdeniya-pro-analiz-koda-ili-zachem-nuzhen-sca/
[17] Ivanti — "Software Supply Chain Attacks Risk on the Rise" — https://www.ivanti.com/blog/software-supply-chain-attack-risk
[18] Angara Security — "Правила код-ревью по безопасности для команд разработки" — https://www.angarasecurity.ru/stati/pravila-kod-revyu-po-bezopasnosti-dlya-komand-razrabotki-chek-listy-po-yazykam-i-tipovym-oshibkam/
[19] ReversingLabs — "2025 Software Supply Chain Security Report" — https://www.itcpeacademy.org/blog/research-120425
[20] StepSecurity — "Top 2024 Predictions for CI/CD Security" — https://www.stepsecurity.io/blog/top-2024-predictions-for-ci-cd-security
[21] Softogon — "Безопасность в ПО: типовые уязвимости и как закрывать их на уровне процесса" — https://softogon.ru/obzory-programm/bezopasnost-v-po-tipovye-uyazvimosti-i-kak-zakryvat-ih-na-urovne-proczessa/
[22] GoCodeo — "Supply Chain Security in 2025: Addressing Threats from Code to Deployment" — https://www.gocodeo.com/post/supply-chain-security-in-2025-addressing-threats-from-code-to-deployment
[23] Industrial Cyber — "Software supply chain attacks surge, as ransomware groups escalate" — https://industrialcyber.co/reports/software-supply-chain-attacks-surge-as-ransomware-groups-escalate-and-industrial-sectors-face-more-exposure/