CVE-2026-102739: ESPectre: unsafe NPZ pickle load allows code execution
HIGHESPectre, an open-source Wi-Fi motion sensing platform for ESP32, shipped analysis tools that load NumPy .npz datasets with pickle support enabled (CWE-502), so a booby-trapped dataset runs attacker code on the machine of whoever analyzes it. The realistic target is a maintainer or contributor who pulls a pull request containing a malicious file under micro-espectre/data and runs one of the documented analysis or ML training scripts. There is no KEV listing, no public exploit, no Nuclei template, and no EPSS data, and the product is a niche sensing project with no tracked downstream dependents, so enterprise-wide exposure is low. The risk is concentrated on developer workstations and CI runners, where stolen credentials, SSH keys, and tokens could become a stepping stone into a wider software supply chain. Upgrade to 3.0.0-rc1, treat datasets from external contributors as untrusted, and avoid running analysis tools on unreviewed PRs outside an isolated environment.
What is the risk?
CVSS 7.8 (High), but practical risk is moderate to low for most organizations. Exploitation requires local execution and user interaction: a victim must obtain the malicious .npz and run an affected tool. Complexity is low and no privileges are needed, and crafting a pickle payload is well-known and trivial. There is no evidence of active exploitation (not in KEV, no public exploit, EPSS unavailable) and no tracked dependents. Impact is full compromise of the developer or maintainer account (confidentiality, integrity, availability), and it can extend to source repositories and CI secrets, which makes the supply chain angle the primary concern.
How does the attack unfold?
How severe is it?
What is the attack surface?
What should I do?
1 step1) Upgrade ESPectre to 3.0.0-rc1 or later, which disables pickle loading for NPZ datasets (see commit adf495c and PR #154). 2) Review all existing .npz files under micro-espectre/data from untrusted contributors; check for object-dtype arrays, or load them with allow_pickle=False to see whether they fail. 3) Run analysis and training tools on external PRs only in a disposable container or VM with no credentials mounted. 4) Do not run CI jobs that execute dataset-loading scripts on forked-PR content with access to secrets. 5) Detect: grep for allow_pickle=True and np.load usage in internal scripts, scan datasets with pickle scanners such as picklescan or fickling, and monitor developer endpoints for unexpected child processes spawned by Python analysis scripts. 6) Prefer safe formats for shared datasets, such as plain numeric arrays, CSV, or safetensors.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2026-102739?
ESPectre, an open-source Wi-Fi motion sensing platform for ESP32, shipped analysis tools that load NumPy .npz datasets with pickle support enabled (CWE-502), so a booby-trapped dataset runs attacker code on the machine of whoever analyzes it. The realistic target is a maintainer or contributor who pulls a pull request containing a malicious file under micro-espectre/data and runs one of the documented analysis or ML training scripts. There is no KEV listing, no public exploit, no Nuclei template, and no EPSS data, and the product is a niche sensing project with no tracked downstream dependents, so enterprise-wide exposure is low. The risk is concentrated on developer workstations and CI runners, where stolen credentials, SSH keys, and tokens could become a stepping stone into a wider software supply chain. Upgrade to 3.0.0-rc1, treat datasets from external contributors as untrusted, and avoid running analysis tools on unreviewed PRs outside an isolated environment.
Is CVE-2026-102739 actively exploited?
No confirmed active exploitation of CVE-2026-102739 has been reported, but organizations should still patch proactively.
How to fix CVE-2026-102739?
1) Upgrade ESPectre to 3.0.0-rc1 or later, which disables pickle loading for NPZ datasets (see commit adf495c and PR #154). 2) Review all existing .npz files under micro-espectre/data from untrusted contributors; check for object-dtype arrays, or load them with allow_pickle=False to see whether they fail. 3) Run analysis and training tools on external PRs only in a disposable container or VM with no credentials mounted. 4) Do not run CI jobs that execute dataset-loading scripts on forked-PR content with access to secrets. 5) Detect: grep for allow_pickle=True and np.load usage in internal scripts, scan datasets with pickle scanners such as picklescan or fickling, and monitor developer endpoints for unexpected child processes spawned by Python analysis scripts. 6) Prefer safe formats for shared datasets, such as plain numeric arrays, CSV, or safetensors.
What systems are affected by CVE-2026-102739?
This vulnerability affects the following AI/ML architecture patterns: training pipelines, ML data preprocessing, developer workstations, dataset sharing workflows.
What is the CVSS score for CVE-2026-102739?
CVE-2026-102739 has a CVSS v3.1 base score of 7.8 (HIGH).
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0010.002DataAML.T0011.000Unsafe AI ArtifactsAML.T0019Publish Poisoned DatasetsAML.T0112.001AI ArtifactsCompliance Controls Affected
What are the technical details?
Original Advisory
ESPectre is a Wi-Fi motion sensing platform for ESP32. Prior to 3.0.0-rc1, Micro-ESPectre analysis tools, including tools/6_optimize_filter_params.py, tools/1_analyze_raw_data.py, and tools/10_train_ml_model.py, load NPZ datasets with NumPy pickle support enabled through micro-espectre/tools/csi_utils.py and a direct loader. A malicious dataset contributor or pull-request author can place an object-typed array in a .npz file under micro-espectre/data, causing pickle-controlled code to execute as the maintainer or developer when a documented analysis tool accesses the field. This issue is fixed in version 3.0.0-rc1.
Exploitation Scenario
An attacker opens a pull request to the ESPectre repository adding a plausible new CSI capture dataset as a .npz file. One array is object-typed and holds a pickle payload that executes a shell command on deserialization. A maintainer checks out the branch to validate the data and runs tools/1_analyze_raw_data.py or the ML training script as documented. When the tool accesses the poisoned field, the payload runs with the maintainer's privileges and exfiltrates SSH keys, GitHub tokens, and cloud credentials, or implants a backdoor. The attacker can then use those credentials to push malicious code or releases.
Weaknesses (CWE)
CWE-502 — Deserialization of Untrusted Data: The product deserializes untrusted data without sufficiently ensuring that the resulting data will be valid.
- [Architecture and Design, Implementation] If available, use the signing/sealing features of the programming language to assure that deserialized data has not been tainted. For example, a hash-based message authentication code (HMAC) could be used to ensure that data has not been modified.
- [Implementation] When deserializing data, populate a new object rather than just deserializing. The result is that the data flows through safe input validation and that the functions are safe.
Source: MITRE CWE corpus.
CVSS Vector
CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:HReferences
Timeline
Related Vulnerabilities
CVE-2025-5952810.0Flowise: Unauthenticated RCE via MCP config injection
Same attack type: Supply ChainCVE-2024-291210.0BentoML: RCE via insecure deserialization (CVSS 10)
Same attack type: Supply ChainCVE-2023-376510.0MLflow: path traversal allows arbitrary file read
Same attack type: Supply ChainCVE-2025-512010.0smolagents: sandbox escape enables unauthenticated RCE
Same attack type: Supply ChainCVE-2026-2185810.0n8n: Input Validation flaw enables exploitation
Same attack type: Code Execution