Security fixes are provided for the latest tagged release.
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.
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.