Only the latest 0.x release on PyPI receives security updates. Patches
land in a new 0.x.y release; older versions are not backported.
Do not open a public GitHub issue for security reports.
Email the maintainer at david@villacis.net with:
- A description of the vulnerability and its impact.
- Reproduction steps (a minimal failing case is ideal — the simpler, the faster we can confirm and patch).
- The affected version (
pip show sparhoorsparho.__version__). - Your preferred attribution in the resulting advisory, or anonymous.
Expected response: acknowledgement within 5 business days; an initial triage assessment within 14 days. We follow a 90-day coordinated disclosure window — if the fix lands sooner the advisory is published on the release date, otherwise on day 90 regardless.
sparho runs locally inside a user's Python process and consumes
in-memory numpy / scipy data structures. The realistic attack surface is:
- FFI boundary. Rust kernels validate every caller-supplied
i32index against the matching slice length before anyas usizecast (v0.3.1 hardening). Malformedscipy.sparse.csc_matrixinput produces aValueError, not a Rust panic — the release profile setspanic = "abort"as the safety net for any remaining bug. - Dependency advisories. A
cargo-auditjob runs on every PR; the one current ignore (PyO3 0.22PyString::from_object— RUSTSEC-2025-0020) is tracked on the ROADMAP behind a pyo3 → 0.24 bump. Python deps are checked transitively via the floor-versionci-min-depsmatrix job.
Out of scope (these are the user's responsibility):
- Loading untrusted pickle artifacts.
SearchResultand the wrapper estimators are picklable, but pickle is unsafe with attacker- controlled input by construction. - Adversarial training data. The library makes no robustness guarantees against data poisoning or membership inference.
- Side-channel attacks on the inner solver (timing, cache).
None yet. Be the first.