{"items":[{"id":"NVI-00009650","kind":"supply_chain_event","title":"Malicious code in py2ops (PyPI)","revision":1,"unknowns":["Customer inventory, deployment, reachability and exploitation have not been inspected."],"lifecycle":"active","identifiers":["GHSA-hfr2-qh7r-7xrr"],"plain_summary":"GitHub lists this malware advisory for py2ops. Published version ranges and source prerequisites are shown below; this is not an inspection of a visitor’s application.","review_status":"source_listed","control_topics":[],"public_actions":[{"summary":"Identify the exact component and deployed version, examine the linked publisher’s conditions, and retain evidence of any mitigation.","source_ids":["sr-1edd8c8021a5c73c4e1716cd0a8a8fc3"],"action_type":"investigate","limitations":"Confirm current vendor support, compatibility and deployment evidence. This report has not tested a fix in your system.","current_supported_target":null}],"schema_version":"1.1.0","source_metrics":[],"why_it_matters":"Published affected context helps an owner decide what evidence to gather. This report has not examined your application.","related_sources":[{"id":"sr-1edd8c8021a5c73c4e1716cd0a8a8fc3","url":"https://github.com/advisories/GHSA-hfr2-qh7r-7xrr","basis":"vendor_advisory","notes":"GitHub Advisory Database; CC-BY-4.0. Each advisory links its original attribution. Null normalizes fields.","title":"GHSA-hfr2-qh7r-7xrr","publisher":"GitHub Advisory Database","observed_at":"2026-10-31T22:06:53.250Z"}],"affected_context":[{"certainty":"source_listed","source_ids":["sr-1edd8c8021a5c73c4e1716cd0a8a8fc3"],"technology":"py2ops","known_exclusions":[],"conditions_summary":"The package installs a console command named python2 (pyops.cli:main), so it runs when someone types python2. On first run _register() in cli.py POSTs the hostname and OS to a space-z.ai server and keeps the returned apiKey in ~/.python2/config.json. Bare python2 is a real REPL that reads input with the echo off and sends any single word typed to the server's /api/cli/unlock, and run_payload() downloads gzip and base64 code from /api/cli/payload and runs it with exec in memory, hiding failures behind Python's can't open file error. Comments in the file call this the cover. I did not see what the served code does. I read 2.2 and did not run it.\n\n---\n\nCredit: OpenSSF (source)","public_affected_ranges":["= 2.2"]}],"null_published_at":"2026-10-31T22:13:39.927Z","source_updated_at":"2026-10-12T06:31:25.000Z","source_disclosed_at":"2026-10-12T06:31:25.000Z","is_synthetic_fixture":false,"null_last_reviewed_at":null,"public_change_summary":"First indexed by Null; source disclosure date is shown separately.","null_first_observed_at":"2026-10-31T22:06:53.250Z"}],"next_cursor":null,"snapshot_revision":"42594"}