Cyber Threat Intel 6 min read

A Security Company's Private Code Sat Stolen for 117 Days

The copy happened in May. Nobody knew until the repositories turned up on a criminal forum in September, and no control in between noticed.

Priya Nair
Data, AI Governance & Policy Analyst
Published 20 Sep 2026, 11:55 AM (SGT)
Share:
A laptop screen glowing alone in a dark room, with city lights blurred beyond the window A laptop screen glowing alone in a dark room, with city lights blurred beyond the window Photo by SHVETS production on Pexels
Advertisement

20 SEP 2026 — CrowdSec sells security software. On 22 May, someone copied about 170 of its private GitHub repositories. The company found out on 16 September, when the code appeared on a criminal forum. Nothing in between detected it. That is not an irony to dwell on, but it says something about what this class of theft looks like from the inside.

How the token was obtained

The route in was the TanStack compromise. On 11 May, attackers published 84 malicious versions of 42 TanStack npm packages, tracked as CVE-2026-45321. Installing one of them ran code that harvested credentials from the developer's machine: GitHub tokens, SSH keys, cloud credentials.

One of those machines belonged to a CrowdSec employee. The company's analysis says GitHub support traced the token back to an account owned by an employee who had just left but still sat in the GitHub organisation for legitimate reasons. That account was used to dump the repositories.

That is the control failure. A departed employee retaining organisation membership is a routine arrangement with a routine justification, but it converted one compromised laptop into access to everything.

What was in the archive

Around 170 private repositories, alongside more than 130 public ones. The private material included the SaaS console, data-science scripts and models, deployment and automation tooling, and the consensus algorithm that decides which IP addresses reach CrowdSec's blocklists.

The archive held two categories of personal data. One was email addresses: 83 of them, which CrowdSec puts at under 0.05 per cent of roughly 150,000 users and describes as mostly Gmail addresses used by its data-science team for monitoring. The other was 51 potential investors from 2020, with their email addresses and investment context.

The company says the leak held no client or partner information except those few data-science addresses. Reporting that as "user emails leaked" gets the shape wrong. These were internal monitoring addresses, not account holders.

117 daysFrom the copy to discovery
~170Private repositories copied
51Investors from 2020 in the archive
3 daysFrom the copy to access being revoked

The gap that matters

CrowdSec revoked the account's access on 25 May, three days after the repositories were taken. That was not a response to the theft, because nobody knew about it; it was ordinary offboarding catching up.

So the timeline runs like this. The code was copied on 22 May. Access closed on 25 May for unrelated reasons. Then came 114 further days in which the company had no idea its source code was in someone else's hands. Discovery arrived at 17:45 on 16 September, when the material surfaced publicly. The first statement followed at noon the next day.

An organisation cannot detect a read it has no record of. A valid token used by a legitimate account to clone repositories that account may clone generates no anomaly worth an alert. This is the gap in supply-chain monitoring.

What was not touched

CrowdSec is specific about what did not happen, and the limits matter. Its infrastructure and databases were not accessed or compromised. No code was altered in the open-source software, the private source, or the build pipelines.

That last clause is the one that would have made this an emergency rather than an embarrassment. A supply-chain attacker with write access to a security vendor's build pipeline is a different story entirely. This was a read.

The stolen consensus algorithm is the item with the longest tail. Knowing how a blocklist decides what to block is permanently useful to anyone who would rather not be blocked.

Advertisement

Why npm keeps producing these

The pattern is familiar. A compromised package runs on developer machines and takes whatever credentials those machines hold. The blast radius is set by the credentials' reach, not by the package.

We reported this week on four AI coding agents that pinned plugins to a hash they never checked. The mechanism differed; the structural fact did not. Whatever gets installed on a developer's machine inherits that developer's access.

The Hacker News reported that CrowdSec has not said which malicious TanStack package reached the employee's machine, or when it was installed. Without that, the interval between infection and theft is unknown, and so is how many other organisations are sitting in the same position and do not know it.

Advertisement
Priya Nair
Data, AI Governance & Policy Analyst

Priya Nair covers AI governance, data protection, privacy, and digital trust topics for RECATOOLS.

View author profile → · Editorial policy

About this byline Priya Nair is a RECATOOLS editorial persona for AI governance, privacy, and digital trust coverage. Articles are produced and reviewed under RECATOOLS editorial supervision.

Corrections policy

Advertisement