The critical distinction is presence versus execution. FACT: genblaze-atlascloud==0.1.0 overrides the setup.py install command, so installation executes malicious code; the available advisory does not establish an import-time trigger. FACT: genblaze-fal==0.1.0 executes on installation and module import and exfiltrates “basic information about the host”; its published source archive has SHA-256 ac4c445f1701dd9a99150129ab196e77ad207d1295c99d6dc95b01636b88d454. UNKNOWN: For pulumi-doppler==0.0.0/1.0.0, the incident source identifies malicious execution and host-data exfiltration, but the evidence available here does not resolve the exact install-versus-import trigger, transmitted fields, destination, or artifact hashes. No source establishes credential theft by any of the three packages. Credential exposure remains plausible but unproven where code executed inside a process that could access environment variables, home-directory configuration, CI secrets, cloud credentials, Doppler tokens, signing material, or package-registry credentials.
Hunt by exact name, version, artifact hash, and execution state—not package name alone. Search lockfiles, SBOMs, requirements*.txt, build manifests, image layers, pip caches, virtual environments, and *.dist-info metadata for all three names and specified versions. Query CI and endpoint telemetry for pip, python -m pip, setup.py, PEP 517 build processes, and subsequent Python processes importing the modules; correlate those events with DNS, proxy, firewall, and EDR network connections. Immediately preserve the downloaded sdists/wheels, their SHA-256 hashes, pip/build logs, process trees, command lines, workspace and cache snapshots, DNS/proxy records, EDR telemetry, cloud audit logs, and a record of which secret names and scopes were available at execution time. Preserve that evidence before clearing caches or reimaging.
Containment should be immediate: deny all versions of genblaze-atlascloud, genblaze-fal, and pulumi-doppler at the internal PyPI proxy; add the known genblaze-fal hash to artifact-deny controls; purge but first quarantine and hash cached copies; fail CI when these names appear in manifests, SBOMs, or resolved dependency graphs; and prevent direct public-PyPI fallback. For confirmed or reasonably suspected execution, isolate the runner and revoke active sessions. Rotate secrets according to exposure: CI/CD tokens, PyPI and artifact-registry credentials, GitHub/GitLab tokens, cloud keys, Doppler service tokens, deployment keys, SSH credentials, and signing keys that were accessible to that process. Merely finding a package in a lockfile or cache does not justify indiscriminate rotation; missing execution telemetry on a credentialed runner does justify precautionary rotation.
No, not every touched host needs rebuilding. A proxy that cached an artifact or a host that only resolved/downloaded it has no demonstrated code execution: preserve and purge the artifact, then verify telemetry. Rebuild an ephemeral build runner from a trusted image whenever installation or import executed, or when logs cannot exclude execution. For persistent developer or build machines, rebuilding is the conservative default if execution occurred with elevated rights, valuable credentials, unexplained child processes, or incomplete evidence. Do not promote artifacts produced after suspected execution; rebuild those artifacts from pinned, hash-verified dependencies on clean runners.