Unos 170 repositorios privados salieron de la organización de GitHub de una empresa de seguridad en nueve minutos de un viernes de mayo. Nadie lo vio. Ni ella, ni GitHub. El aviso llegó 117 días después, desde un foro criminal y un sitio francés que lo vigilaba.

Su portada promete saber qué IPs te están atacando.

Hoy la sigue prometiendo.


La promesa de la portada

Lo dice arriba de todo: "We Know the IPs Attacking You — Do You?". Debajo, las cifras: más de 250.000 instalaciones activas, más de 40 millones de señales diarias, y entre siete y sesenta días de ventaja sobre el resto del mercado al poblar sus listas de bloqueo.

El modelo es bueno. Miles de servidores leen sus propios registros, reportan lo que los golpea, y un consenso decide qué dirección entra a la lista compartida. Ninguno ve el ataque entero; todos ven un pedazo. CrowdSec vende la suma: un negocio de saber quién te ataca.

El 16 de septiembre, a las 17:45, alguien publicó en un foro criminal un archivo con más de 300 repositorios de esa organización — más de 130 ya públicos por diseño. Fuites Infos, el sitio francés que vigila esos foros, midió unos 3,4 GB de código no público y avisó. A las 20:00 había célula de crisis.


Nueve minutos de un viernes de mayo

Lo que encontraron no era de septiembre.

El informe forense fecha el robo al segundo: "May 22nd, 2026 – 05:52:29 until 06:01:33 UTC". Nueve minutos — la resta es nuestra, los dos extremos son suyos. En esa ventana se descargaron unos 170 repositorios privados desde una dirección en Toronto, con la máquina en UTC-4.

Adentro iban la consola comercial, rutinas de AWS, conectores, ciencia de datos. Y el algoritmo de consenso: ahora se sabe cuántos testigos necesita la máquina que declara culpable a una dirección.

Que la copia era de mayo lo prueba el archivo: contiene un repositorio destruido el 27 de mayo. La reivindicación de septiembre la vendía como fresca.

La puerta apareció cuando GitHub les entregó la actividad de git de esas dos horas: la cuenta de un desarrollador que acababa de irse y seguía en la organización. El porqué lo escribieron ellos: "We kept them alive because we parted on good terms with our developer, and he wanted to finalize some work." The Hacker News lo resumió sin anestesia: "The French security company had kept his GitHub access open."

La cuenta se usó solo para clonar: ni un commit, ni un cambio en el código.


Un token que nació, vivió y murió

El análisis forense se lo regaló el ladrón: el archivo traía el .git/config con el origen usado para clonar: url = https://oauth2:gho_xxxxxxxxx@github.com/crowdsecurity/.github.git. El prefijo gho_ dice OAuth y la suma de verificación cuadra.

Fueron a buscarlo a su registro de auditoría, y al de cada miembro actual de la organización. Nada. "This was a dead end."

No fue descuido. Es una lista de precios: "GitHub's audit log only tracks specific actions, and only enterprise plans (which we're not on) keep git activity on a rolling 7-day window."

Léelo despacio. El registro que habría mostrado 170 repositorios saliendo por la puerta en nueve minutos existe, funciona, y es una viñeta de un plan más caro. La cámara está instalada. La grabación se alquila por mes. ¿Cuánto cuesta enterarse?

La frase que explica los 117 días la escribieron ellos: "So it was created, lived, and died without leaving us any traces beyond its usage."

Donde sí tenían ojos era en AWS, y ahí quedó la huella: el 17 de agosto alguien probó un secreto del volcado contra un rol que solo podía publicar en un tema de SNS. No pasó de ahí.

La única visibilidad que funcionó cuidaba lo que no se llevaron.


Dos versiones en veinticuatro horas

El 17 de septiembre, el primer comunicado apuntaba hacia adentro —un componente de TanStack usado en su organización, "backdoored to extract an API key with authorization to read the private codebase"— y era categórico con el resto: "No client data, login/password, name, organization, or anything else was leaked."

A las 18:00 de ese día, GitHub les entregó el ciclo de vida completo del token. El informe del 18 reescribe el relato: ningún paquete malicioso en sus repositorios —aunque la revisión, admiten, "was inconclusive"—, un token OAuth de la cuenta del ex-empleado, la máquina infectada fuera de la empresa. Y sí hubo datos personales: 83 correos de usuarios, y nombres, correos y contexto de inversión de 51 inversores potenciales de 2020. Fuites Infos sumó y tituló: 134 personas expuestas. La única disculpa personal es para los inversores: "for this I personally apologize."

