Материал

Как принять код от подрядчика и не получить скрытые риски

Чек-лист и практическое руководство для 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. Чтобы иметь рычаги влияния, нужно зафиксировать требования в договоре:

  1. Перечень допустимых open source лицензий (запрет AGPL, GPL без явного согласования).
  2. Обязательство передавать SBOM (Software Bill of Materials) с каждым релизом.
  3. Запрет на хардкодирование секретов; требование использовать только переменные окружения.
  4. Стандарты кодирования: OWASP Secure Coding Practices или внутренние гайдлайны.
  5. Право на аудит зависимостей и истории git.
  6. Обязательство уведомить о новых 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 перед слиянием кода подрядчика в основную ветку.

Зависимости и состав

  1. Запущен SCA-сканер, нет CVE уровня Critical без обоснования или плана устранения.
  2. Лицензионный состав проверен: нет AGPL/GPL-компонентов без явного согласования с юристами.
  3. Все зависимости зафиксированы в lock-файлах с конкретными версиями, не с floating-диапазонами.
  4. Нет неиспользуемых или «лишних» зависимостей, появившихся без объяснений.
  5. Получен SBOM или подрядчик может его предоставить.

Секреты и конфигурация

  1. Запущен сканер секретов по всей истории git (gitleaks, truffleHog), не только по последнему коммиту.
  2. В коде нет хардкодированных API-ключей, паролей, токенов, сертификатов.
  3. В конфигурационных файлах нет дефолтных паролей вендора или debug-режима, включённого для production.
  4. CORS не настроен на *, если явно не требуется.
  5. CI/CD-конфигурации проверены: минимально необходимые права на токены и секреты.

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

  1. SAST-сканер запущен, все Critical и High findings разобраны (исправлены или обоснованно исключены).
  2. Проверены эндпоинты авторизации и аутентификации.
  3. Проверена обработка пользовательского ввода в публичных API.
  4. Нет скрытых административных эндпоинтов или backdoor-паттернов.
  5. Внешние интеграции проверены: куда уходят данные, как обрабатываются ошибки, есть ли таймауты.

Документация и история

  1. Подрядчик предоставил описание архитектуры изменений.
  2. Описание PR/задачи соответствует фактическим изменениям в diff.
  3. История коммитов читаема и не содержит «чудо-коммитов» с огромным 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]. Новый класс конфигурационных файлов — новая поверхность атаки.

Заключение: что делать прямо сейчас

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

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

Три шага, с которых можно начать сегодня:

  1. Запустите SCA-сканер и сканер секретов по репозиторию с кодом последнего подрядчика. Посмотрите на результаты.
  2. Добавьте в договор с подрядчиками два пункта: обязательство передавать SBOM и запрет на использование GPL/AGPL без согласования.
  3. Настройте автоматический блокирующий 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/

Нужен такой же контроль в ваших изменениях и релизах?

Покажем пример такого замечания на вашем сценарии и соберём пилотный контур без лишней суеты.

Запросить пилот Все статьи
Дальше по теме

Ещё материалы

Все статьи
24 июня 2026 18 мин

Политика использования ИИ в команде разработки: как не опоздать, когда всё уже идёт

Если разработчики уже пишут код с ИИ ассистентами, политика нужна сегодня — а не после первого инцидента TL;DR Более 84% разработчиков уже используют или планируют использовать ИИ инструменты 1 , и большинство делают эт…

Открыть материал
23 июня 2026 16 мин

Регистрация и онбординг пользователей: где появляются первые уязвимости

Форма регистрации выглядит просто. За ней скрывается один из наиболее атакуемых периметров приложения. TL;DR Форма регистрации и онбординг флоу — это первая поверхность атаки, которую видит злоумышленник. Большинство уя…

Открыть материал
23 июня 2026 15 мин

Бизнес-логика и мошенничество в продукте: что проверять до запуска

Ваш продукт работает правильно. Но это не значит, что он работает безопасно. TL;DR Уязвимости бизнес логики — это не сломанный код, а сломанные правила: приложение делает именно то, что написано, но не то, что задумывал…

Открыть материал