You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 7e36e66
Browse filesBrowse the repository at this point in the historyBrowse files
| TB1 | Caller-supplied values into activation scripts and `pyvenv.cfg`|[Per-shell quoting][src-activation], [line boundary collapsing][src-text], [property tests][tests-property] and [fuzzing][atheris]|
187
-
| TB2 | Wheel bytes from an index through app-data into an environment | pip's TLS, SHA-256 comparison with PyPI's published digest, refusal when PyPI has none ([#3302][pr-3302]) |
188
-
| TB3 | Built artifacts from GitHub Actions to PyPI, GitHub Releases, get-virtualenv and bootstrap.pypa.io |[Trusted publishing][pypi-tp], [attestations][gh-attestations], [post-publish verification][workflow-release] of each destination|
189
-
| TB4 | Code from contributors and dependencies into a release |[Rulesets][gh-rulesets], [SHA-pinned actions][gh-sha-pinning], [embedded wheel hashes][src-embed-init], [wheel age gate][task-wheel-age], [pinned CI tool downloads][ci-tools]|
| TB1 | Caller-supplied values into activation scripts and `pyvenv.cfg`|[Per-shell quoting][src-activation], [line boundary collapsing][src-text], [property tests][tests-property] and [fuzzing][atheris]|
187
+
| TB2 | Wheel bytes from an index through app-data into an environment | pip's TLS, SHA-256 comparison with PyPI's published digest, refusal when PyPI has none ([#3302][pr-3302]) |
188
+
| TB3 | Built artifacts from GitHub Actions to PyPI, GitHub Releases, get-virtualenv and bootstrap.pypa.io |[Trusted publishing][pypi-tp], [attestations][gh-attestations], [immutable releases][gh-immutable], [post-publish verification][workflow-release] of each destination |
189
+
| TB4 | Code from contributors and dependencies into a release |[Rulesets][gh-rulesets], [SHA-pinned actions][gh-sha-pinning], [embedded wheel hashes][src-embed-init], [wheel age gate][task-wheel-age], [pinned CI tool downloads][ci-tools], [zipapp lock][pylock-zipapp]|
| R1 | A user cannot tell whether a published artifact came from the project's CI. | Low |[PyPI attestations][pypi-attestations] cover the sdist and wheel, and a [SLSA build provenance][slsa-provenance] attestation ships beside the zipapp. [GitHub attestations][gh-attestations] bind the CycloneDX SBOM and its [SPDX] rendering to both distributions ([#3299][pr-3299]) and the zipapp SBOM to the zipapp ([#3310][pr-3310]). The wheel carries its SBOM as [PEP 770][pep-770] describes. The release pins timestamps to [`SOURCE_DATE_EPOCH`][sde], so anyone can [rebuild the sdist][verify-rebuild] and compare it; wheels differ between build machines, see open items. [Verify a virtualenv release][verify] shows each check. We do not require signed commits. |
| R1 | A user cannot tell whether a published artifact came from the project's CI. | Low |[PyPI attestations][pypi-attestations] cover the sdist and wheel, and a [SLSA build provenance][slsa-provenance] attestation ships beside the zipapp. [GitHub attestations][gh-attestations] bind the CycloneDX SBOM and its [SPDX] rendering to both distributions ([#3299][pr-3299]) and the zipapp SBOM to the zipapp ([#3310][pr-3310]). The wheel carries its SBOM as [PEP 770][pep-770] describes. GitHub signs a release attestation over the assets of each immutable release. The release pins timestamps to [`SOURCE_DATE_EPOCH`][sde] and the zipapp's bundled wheels to a [PEP 751][pep-751] lock, and the SBOMs record the build tools, so anyone can [rebuild the sdist, wheel and zipapp][verify-rebuild] and compare the bytes ([#3306][pr-3306], [#3311][pr-3311]). [Verify a virtualenv release][verify] shows each check. We do not require signed commits. |
224
224
225
225
### Information disclosure
226
226
@@ -262,7 +262,7 @@ close submissions with no human in the loop.
262
262
263
263
T3, T5 and T6 cover compromised dependencies and embedded wheels, and S2 covers registry typosquatting. Tools that
264
264
install virtualenv unpinned take each new release on the day PyPI publishes it. We cannot slow that down for them, so we
265
-
keep releases verifiable with attestations, an sdistand wheel that [rebuild byte for byte][ra-repro], SBOMs and
265
+
keep releases verifiable with attestations, an sdist, wheel and zipapp that [rebuild byte for byte][ra-repro], SBOMs and
266
266
[published advisories][advisories]. The [CRA section][security-cra] of SECURITY.md points integrators to the same
267
267
material, and the project reports its practices through [OpenSSF Scorecard][scorecard-virtualenv] and the
268
268
[OpenSSF Best Practices badge][bestpractices-virtualenv].
@@ -347,8 +347,9 @@ with no token permissions and grants each job the permissions it needs and no mo
347
347
to contents. The repository's [default workflow token][gh-token-permissions] is read-only, and GitHub
348
348
[rejects actions not pinned to a full commit SHA][gh-sha-pinning]. Checkouts do not persist credentials, except in
349
349
[pre-release.yaml][workflow-pre-release], which pushes the release commit and tag with a release App token, and the
350
-
upgrade publish job, which pushes with a deploy key. PyPI uploads use trusted publishing (S1). In the tool, the app-data
351
-
seeder [marks the extracted wheel image read-only][src-symlink] when it links packages by symlink.
350
+
upgrade publish job, which pushes the upgrade branch with the workflow token. PyPI uploads use trusted publishing (S1).
351
+
In the tool, the app-data seeder [marks the extracted wheel image read-only][src-symlink] when it links packages by
352
+
symlink.
352
353
353
354
virtualenv uses fail-safe defaults on the network and in the batch activator. If the TLS handshake with the PyPI
354
355
metadata API fails, virtualenv does not retry without verification; the unverified fallback needs the
@@ -486,8 +487,10 @@ the workflows as I1 describes, and [scorecard.yaml][workflow-scorecard] runs [Op
0 commit comments