No es la prensa desmintiendo a nadie: es una empresa corrigiéndose sola en veinticuatro horas, con datos que solo GitHub tenía. Lo que sobrevive a las dos versiones es el eslabón TanStack, y CrowdSec no lo prueba, lo hereda: "They traced the token's full lifecycle and confirmed our initial suspicions about TanStack." Nadie dijo qué paquete llegó al portátil, ni cuándo. Y ninguno de los dos textos les pide nada a los usuarios.


El eslabón de arriba

El 11 de mayo, alguien publicó 84 versiones maliciosas en 42 paquetes @tanstack/* (CVE-2026-45321, CVSS 9,6) sin robar una sola credencial de npm: el gusano le sacó el token OIDC a la memoria del proceso de compilación y publicó con identidad legítima y atestaciones SLSA Build Level 3 válidas. Orca lo dice sin rodeos: "provenance alone is not a reliable safety signal" — la misma lección que ya pagamos con el gusano de keyv. ¿Qué certifica una firma así?

Esa ola se llevó los SDK de Mistral AI y dos dispositivos de empleados de OpenAI, y en PyPI guardrails-ai. El gusano persiste en .claude/ y firma sus commits de buzón muerto como claude@users.noreply.github.com.

En marzo mapeamos a ese mismo grupo con una tesis: la industria que vende seguridad de la cadena de suministro no puede proteger la suya. Ahí escribimos que algunas organizaciones ni saben que fueron comprometidas. CrowdSec fue una durante 117 días: del 22 de mayo al 16 de septiembre.

Y al cerrar litellm-paila dijimos que el próximo ataque iba a vivir en tu clúster "tres meses antes de que alguien haga la pregunta correcta". Nos quedamos cortos: aquí nadie hizo la pregunta. La respuesta llegó sola, desde un foro.


Los controles que sí tenían

El informe lista lo que ya hacían antes: separación estricta de privilegios, doble factor con llaves físicas, monitoreo de la edad de los paquetes de npm. Y una viñeta sobre las credenciales del que se va: "removing (or knowing why you kept) all access once they are gone matters even more."

Eso lo escribieron ellos. En la lista de lo que ya hacían. En el informe sobre una cuenta que dejaron abierta. ¿Cuántas siguen vivas hoy por la misma razón?

Quedaron PAILA por buena gente.

Luego, la pregunta honesta del texto: "Yet, all of this couldn't prevent a Supply Chain Attack, so what could have?". La respuesta —protección en los equipos de los desarrolladores— trae su propio agujero: "because the employee had already left the company, the likelihood that he still had endpoint protection on his machine was low."

La medida no alcanza al portátil que causó el incidente. Ese portátil ya no lo controlaban.

El balance celebra la "prompt revocation of the departed employee's core access": la del 25 de mayo, tres días después de los nueve minutos. Las 48 horas de respuesta que el informe se anota se cuentan desde el 16 de septiembre; desde el 22 de mayo, el reloj marca 117 días. La portada sigue prometiendo siete a sesenta días de ventaja. Miden cosas distintas, en el mismo folleto.

El director ejecutivo tampoco lo escondió: reprodujo en su informe la burla que recibió, "They claim to know who attacks us but cannot avoid them attacking themselves". En Hacker News corría la misma idea.


Atribución

Perpetrador: CrowdSec lo nombra por alias y marca ella misma el límite: "one of the founders of BreachForum and a member, diencracked ... At least that's what the Git data shows." Arriba, en la cadena, TeamPCP: ese mismo 22 de mayo se atribuyó el hackeo de repositorios de Mistral AI.

Cómplices: la cortesía. Una cuenta que siguió viva porque se separaron en buenos términos y quedaba trabajo por cerrar: una decisión razonable, de gente razonable, que dejó una llave maestra colgada de la puerta. Y una industria que lee una atestación válida como señal de seguridad.

Falla sistémica: el modelo de visibilidad de GitHub. La actividad de git se guarda siete días, y solo para quien paga el plan Enterprise. Debajo de esa línea, clonar una organización privada entera no deja registro que su dueño pueda leer. No es un fallo: es el producto. Lo raro no es que a CrowdSec le pasara — es cuántos podrían siquiera enterarse.


CrowdSec buscó el token en su registro de auditoría y no encontró nada. Lo que faltaba estaba en el archivo que alguien subió a un foro criminal: la URL con el token y la hora para ir a pedirle a GitHub el resto. La bitácora de esos nueve minutos la escribió el ladrón, y tardó 117 días en llegarle a la víctima.

¿Cuántas empresas creen hoy que no les pasó nada, y solo están esperando a que alguien publique el archivo?