Skip to content

Security: CAOShurong/wheelwhy

Security

SECURITY.md

Security policy

Supported versions

Security fixes are provided for the latest tagged release.

Report a vulnerability

Please use GitHub's private vulnerability reporting for this repository. Do not open a public issue for an unpatched vulnerability. Include a minimal wheel or filename, the WheelWhy version, operating system, Python version, expected behavior, and impact. Synthetic metadata is preferred; remove secrets and proprietary binaries.

If private reporting is unavailable, contact the maintainer through the email associated with the GitHub profile and request a private channel before sharing exploit details.

Threat model

Wheel files are untrusted ZIP archives. explain reads bounded .dist-info declarations; verify additionally streams every recorded file to validate its digest and size. Neither command extracts, imports, installs, executes, or uploads wheel contents. These local commands make no network requests.

Verification refuses encrypted archives, more than 100,000 members, more than 8 GiB declared uncompressed content, metadata members over 1 MiB, and RECORD files over 16 MiB. It rejects unsafe or phantom paths but does not resolve filesystem targets because nothing is extracted. RECORD digests are limited to fixed-output SHA-2, SHA-3, or BLAKE2 algorithms with at least 256-bit output; extendable-output hashes are rejected rather than invoked.

availability is the only networked command. It sends the normalized public project name in one anonymous HTTPS GET to the configured Simple API index; the server also observes the usual client network metadata such as IP address. The version specifier is processed locally and is not sent. WheelWhy rejects HTTP, URL credentials, query strings, fragments, authenticated indexes, response bodies larger than 8 MiB, timeouts above 60 seconds, non-JSON content, unsupported API majors, and redirects to non-HTTPS or credential-bearing URLs. It never follows file or metadata-sidecar URLs from the response. TLS and proxy behavior use Python's standard-library and operating-system trust configuration. Private package names should not be queried against a public index.

A compatibility or integrity pass is not a malware, publisher-identity, provenance, shared-library, signature, or runtime-safety verdict. A malicious payload can have internally consistent tags and hashes.

There aren't any published security advisories