Поддерживаемые экосистемы и способы анализа¶
Манифесты¶
Для поиска зависимостей CodeScoring в первую очередь опирается на разбор файлов манифестов пакетных менеджеров. Платформа поддерживает разбор следующих технологий:
| Экосистема | Пакетный менеджер или инструмент сборки | Формат файла |
|---|---|---|
| Java и Kotlin | Gradle | *.gradle*.gradle.ktsgradle-dependency-tree.txtgradle.lockfile |
| Maven | pom.xmlmaven-dependency-tree.txt |
|
| Apache Ivy | ivy.xml |
|
| JavaScript и TypeScript | npm | package.jsonpackage-lock.jsonnpm-shrinkwrap.json |
| yarn | yarn.lockpackage.jsonpackage-lock.json |
|
| pnpm | pnpm-lock.yaml |
|
| Python | pip | requirements.txtrequirements.piprequires.txtpip-resolved-dependencies.txtpipdeptree.txt |
| Poetry | pyproject.tomlpoetry.lock |
|
| Pipenv | PipfilePipfile.lock |
|
| Conda | environment.ymlmeta.ymlconda-lock.yml |
|
| uv | pyproject.tomluv.lock |
|
| C и C++ | Conan | conanfile.txtconan.lockconanfile.py |
| GCC, Clang, CMake, Make и др. | Сканирование сборки | |
| Go | Go Modules | go.modgo.sum |
| PHP | Composer | composer.jsoncomposer.lock |
| Ruby | RubyGems | GemfileGemfile.lock*.gemspecgems.lockedgems.rb |
| .NET | Nuget | *.nuspecpackages.lock.jsonProject.jsonProject.lock.jsonpackages.config*.csprojproject.assets.jsondependencyReport.jsondeps.json*.sln |
| Paket | paket.dependenciespaket.lock |
|
| Objective-C | CocoaPods | PodfilePodfile.lock*.podspec |
| Swift | Swift Package Manager | Package.swiftPackage.resolved |
| Rust | Cargo | Cargo.tomlCargo.lock |
| Scala | sbt | scala-dependency-tree.txtsbt-dependency-tree.txt |
Лучший результат будет при наличии основного файла манифеста и соответствующего lock-файла, если он предусмотрен механизмом пакетного менеджера.
Типы PURL и компонентов¶
Для унифицированного описания зависимостей CodeScoring использует стандарт Package URL (PURL).
При анализе SBOM через команду агента или импорте в платформу CodeScoring распознаёт и поддерживает следующие типы PURL в соответствии со спецификацией:
| Тип PURL | Описание | Спецификация |
|---|---|---|
cocoapods |
Библиотеки для Objective-C / Swift через CocoaPods | CocoaPods Definition |
conan |
Пакеты экосистемы C / C++ (Conan) | Conan Definition |
conda |
Пакеты экосистемы Python / Conda | Conda Definition |
nuget |
Компоненты .NET / NuGet | NuGet Definition |
golang |
Пакеты Go Modules | Go Definition |
maven |
Артефакты Java / Kotlin (Maven / Gradle) | Maven Definition |
npm |
Пакеты JavaScript / TypeScript | NPM Definition |
composer |
Пакеты PHP (Composer) | Composer Definition |
pypi |
Пакеты Python (PyPI) | PyPI Definition |
gem |
Пакеты Ruby (RubyGems) | RubyGems Definition |
cargo |
Пакеты Rust (Cargo) | Cargo Definition |
generic |
Общий тип для произвольных бинарных или кастомных артефактов | Generic Definition |
apk |
Системные пакеты Alpine Linux | APK Definition |
deb |
Системные пакеты Debian / Ubuntu | DEB Definition |
rpm |
Системные пакеты RHEL / CentOS / Fedora | RPM Definition |
swift |
Пакеты Swift Package Manager | Swift Definition |
oci |
Контейнерные образы OCI / Docker | OCI Definition |
docker |
Образы Docker Hub / Docker | Docker Definition |
github |
Репозитории GitHub | GitHub Definition |
huggingface |
Модели Hugging Face Hub | HuggingFace Definition |
mlflow |
Модели MLflow Model Registry | MLflow Definition |
pub |
Пакеты Dart / Flutter (pub.dev) | Pub Definition |
swid |
SWID-теги (Software Identification Tags) | SWID Definition |
Каждый компонент с PURL классифицируется по типу, который CodeScoring распознаёт при импорте SBOM-файлов. Тип указывается в поле type внутри описания компонента.
Различие типов PURL и компонентов
Тип компонента описывает его функциональную роль внутри продукта — например, библиотека, фреймворк или встроенное ПО. Тип PURL, в свою очередь, определяет экосистему и источник, из которого этот компонент был получен.
Пример компонента в SBOM
Поддерживаются следующие типы компонентов:
| Тип компонента | Описание |
|---|---|
| library | Библиотека, пакет или модуль стороннего кода, используемый в проекте. |
| framework | Инфраструктурный или прикладной фреймворк, включающий набор библиотек. |
| firmware | Исполняемый бинарный образ или встроенное ПО, анализируемое на наличие сторонних компонентов. |
Системные пакеты¶
В рамках работы модуля OSA платформа поддерживает разбор системных пакетов следующих форматов:
Механизм резолва при отсутствии lock-файла¶
При отсутствии lock-файла для некоторых пакетных индексов система выполняет разрешение транзитивных OSS зависимостей следующим образом:
- Maven
- для формата pom.xml и build.gradle генерация maven-dependency-tree через соответствующий плагин maven
- используются Maven версии 3.8.8 и OpenJDK версии 11
- PyPi
- генерация poetry.lock с помощью пакетного менеджера Poetry
- используется Python версии 3.11.7
- NPM
- генерация yarn.lock с помощью пакетного менеджера Yarn
- используется Node.js версии 20.9.0
- Nuget
- для формата csproj и sln генерация project.assets.json с помощью встроенных инструментов nuget
- используется .NET SDK версии 8.0.404
- Packagist
- генерация composer.lock с помощью пакетного менеджера Composer
- используется PHP версии 8.2.26
- Rubygems
- генерация Gemfile.lock с помощью пакетного менеджера Bundler
- используется Ruby версии 3.1.2p20
Самостоятельная генерация lock-файлов системой не может давать результат в 100% случаев, так как результат часто зависит от окружения.
Разрешение зависимостей в окружении¶
Пакетные менеджеры некоторых экосистем по умолчанию не включают транзитивные зависимости в манифесты. Для качественного проведения композиционного анализа при работе с ними рекомендуется применять механизм разрешения зависимостей в окружении сборки.
При разрешении зависимостей в окружении система проверяет отсутствие lock-файла, самостоятельно запускает пакетный менеджер или инструмент сборки и формирует полный список компонентов с учетом корректной версии сборки. На данный момент функциональность доступна для следующих экосистем:
- .NET
- Go
- Gradle
- Maven
- npm
- Poetry
- sbt
- yarn
- Conda
Механизм поиска зависимостей по хэшам¶
Поиск по хэшам подразумевает определение непосредственного включения библиотек в код проектов путём копирования. В рамках этого механизма происходит хэширование всех файлов проекта и сверка этих сигнатур с известными нам open source библиотеками.
В данный момент поиск по хэшам происходит для следующих индексов пакетных менеджеров по следующим типам файлов:
- Maven
.jar.war.ear
- npm
.min.js
- PyPI
.whl.egg
- Nuget
.nupkg
От платформы в облако не уходят хэши файлов, размер которых не превышает 512 байт.
Сканирование сборки для языков C и C++¶
В случае, если для сборки C/С++ проекта не используется пакетный менеджер Conan и соответствующие манифесты, для получения списка используемых библиотек можно использовать специальный режим для анализа вывода процесса сборки.
В данном режиме консольный агент Johnny анализирует процесс сборки, используя флаги компилятора и выявляя использованные библиотеки. Далее с помощью системного кэша определяется местоположение библиотек и их источник.