Measuring Malicious Go Module Persistence
A repository vanishing from GitHub reads as resolved, yet 99.4 percent of malicious Go module versions stayed retrievable through the proxy - here is what that gap costs lean teams.

The one signal a lean team can actually check, that the malicious repository is gone from GitHub, is the signal that lies to them. A status of removed or suspended reads as resolved to the one place an under-resourced team can look, the ticket closes, and everyone moves to the next fire. The compromised code has not moved; it sits in an immutable distribution cache, ready to serve itself the next time anyone runs `go get`.
The gap the visible layer hides
Go's distribution model is built for reproducibility. A team pins a version, the public proxy serves the exact bytes it served last week, and builds stay deterministic. That is a genuine strength, and it is the same mechanism that turns a temporary compromise into a durable one. The public proxy keeps cached copies of modules long after they disappear from their original hosting repositories, which is the behavior a developer wants when pinning a version and the behavior an attacker wants when a hosting repository is about to be pulled. The hosting layer, where a repository lives and can be deleted, and the distribution layer, where a cached version is served, are two different surfaces, and only the first one shows up on a status page.
The scale of that split has now been measured.
A recent measurement of an active supply-chain campaign in the Go ecosystem put numbers on that gap. Among malicious module versions that had already vanished from GitHub, at least 99.4 percent were still retrievable through the Go proxy during the collection window. The sharpest confirmation is a time-ordered one. Once a repository had become unobservable on GitHub, its module versions were then checked for whether they still survived in the proxy-mediated distribution path. Every one of the repositories that had gone dark on GitHub was still served by the proxy, 74 of 74. Takedown is not remediation, which is a tidy phrase for an untidy operational fact: the compromised version keeps entering build pipelines after the thing you could see was fixed.
Why the false all-clear lands hardest on a lean team
This gap is more dangerous for a business without full-time security people, and the reason is structural. The observable layer is the shallow one. A repository page loads in seconds, a status of removed reads as closed, and a competent generalist can check it between other work. Confirming that the module is actually gone from the distribution path is a different job. It means enumerating every affected version against proxy and index evidence, watching the distribution layer that a hosting page never shows, tracking the repackaging pattern as new versions appear, and sustaining that watch as the operators rotate infrastructure. That is continuous monitoring and threat intelligence, and it is precisely the work an under-resourced team cannot economically reproduce on its own.
Takedown is not remediation, which is a tidy phrase for an untidy operational fact
None of this means anyone was checking wrong. The signal that used to be sufficient stopped being sufficient once the distribution layer learned to outlive the hosting layer, and the visible cue quietly became a partial one. A home-grown practice built on that cue, the bad repository is gone so we are fine, is self-sufficiency without the staff to back it, and self-sufficiency without the staff is exposure wearing the costume of independence. The economics only sharpen the point. Reproducing continuous distribution-layer monitoring in-house costs more than most businesses below mid-market can justify, while the cost of the gap arrives all at once and at the worst time. The defensible default at this size is a managed security program, or at minimum managed controls that watch the layer a status page cannot show.
Treat the cache as an asset you manage
For the MSP, the residual risk has a familiar shape. A cached, immutable module version that survives the visible cleanup and keeps flowing into client build pipelines is a code-like operational asset, the same category as the automations and integrations a modern MSP is already paid to keep running. Leaving it out of scope because it lives in a proxy and not on a device is how fragility accumulates in the systems you are accountable for, and it is the line between managing infrastructure and managing the code that runs on it.
The practice, stated plainly
Two commitments carry the work.
- The disciplined move is concrete, and it is a practice you run. Enumerate affected module versions using proxy and index evidence and treat GitHub metadata as auxiliary, which is another way of saying the audit trail lives at the distribution layer and the hosting page is only a hint at where to look. Pair that enumeration with a version-level remediation inventory that records what was pulled and from where, so a scope question a month later has an answer that does not depend on a repository still being online. Put a human approval gate on anything that touches a client system. That combination moves an MSP upstream from cleaning up after an incident to preventing the next one, a stronger commercial position with fewer emergency fixes, which is why it belongs inside the service model.
- Be honest about the tooling, because the alternative reading is a familiar overclaim. The deobfuscating scanner that surfaces this footprint at distribution scale reconstructs the obfuscated argument and requires a confirmed fetch-and-execute command before it flags anything. It is deliberately specialized rather than general and does not aim to detect arbitrary malicious Go code. Treat it as one instrument inside the discipline, useful for finding a known pattern across a distribution feed, with the enumeration and the human review carrying the weight. The mechanism is the discipline; the scanner is a part of it.
The discipline comes first and the instruments serve it.
The question worth answering
Real remediation is confirmed the same way the exposure was found. You enumerate every affected version at the distribution layer, then pull and log each one from the place that actually serves it. A repository page going dark tells you the work can begin, and nothing more. The question a leader has to answer after a supply-chain scare is not whether the repository is gone. It is whether every compromised version has been enumerated and removed from the path that still serves it.
More from Insights

The Cannibal's Mandate
Generative AI erodes the very hours consultancies bill for. Big firms can fund a confident narrative while they rebuild; a twenty-person shop has to make the honest move first.

Emotional Intelligence in Business Leadership
How emotional intelligence, not intellect alone, builds the trust, innovation, and resilience that separate exceptional leaders from merely competent ones.

Resilience in Leadership: Building a Culture of Perseverance and Adaptability
How leaders build a culture of resilience, turning perseverance and adaptability into a lasting competitive strength.
Insight-Powered, Future Driven
Verify Removal Where the Code Actually Lives
Qualsis helps small and medium businesses operate with the insight, rigor, and accountability the largest enterprises take for granted.