-
Software distribution method or binary type: Python Pipfile files used by Pipenv to declare top-level project dependencies in TOML format.
-
Popularity of distribution method: Pipenv is a maintained Python packaging tool and Pipfile is its primary source manifest for declaring project dependencies and constraints. Pipenv documents Pipfile as the human-readable TOML file containing production dependencies under [packages] and development dependencies under [dev-packages].
-
Any critical, emergent vulnerability associated with software from the distribution method: Dependencies declared in Pipfile map to the PyPI ecosystem, which is supported by OSV.dev. There are no vulnerabilities in the Pipfile format itself; the value is extracting PyPI package inventory declared in Pipfile so OSV-SCALIBR can match vulnerable packages.
Recent OSV.dev PyPI examples include:
-
Resources:
Gap confirmation
SCALIBR currently supports Pipfile.lock through python/pipfilelock, but does not appear to register an inventory extractor for plain Pipfile.
This leaves a source-manifest gap for Python projects where a Pipfile is present but a Pipfile.lock is absent, unavailable, stale, or intentionally omitted from the scanned artifact.
This proposal is for source inventory extraction only. It does not replace python/pipfilelock, which remains the better source for resolved dependency inventory when available.
Rationale
Pipenv already uses Pipfile as the source manifest for declaring project dependencies. SCALIBR already supports several Python inventory sources, including requirements.txt, setup.py, Pipfile.lock, pdm.lock, poetry.lock, uv.lock, Conda metadata, and installed wheel/egg metadata.
A Pipfile extractor would cover the source manifest case where dependency names and constraints are present in a structured TOML file, but no resolved lockfile is available to scan.
There is also prior project precedent for this being a distinct inventory artifact: PR #189 renamed the existing lockfile extractor to python/pipfilelock because a future plain python/Pipfile extractor may be useful. Later PRs #1407 and #1478 added Pipfile support to guided remediation, but not filesystem inventory extraction.
Proposed scope
- Match only files whose basename is exactly
Pipfile.
- Parse only TOML dependency sections:
[packages]
[dev-packages]
- Emit PyPI package inventory for entries where a package name is explicit.
- Support simple string specs, for example:
requests = "*"
flask = "==2.0.1"
numpy = ">=1.20.0,<2.0.0"
- Support table entries when a
version field is present, for example:
django = { version = ">=3.2" }
sentry-sdk = { version = ">=1.0.0", extras = ["flask"] }
- Preserve version/comparator metadata only for exact pins and simple single-comparator constraints.
- For wildcard or compound constraints such as
numpy = ">=1.20.0,<2.0.0", emit package identity only without a concrete version, because the source manifest does not identify an installed version.
- Record file and line locations for emitted packages.
- Skip invalid, empty, or unsupported entries.
Out of scope
Pipfile.lock
- Dependency resolution
- Lockfile generation
- Installing packages
- Reading package indexes
- Evaluating environment markers
- Resolving extras into dependency graphs
- Custom Pipenv package categories beyond
[packages] and [dev-packages]
- Local path dependencies
- VCS dependencies
- Remote file dependencies
- Editable installs
- Private index/source resolution
Suggested plugin name
python/pipfile
PURL output format
pkg:pypi/{package}@{version}
Examples:
pkg:pypi/flask@2.0.1
pkg:pypi/requests
pkg:pypi/numpy
Software distribution method or binary type: Python
Pipfilefiles used by Pipenv to declare top-level project dependencies in TOML format.Popularity of distribution method: Pipenv is a maintained Python packaging tool and
Pipfileis its primary source manifest for declaring project dependencies and constraints. Pipenv documentsPipfileas the human-readable TOML file containing production dependencies under[packages]and development dependencies under[dev-packages].Any critical, emergent vulnerability associated with software from the distribution method: Dependencies declared in
Pipfilemap to the PyPI ecosystem, which is supported by OSV.dev. There are no vulnerabilities in thePipfileformat itself; the value is extracting PyPI package inventory declared in Pipfile so OSV-SCALIBR can match vulnerable packages.Recent OSV.dev PyPI examples include:
pkg:pypi/urllib3affected by GHSA-2xpw-w6gg-jr37 / CVE-2025-66471pkg:pypi/urllib3affected by GHSA-34jh-p97f-mpxf / CVE-2024-37891Resources:
Gap confirmation
SCALIBR currently supports
Pipfile.lockthroughpython/pipfilelock, but does not appear to register an inventory extractor for plainPipfile.This leaves a source-manifest gap for Python projects where a
Pipfileis present but aPipfile.lockis absent, unavailable, stale, or intentionally omitted from the scanned artifact.This proposal is for source inventory extraction only. It does not replace
python/pipfilelock, which remains the better source for resolved dependency inventory when available.Rationale
Pipenv already uses
Pipfileas the source manifest for declaring project dependencies. SCALIBR already supports several Python inventory sources, includingrequirements.txt,setup.py,Pipfile.lock,pdm.lock,poetry.lock,uv.lock, Conda metadata, and installed wheel/egg metadata.A
Pipfileextractor would cover the source manifest case where dependency names and constraints are present in a structured TOML file, but no resolved lockfile is available to scan.There is also prior project precedent for this being a distinct inventory artifact: PR #189 renamed the existing lockfile extractor to
python/pipfilelockbecause a future plainpython/Pipfileextractor may be useful. Later PRs #1407 and #1478 added Pipfile support to guided remediation, but not filesystem inventory extraction.Proposed scope
Pipfile.[packages][dev-packages]requests = "*"flask = "==2.0.1"numpy = ">=1.20.0,<2.0.0"versionfield is present, for example:django = { version = ">=3.2" }sentry-sdk = { version = ">=1.0.0", extras = ["flask"] }numpy = ">=1.20.0,<2.0.0", emit package identity only without a concrete version, because the source manifest does not identify an installed version.Out of scope
Pipfile.lock[packages]and[dev-packages]Suggested plugin name
python/pipfilePURL output format
Examples: