
Сканер уязвимостей зависимостей следующего поколения с анализом достижимости, генерацией SBOM, аудитом лицензий и сканированием образов контейнеров для интеграции в CI/CD.
# Введение
OWASP dep-scan — это инструмент аудита безопасности и рисков нового поколения, основанный на известных уязвимостях, рекомендациях и лицензионных ограничениях для зависимостей проекта. В качестве входных данных поддерживаются как локальные репозитории, так и образы контейнеров, а инструмент идеально подходит для интеграции с платформами ASPM/VM и в средах CI.
<img src="https://assets.kitploit.com/production/public/readmes/6282/1f4ac5f4ee45d7e9ba8026acc4ae2458bdf23f5e9119eb9f85536cf101d0e56f.png" width="200" height="auto" />
[](https://github.com/cdxgen/cdxgen) [](https://github.com/owasp-dep-scan/dep-scan/actions/workflows/pythonpublish.yml)
## Содержание
- [Возможности](#features)
- [Точные достижимые потоки данных](#precise-reachable-data-flows)
- [Матрица достижимости](#reachability-matrix)
- [Достижимость Rust (через rusi)](#rust-reachability-via-rusi)
- [Достижимость Go (через golem)](#go-reachability-via-golem)
- [Достижимость .NET (через dosai)](#net-reachability-via-dosai)
- [Достижимость JVM, JavaScript, Python и PHP (через atom)](#jvm-javascript-python-and-php-reachability-via-atom)
- [Источники данных об уязвимостях](#vulnerability-data-sources)
- [Дистрибутивы Linux](#linux-distros)
- [Быстрый старт](#quick-start)
- [Сканирование проектов локально (версия на Python)](#scanning-projects-locally-python-version)
- [Homebrew (macOS и Linux)](#homebrew-macos-and-linux)
- [Автономные бинарные файлы (без Python или Node.js)](#standalone-binaries-no-python-or-nodejs-required)
- [Сканирование контейнеров локально (версия на Python)](#scanning-containers-locally-python-version)
- [Сканирование проектов локально (контейнер Docker)](#scanning-projects-locally-docker-container)
- [Серверный режим](#server-mode)
- [Локальная разработка](#local-development)
- [Документация (depscan.readthedocs.io)](https://depscan.readthedocs.io)
- [Лицензия](#license)
## Возможности
- Сканирование большей части кода приложений (локальные репозитории, образы контейнеров Linux, манифесты Kubernetes и ОС) для выявления известных CVE с приоритизацией
- Выполнение расширенного анализа достижимости для нескольких языков (см. [матрицу достижимости](#reachability-matrix) ниже)
- Сканирование уязвимостей пакетов выполняется локально и довольно быстро. Сервер не используется
- Генерация спецификации программного обеспечения (SBOM) с информацией из отчёта о раскрытии уязвимостей (VDR)
- Генерация документа VEX в формате Common Security Advisory Framework (CSAF) 2.0/2.1 (см. [CSAF Readme](https://github.com/owasp-dep-scan/dep-scan/blob/master/contrib/CSAF_README.md))
- Выполнение глубокого аудита рисков пакетов для атак типа dependency confusion и рисков сопровождения (см. [документацию по аудиту рисков](https://depscan.readthedocs.io/adv-usage#package-risk-audit))
### Точные достижимые потоки данных
Подробные потоки данных для выявления как достижимых, так и недостижимых путей в вашем приложении на основе полного контекста.

### Матрица достижимости
dep-scan вычисляет достижимость для семи языковых экосистем с помощью четырёх слайсеров. Уязвимый пакет, код которого фактически находится на исполняемом пути, помечается как **Reachable** (достижимый), тогда как пакет, который лишь объявлен в BOM, но никогда не вызывается, таковым не является. Каждый слайсер передаёт данные в общий движок достижимости с ключами purl, поэтому поведение единообразно для всех языков. Достижимость включена по умолчанию (`--reachability-analyzer FrameworkReachability`); `SemanticReachability` дополнительно атрибутирует достигнутые сервисы, конечные точки и достижимость после сборки (бинарные файлы/контейнеры).
| Язык / экосистема | Движок достижимости | Анализатор по умолчанию |
| ---------------------------------- | ----------------------------------------------------- | ----------------------- |
| Java / JVM (Groovy, Kotlin, Scala) | [atom](https://github.com/AppThreat/atom) | `FrameworkReachability` |
| JavaScript / TypeScript | atom | `FrameworkReachability` |
| Python | atom | `FrameworkReachability` |
| PHP | atom | `FrameworkReachability` |
| Rust | [rusi](https://github.com/cdxgen/cdxgen-plugins-bin) | `FrameworkReachability` |
| Go | [golem](https://github.com/cdxgen/cdxgen-plugins-bin) | `FrameworkReachability` |
| .NET (C#, VB, F#, R) | [dosai](https://github.com/owasp-dep-scan/dosai) | `FrameworkReachability` |
Чтобы понять концепции, лежащие в основе достижимости и приоритизации, прочитайте главы [модель достижимости](https://depscan.readthedocs.io/concepts/reachability-model) и [приоритизация](https://depscan.readthedocs.io/concepts/prioritization). Практические примеры для каждого языка см. в [руководствах по языкам](https://depscan.readthedocs.io/languages/rust-reachability). О соответствии требованиям (VDR и CSAF VEX) см. [руководство по VDR](https://depscan.readthedocs.io/output/vdr-guide) и [руководство по CSAF VEX](https://depscan.readthedocs.io/output/vex-csaf-guide).
Достижимость включена по умолчанию в `--profile research`, который dep-scan использует, когда достижимость включена. Приведённых ниже команд достаточно для начала работы; руководства по языкам охватывают разрешение бинарных файлов, безопасность бэкенда и сети, требования к восстановлению и практические примеры на фикстурах в репозитории.
**Rust (rusi).** cdxgen запускает [rusi](https://github.com/cdxgen/cdxgen-plugins-bin) и сохраняет его отчёт, который dep-scan преобразует в общий конвейер, поэтому крейт, который действительно вызывается (например, `time::now()` для RUSTSEC-2020-0071), является достижимым, а тот, который просто присутствует, — нет. См. [руководство по достижимости для Rust](https://depscan.readthedocs.io/languages/rust-reachability).
```bash
depscan -i ./my-rust-app -o ./reports --profile research
```
**Go (golem).** dep-scan напрямую вызывает [golem](https://github.com/cdxgen/cdxgen-plugins-bin) для проектов на Go (требуется `go` в `PATH`), помечая модуль как Reachable, когда его функции находятся на трассируемом пути. Используйте `--go-analyzer-network offline` для недоверенных репозиториев с прогретым кэшем модулей. См. [руководство по достижимости в Go](https://depscan.readthedocs.io/languages/go-reachability).
```bash
depscan -i ./my-go-app -o ./reports -t go
```
**.NET (dosai).** cdxgen запускает [dosai](https://github.com/owasp-dep-scan/dosai), который выдаёт явный вердикт о достижимости для каждого пакета (`PackageReachability` с `ReachabilityKind` и `Confidence`), который dep-scan считает авторитетным, поэтому пакет NuGet, который действительно вызывается (например, `JsonConvert.DeserializeObject` на контролируемом входе), является Reachable. Сканируйте восстановленное дерево на наличие версионированных purl. См. [руководство по достижимости .NET](https://depscan.readthedocs.io/languages/dotnet-reachability).
```bash
depscan -i ./my-dotnet-app -o ./reports -t dotnet
```
**JVM, JavaScript/TypeScript, Python и PHP (atom).** Эти четыре экосистемы используют общий слайсер [atom](https://github.com/AppThreat/atom), который строит независимое от языка промежуточное представление и выполняет статическое слайсинг. См. [руководство по достижимости для JVM, JS, Python и PHP](https://depscan.readthedocs.io/languages/jvm-js-python-php-reachability).
```bash
depscan --profile research -t java -i ./my-java-app -o ./reports --explain
```
Чтобы выйти за пределы достижимости на уровне фреймворка к уровням эндпоинтов, сервисов и пост-сборочных артефактов, передайте `--reachability-analyzer SemanticReachability` вместе с `--bom-dir`, указывающим на lifecycle BOM-файлы. См. [руководство по семантической достижимости](https://depscan.readthedocs.io/analyzers/semantic-reachability).
### Понятная информация о CVE
Разбирайтесь в CVE без необходимости читать длинные описания.

### Автоматическая приоритизация
Сосредоточьтесь только на тех CVE, которые требуют вашего внимания.

### Будьте проактивны
Всегда оставайтесь на шаг впереди благодаря продвинутому прогнозированию уязвимостей и эксплойтов.

### Источники данных об уязвимостях
- OSV
- NVD
- GitHub
- NPM
- Linux [vuln-list](https://github.com/appthreat/vuln-list)
### Дистрибутивы Linux
- AlmaLinux
- Debian
- Alpine
- Amazon Linux
- Arch Linux
- RHEL/CentOS
- Rocky Linux
- Ubuntu
- OpenSUSE/SLES
- Photon
- Chainguard
- Wolfi OS
## Быстрый старт
dep-scan идеально подходит для использования в процессе непрерывной интеграции (CI) и в качестве локального инструмента разработки.
### Локальное сканирование проектов (версия на Python)
```bash
sudo npm install -g @cyclonedx/cdxgen
# Normal version recommended for most users (MIT)
pip install owasp-depscan
# For a full version with all extensions and server mode (Multiple Licenses)
pip install owasp-depscan[all]
```
Это установит две команды: `cdxgen` и `depscan`.
Вы можете вызвать команду сканирования напрямую с различными параметрами.
```bash
cd <project to scan>
depscan --src $PWD --reports-dir $PWD/reports
```
Полный список опций приведён ниже:
```text
usage: depscan [-h] [--config CONFIG] [--no-banner] [-i SRC_DIR_IMAGE] [-o REPORTS_DIR] [--csaf]
[--profile {appsec,research,operational,threat-modeling,license-compliance,generic,machine-learning,ml,deep-learning,ml-deep,ml-tiny}]
[--lifecycle {pre-build,build,post-build} [{pre-build,build,post-build} ...]]
[--technique {auto,source-code-analysis,binary-analysis,manifest-analysis,hash-comparison,instrumentation,filename} [{auto,source-code-analysis,binary-analysis,manifest-analysis,hash-comparison,instrumentation,filename} ...]]
[--bom-engine {auto,CdxgenGenerator,CdxgenServerGenerator,CdxgenImageBasedGenerator,BlintGenerator} |
--vulnerability-analyzer {auto,VDRAnalyzer,LifecycleAnalyzer}] [--reachability-analyzer {off,FrameworkReachability,SemanticReachability}] [--no-suggest]
[--risk-audit] [--cdxgen-args CDXGEN_ARGS] [--private-ns PRIVATE_NS] [-t PROJECT_TYPE [PROJECT_TYPE ...]] [--bom BOM | --bom-dir BOM_DIR | --purl SEARCH_PURL]
[--report-template REPORT_TEMPLATE] [--report-name REPORT_NAME] [--deep] [--fuzzy-search] [--search-order {purl,pcu,cpe,cpu,url}] [--no-universal]
[--no-vuln-table] [--server] [--server-host SERVER_HOST] [--server-port SERVER_PORT] [--cdxgen-server CDXGEN_SERVER] [--debug] [-q | --explain] [-v]
Fully open-source security and license audit for application dependencies and container images based on known vulnerabilities and advisories.
options:
-h, --help show this help message and exit
--config CONFIG Path to the configuration file. Default: $PWD/.config/depscan.toml
--no-banner Do not display the logo and donation banner. Please make a donation to OWASP before using this argument.
-i, --src SRC_DIR_IMAGE
Source directory or container image or binary file
-o, --reports-dir REPORTS_DIR
Reports directory
--csaf Generate a OASIS CSAF VEX document
--profile {appsec,research,operational,threat-modeling,license-compliance,generic,machine-learning,ml,deep-learning,ml-deep,ml-tiny}
Profile to use while generating the BOM. For granular control, use the arguments --bom-engine, --vulnerability-analyzer, or --reachability-analyzer.
--lifecycle {pre-build,build,post-build} [{pre-build,build,post-build} ...]
Product lifecycle for the generated BOM. Multiple values allowed.
--technique {auto,source-code-analysis,binary-analysis,manifest-analysis,hash-comparison,instrumentation,filename} [{auto,source-code-analysis,binary-analysis,manifest-analysis,hash-comparison,instrumentation,filename} ...]
Analysis technique to use for BOM generation. Multiple values allowed.
--bom-engine {auto,CdxgenGenerator,CdxgenServerGenerator,CdxgenImageBasedGenerator,BlintGenerator}
BOM generation engine to use. Defaults to automatic selection based on project type and lifecycle.
--vulnerability-analyzer {auto,VDRAnalyzer,LifecycleAnalyzer}
Vulnerability analyzer to use. Defaults to automatic selection based on bom_dir argument.
--reachability-analyzer {off,FrameworkReachability,SemanticReachability}
Reachability analyzer to use. Default FrameworkReachability.
--no-suggest Disable suggest mode
--risk-audit Perform package risk audit (slow operation). Npm only.
--cdxgen-args CDXGEN_ARGS
Additional arguments to pass to cdxgen
--private-ns PRIVATE_NS
Private namespace to use while performing oss risk audit. Private packages should not be available in public registries by default. Comma separated
values accepted.
-t, --type PROJECT_TYPE [PROJECT_TYPE ...]
Override project types if auto-detection is incorrect. Multiple values supported.
--bom BOM Examine using the given Software Bill-of-Materials (SBOM) file in CycloneDX format. Use cdxgen command to produce one.
--bom-dir BOM_DIR Examine all the Bill-of-Materials (BOM) files in the given directory.
--purl SEARCH_PURL Scan a single package url.
--custom-data CUSTOM_DATA
Path to directory containing custom vulnerability data (JSON/YAML/TOML) to override/augment results.
--report-template REPORT_TEMPLATE
Jinja template file used for rendering a custom report
--report-name REPORT_NAME
Filename of the custom report written to the --reports-dir
--deep Perform deep scan by passing this --deep argument to cdxgen. Useful while scanning docker images and OS packages.
--fuzzy-search Perform fuzzy search by creating variations of package names. Use this when the input SBOM lacks a PURL.
--search-order {purl,pcu,cpe,cpu,url}
Attributes to use while searching for vulnerabilities. Default: PURL, CPE, URL (pcu).
--no-universal Depscan would attempt to perform a single universal scan instead of individual scans per language type.
--no-vuln-table Do not print the table with the full list of vulnerabilities. This can help reduce console output.
--server Run depscan as a server
--server-host SERVER_HOST
depscan server host
--server-port SERVER_PORT
depscan server port
--server-allowed-hosts [SERVER_ALLOWED_HOSTS ...]
List of allowed hostnames or IPs that can access the server (e.g., 'localhost 192.168.1.10'). If unspecified, no host allowlist is
enforced.
--server-allowed-paths [SERVER_ALLOWED_PATHS ...]
List of allowed filesystem paths that can be scanned by the server. Restricts `path` parameter in /scan requests.
--cdxgen-server CDXGEN_SERVER
cdxgen server url. Eg: http://cdxgen:9090
--debug Run depscan in debug mode.
-q, --quiet Makes depscan quiet.
--explain Makes depscan to explain the various analysis. Useful for creating detailed reports.
--explanation-mode {Endpoints,EndpointsAndReachables,NonReachables,LLMPrompts}
Style of explanation needed. Defaults to Endpoints and Reachables.
--annotate Include the generated text VDR report as an annotation. Defaults to true when explain is enabled; false otherwise.
-v, --version Display the version
```
### Homebrew (macOS и Linux)
Homebrew устанавливает [автономный бинарный файл](#standalone-binaries-no-python-or-nodejs-required) как `depscan` из [tap OWASP dep-scan](https://github.com/owasp-dep-scan/homebrew-tap), с включённым cdxgen и без необходимости в Python или Node.js. `brew trust` принимает tap, что Homebrew требует перед загрузкой формул из стороннего tap, когда задан `HOMEBREW_REQUIRE_TAP_TRUST`:
```bash
brew tap owasp-dep-scan/tap
brew trust --tap owasp-dep-scan/tap
brew install dep-scan
depscan --src $PWD --reports-dir $PWD/reports
```
### Автономные бинарные файлы (Python или Node.js не требуются)
К каждому [релизу на GitHub](https://github.com/owasp-dep-scan/dep-scan/releases) прилагаются готовые однофайловые исполняемые файлы. Они включают в себя соответствующий SEA-бинарник [cdxgen](https://github.com/cdxgen/cdxgen), поэтому генерация BOM работает из коробки без установки Python, Node.js или cdxgen.
| Платформа | Архитектура | Файл |
| --------------------- | ------------- | --------------------------- |
| Linux (glibc) | x86_64 | `depscan-linux-amd64` |
| Linux (glibc) | arm64 | `depscan-linux-arm64` |
| Linux (musl / Alpine) | x86_64 | `depscan-linux-amd64-musl` |
| Linux (musl / Alpine) | arm64 | `depscan-linux-arm64-musl` |
| macOS | Apple silicon | `depscan-darwin-arm64` |
| macOS | Intel | `depscan-darwin-amd64` |
| Windows | x86_64 | `depscan-windows-amd64.exe` |
К каждому файлу прилагается соответствующий файл `.sha256` для проверки.
```bash
# Example: Linux x86_64
curl -LO https://github.com/owasp-dep-scan/dep-scan/releases/latest/download/depscan-linux-amd64
curl -LO https://github.com/owasp-dep-scan/dep-scan/releases/latest/download/depscan-linux-amd64.sha256
sha256sum -c depscan-linux-amd64.sha256
chmod +x depscan-linux-amd64
./depscan-linux-amd64 --src $PWD --reports-dir $PWD/reports
```
> [!NOTE]
> Бинарные файлы macOS в настоящее время не подписаны. При первом запуске macOS Gatekeeper может их заблокировать; снимите атрибут карантина командой `xattr -d com.apple.quarantine ./depscan-darwin-arm64` (или разрешите бинарный файл в разделе «Системные настройки» → «Конфиденциальность и безопасность»).
> [!NOTE]
> База данных уязвимостей по-прежнему загружается при первом запуске. В комплект входит только cdxgen, но не база данных уязвимостей. Используйте команду `depscan-vdb`, чтобы выбрать конкретный вариант базы данных, например `depscan-vdb download --scope app` для уменьшенной базы данных только для приложений. Полную матрицу образов см. в [руководстве по базе данных уязвимостей](https://depscan.readthedocs.io/vulnerability-database).
Все автономные бинарные файлы включают в себя `blint`, но не его необязательный бэкенд дизассемблирования `nyxstone` (для которого нет wheel-пакетов и нет поддержки Windows). Поэтому глубокий анализ бинарных файлов на основе дизассемблирования недоступен в автономных бинарных файлах; используйте пакет Python (`pip install owasp-depscan[all]`), если он вам нужен.
### Локальное сканирование контейнеров (версия для Python)
Сканирование проекта на Java.
```bash
depscan --src <path> -o containertests -t java
```
Сканирование тега `latest` контейнера `shiftleft/scan-slim`
```bash
depscan --src shiftleft/scan-slim -o containertests -t docker
```
Включите `license` в тип, чтобы выполнить аудит лицензий.
```bash
depscan --src shiftleft/scan-slim -o containertests -t docker license
```
Вы также можете указать образ с помощью дайджеста sha256
```bash
depscan --src redmine@sha256:a5c5f8a64a0d9a436a0a6941bc3fb156be0c89996add834fe33b66ebeed2439e -o containertests -t docker
```
Вы также можете сохранить образы контейнеров с помощью команды docker или podman save и передать архив в depscan для сканирования.
```bash
docker save -o /tmp/scanslim.tar shiftleft/scan-slim:latest
# podman save --format oci-archive -o /tmp/scanslim.tar shiftleft/scan-slim:latest
depscan --src /tmp/scanslim.tar -o reports -t docker
```
Дополнительные примеры см. в docker-тестах в рабочем процессе GitHub Actions для этого репозитория.
### Локальное сканирование проектов (Docker-контейнер)
Для выполнения сканирования можно использовать образ контейнера `ghcr.io/owasp-dep-scan/dep-scan`.
Для сканирования с настройками по умолчанию
```bash
docker run --rm -v $PWD:/app ghcr.io/owasp-dep-scan/dep-scan depscan --src /app --reports-dir /app/reports
```
Для сканирования с конфигурацией на основе пользовательских переменных окружения
```bash
docker run --rm \
-e VDB_HOME=/db \
-e GITHUB_TOKEN=<token> \
-v /tmp:/db \
-v $PWD:/app ghcr.io/owasp-dep-scan/dep-scan depscan --src /app --reports-dir /app/reports
```
В приведённом выше примере `/tmp` монтируется как `/db` в контейнер. Затем этот каталог указывается как `VDB_HOME` для кэширования информации об уязвимостях. Таким образом база данных может кэшироваться и повторно использоваться для повышения производительности.
### Режим сервера
dep-scan и cdxgen могут работать в режиме сервера. Для начала работы используйте прилагаемый файл docker-compose.
```bash
git clone https://github.com/owasp-dep-scan/dep-scan
docker compose up
```
Входящий в комплект compose-файл по умолчанию задаёт для `DEPSCAN_SERVER_API_KEY` значение-заглушку для разработки, чтобы служба dep-scan могла привязаться к `0.0.0.0`. Переопределите это значение, прежде чем открывать службу за пределами локальной лаборатории.
```bash
depscan --server --server-host 127.0.0.1 --server-port 7070
```
Если вам нужно привязать dep-scan к нелокальному адресу, сначала задайте API-ключ:
```bash
export DEPSCAN_SERVER_API_KEY="change-this-before-production"
depscan --server --server-host 0.0.0.0 --server-port 7070
```
> [!IMPORTANT]
> dep-scan отказывается привязываться к нелокальному адресу без `DEPSCAN_SERVER_API_KEY` или явного согласия через `DEPSCAN_SERVER_ALLOW_UNAUTHENTICATED_BIND=true`.
Используйте эндпоинт `/scan` для выполнения сканирований.
> [!NOTE]
> Параметр `type` обязателен в серверном режиме. Если включена аутентификация по API-ключу, передавайте ключ через `X-API-Key` или `Authorization: Bearer <key>`.
- Сканирование локального каталога.
Сканирование файла SBOM (расположенного локально).
```bash
curl \
-H 'X-API-Key: dev-only-change-me' \
--json '{"path": "/tmp/vulnerable-aws-koa-app/sbom_file.json", "type": "js"}' \
http://127.0.0.1:7070/scan
```
- Сканирование репозитория GitHub.
```bash
curl \
-H 'Authorization: Bearer dev-only-change-me' \
--json '{"url": "https://github.com/HooliCorp/vulnerable-aws-koa-app", "type": "js"}' \
http://127.0.0.1:7070/scan \
-o app.vdr.json
```
- Загрузка файла SBOM и генерация результатов на его основе.
```bash
curl -X POST \
-H 'X-API-Key: dev-only-change-me' \
-H 'Content-Type: multipart/form-data' \
-F 'file=@/tmp/app/sbom_file.json' \
http://127.0.0.1:7070/scan?type=js
```
## Локальная разработка
Установите uv, следуя официальной [документации](https://docs.astral.sh/uv/).
```shell
uv sync --all-extras --all-packages
uv run depscan --help
uv run pytest
uv run pyrefly check
```
Проверка типов использует [pyrefly](https://pyrefly.org) (конфигурация находится в
`[tool.pyrefly]` в `pyproject.toml`); ожидается, что проверка сообщит о нулевом
количестве ошибок.
### Локальная настройка VDB
```shell
vdb --clean
vdb --download-image
# To scan containers and OS images
# vdb --download-full-image
```
### Сканирование локальных зависимостей с помощью depscan
```shell
uv run depscan --config .config/depscan-dev.toml
```
При этом автоматически будет использована конфигурация, указанная в локальном конфигурационном [файле](https://github.com/owasp-dep-scan/dep-scan/blob/master/.config/depscan.toml).
## Документация
Полная документация доступна на [depscan.readthedocs.io](https://depscan.readthedocs.io). Ключевые страницы:
- [Поддерживаемые языки и матрица достижимости](https://depscan.readthedocs.io/supported-languages)
- [Анализ достижимости](https://depscan.readthedocs.io/reachability-analysis) (хаб)
- [Модель достижимости](https://depscan.readthedocs.io/concepts/reachability-model)
- [Как dep-scan расставляет приоритеты](https://depscan.readthedocs.io/concepts/prioritization)
- [SBOM и доказательства](https://depscan.readthedocs.io/concepts/sbom-and-evidence)
- Руководства по языкам: [Rust](https://depscan.readthedocs.io/languages/rust-reachability), [Go](https://depscan.readthedocs.io/languages/go-reachability), [.NET](https://depscan.readthedocs.io/languages/dotnet-reachability), [JVM/JS/Python/PHP](https://depscan.readthedocs.io/languages/jvm-js-python-php-reachability)
---
[Read more](https://github.com/owasp-dep-scan/dep-scan)