
cynative v1.6.0
Agente de IA de solo lectura que consulta tu infraestructura en la nube, código y tiempo de ejecución para revelar configuraciones incorrectas, secretos filtrados y rutas de escalada de privilegios con hallazgos verificados y respaldados por evidencia.

Construye tus propios agentes de seguridad
Framework de código abierto para agentes de seguridad con acceso en vivo y de solo lectura a tu infraestructura.
Inicio rápido · Tu primer agente · Documentación
Pregúntale cualquier cosa a tu infraestructura. Cynative ejecuta modelos de vanguardia en tu código, nube y runtime, razonando a través de GitHub, GitLab, AWS, GCP, Azure y Kubernetes como un solo sistema, y regresa con respuestas verificadas.```bash cynative "what in my cloud is publicly exposed that shouldn't be?"
It writes and runs code in an ephemeral sandbox, querying your APIs in parallel, so one question fans out across your whole stack. Every finding is cross-checked and traced back to its origin.
Unlike coding agents and MCP servers, it's **read-only by construction**: every call is gated and authorized *before* a credential is attached - point it at production with confidence.
<!-- END agent-about -->
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/9087/1b3db179a03479f5951d624c8adbb4890465aa86d038d3312dc9aec9801bcfb9.gif"
alt="cynative auditando una escalada de privilegios de CI a nube"
width="900">
</p>
## Lo que obtienen tus agentes
- **Código a runtime**: Razona a través de AWS, GCP, Azure, cualquier K8s, GitHub y GitLab
- **Sandbox**: Genera y ejecuta código para investigar a escala, sin acceso propio a red ni host
- **Action-gate**: Resuelve cada llamada a sus acciones IAM requeridas y aplica una política de solo lectura antes de adjuntar una credencial
- **Respaldado por evidencia**: Realiza verificaciones cruzadas para confirmar cada hallazgo
- **Soberano**: Un solo binario, tu modelo, tus datos siguen siendo tuyos
## Inicio rápido
Instala y configura un LLM:
<!-- BEGIN quickstart-example -->```bash
brew install cynative/tap/cynative
export CYNATIVE_LLM_PROVIDER=anthropic
export CYNATIVE_LLM_MODEL=claude-opus-5
export ANTHROPIC_API_KEY=...
Recoge las credenciales que ya están en tu shell. Pregúntale lo que quieras:```bash cynative -p "which IAM roles can escalate to admin?" cynative -p "high-risk cloud permissions, trace each to the PR where it was granted" cynative -p "cloud credentials leaked in source code and their current blast radius" cynative "live cloud resources absent from IaC - drift" # starts an interactive session cat findings.json | cynative -p "triage these findings by exploitability"
## Tu primer agente
Un agente es un archivo markdown: una línea de descripción, y luego el prompt. El nombre del archivo es el nombre. Para añadir el tuyo, crea `~/.cynative/agents/` y escribe uno en él. Cynative no crea este directorio por ti:```bash
mkdir -p ~/.cynative/agents
cat > ~/.cynative/agents/aws-public-data-stores.md <<'EOF'
---
description: Finds publicly accessible data stores in an AWS account.
---
Check S3, RDS snapshots, EBS snapshots and public AMIs for exposure.
Report each finding with the resource ARN and how it is reachable.
EOF
cynative -p --agent aws-public-data-stores
Consulta docs/agents.md para conocer el formato.
Ejecutar agentes```bash
cynative -p --agent aws-public-data-stores "AWS account ID 12814983572854 only" # with a task cynative -p --agent aws-public-data-stores # without cynative --agent aws-public-data-stores # seeds an interactive session
`--agent` se combina con `-p`, `--auto-approve`, `--config` y stdin canalizado, por lo que el mismo archivo se ejecuta de forma interactiva mientras lo desarrollas y de forma no interactiva una vez que se estabiliza.
Los agentes se leen de `~/.cynative/agents/` y del conjunto integrado en el binario; un archivo de usuario tiene prioridad sobre uno integrado con el mismo nombre. `cynative agents list` muestra cada agente con su origen y marca las copias ocultas, y `cynative agents show <name>` imprime el archivo exacto que se ejecutaría.
## ¿No puede hacer esto un agente de codificación con MCPs?
| | Agente de codificación + MCPs | Cynative |
|---|---|---|
| Rendimiento | Una acción por llamada | Escribe código en sandbox que distribuye llamadas de forma concurrente: menos tokens, respuestas más rápidas |
| Hallazgos | Salida sin verificar | El verificador contrasta cada hallazgo con evidencia en vivo |
| Solo lectura | Filtro de lectura opcional | Activado por defecto, falla de forma segura: las acciones de IAM requeridas se verifican contra una política de auditoría de seguridad. `secretsmanager:GetSecretValue` es una acción de IAM *Read*: un filtro la permite, `SecurityAudit` la bloquea |
| Credenciales | Ambientales, sin cambios | Sesión STS limitada a solo lectura: AWS también aplica el límite |
| Radio de impacto | Tu shell, cualquier red | El código de investigación se ejecuta en un sandbox sin acceso al host, con la red limitada a tus servicios mapeados |
| Secretos | Enviados al modelo tal cual | Redactados de la salida de la herramienta antes de enviarse al modelo |
| Cadena de suministro | MCPs y habilidades de terceros que se ejecutan con tus credenciales | Un binario de código abierto, conectores integrados |
| Rastro de auditoría | Registros de sesión dispersos, con el mejor esfuerzo | Registro JSONL de fallo seguro de cada llamada a la herramienta: si no puede registrar, se aborta |
Un binario, tu endpoint de modelo, tu cuenta. Ejecútalo en una instancia en la nube que audita, a través de la inferencia gestionada de esa nube, y nada sale de tu entorno: seguridad en tu infraestructura, desde dentro de tu infraestructura.
## Instalación
**Homebrew** (macOS / Linux - recomendado):```bash
brew install cynative/tap/cynative
Script de instalación (macOS / Linux: verifica el SHA-256 de la descarga contra el checksums.txt de la versión, fallando de forma segura):```bash
curl -fsSL https://raw.githubusercontent.com/cynative/cynative/main/install.sh | sh
**Windows** (Scoop):```powershell
scoop bucket add cynative https://github.com/cynative/scoop-bucket
scoop install cynative
Actualización, desinstalación, detalles de Windows, fijación de versiones y descarga manual
Actualización / desinstalación
| Método | Actualización | Desinstalación |
|---|---|---|
| Homebrew | brew upgrade cynative | brew uninstall cynative |
| Script de instalación | volver a ejecutar el one-liner | curl -fsSL https://raw.githubusercontent.com/cynative/cynative/main/install.sh | sh -s -- --uninstall |
| Scoop | scoop update cynative | scoop uninstall cynative |
Windows (script de PowerShell): irm https://raw.githubusercontent.com/cynative/cynative/main/install.ps1 | iex; desinstalar con & ([scriptblock]::Create((irm https://raw.githubusercontent.com/cynative/cynative/main/install.ps1))) -Uninstall.
Opciones del script de instalación: fija una versión con CYNATIVE_VERSION=v1.0.0; cambia el directorio de destino con CYNATIVE_INSTALL_DIR (por defecto ~/.local/bin, sin sudo). El script verifica la atestación de la release de GitHub cuando gh está instalado (advertencia por defecto); establece CYNATIVE_REQUIRE_ATTESTATION=1 para que una verificación fallida sea fatal. Para una instalación de alta integridad, obtén el script desde una etiqueta inmutable en lugar de main.
macOS (manual): descarga cynative_Darwin_arm64.pkg (Apple Silicon) o cynative_Darwin_x86_64.pkg (Intel) desde la página de releases e instala con sudo installer -pkg <file> -target / (o haz doble clic). Estos están firmados, notarizados y sellados - sin aviso de Gatekeeper en el primer arranque. Los archivos sin procesar cynative_Darwin_*.tar.gz permanecen para scripting/CI; el primer lanzamiento de GUI de un binario de tarball en cuarentena necesita internet para la verificación de notarización en línea (el uso desde terminal/install.sh/Homebrew no se ve afectado).
Linux / Windows (manual): descarga un binario precompilado y checksums.txt desde la página de releases, verifica el SHA-256 y coloca el binario en tu PATH. Binario estático único, sin dependencias.
Verificar una firma de release (opcional). Las nuevas releases incluyen checksums.txt.sigstore.json, un paquete de Sigstore que firma checksums.txt con un certificado sin clave vinculado al flujo de trabajo de release de este repositorio. Autentica el manifiesto y luego verifica tu archivo contra él:```bash
cosign verify-blob checksums.txt
--bundle checksums.txt.sigstore.json
--certificate-identity "https://github.com/cynative/cynative/.github/workflows/release.yaml@refs/heads/main"
--certificate-oidc-issuer "https://token.actions.githubusercontent.com"
grep cynative_Linux_x86_64.tar.gz checksums.txt | sha256sum -c - # Linux grep cynative_Darwin_arm64.tar.gz checksums.txt | shasum -a 256 -c - # macOS
```powershell
(Get-FileHash .\cynative_Windows_x86_64.zip -Algorithm SHA256).Hash.ToLower()
Select-String -Path checksums.txt -Pattern cynative_Windows_x86_64.zip
Esto cubre los archivos nombrados en checksums.txt. Los instaladores .pkg están firmados con Developer ID, notarizados y sellados en su lugar, y cada activo está además cubierto por la atestación de la versión de GitHub (gh release verify <tag>). Dos límites que vale la pena conocer: cosign obtiene la raíz de confianza de Sigstore a través de la red a menos que pases --trusted-root, y debido a que los nombres de archivo no llevan versión, la firma prueba el origen y la integridad, pero no de qué versión proviene un conjunto suelto de archivos: la URL de la versión o gh release verify es lo que vincula una versión.
Proveedores de LLM
Cynative se comunica con los LLM a través del Bifrost SDK integrado y admite casi cualquier proveedor de IA listo para usar (OpenAI, Anthropic, Azure OpenAI, Amazon Bedrock, Google Vertex/Gemini, Cohere, Mistral, Groq, Ollama, vLLM y más). Elige uno de docs/providers/README.md y sigue la guía de ese proveedor.
Ejemplos rápidos
```bash # Google Vertex export CYNATIVE_LLM_PROVIDER=vertex export CYNATIVE_LLM_MODEL=gemini-3.1-pro-preview export CYNATIVE_LLM_VERTEX_PROJECT_ID=my-gcp-project export CYNATIVE_LLM_VERTEX_REGION=global # CI / no gcloud: export GOOGLE_APPLICATION_CREDENTIALS=/path/to/sa.jsonOpenAI
export CYNATIVE_LLM_PROVIDER=openai export CYNATIVE_LLM_MODEL=gpt-5.6-sol export OPENAI_API_KEY=sk-...
Amazon Bedrock - AWS credential chain
export CYNATIVE_LLM_PROVIDER=bedrock export CYNATIVE_LLM_MODEL=anthropic.claude-opus-5 export CYNATIVE_LLM_BEDROCK_REGION=us-east-1
Azure OpenAI - endpoint via env, no YAML needed
export CYNATIVE_LLM_PROVIDER=azure export CYNATIVE_LLM_MODEL=my-gpt-5.6-sol export AZURE_OPENAI_API_KEY=... export CYNATIVE_LLM_AZURE_ENDPOINT=https://my-resource.openai.azure.com
Local Ollama
export CYNATIVE_LLM_PROVIDER=ollama export CYNATIVE_LLM_MODEL=nemotron-cascade-2 export CYNATIVE_LLM_OLLAMA_URL=http://localhost:11434
</details>
<details>
<summary><strong>YAML avanzado</strong></summary>
Para el balanceo de carga con múltiples claves, comportamiento de reintento personalizado, configuración de proxy,
o cualquier otra función de Bifrost, escribe un archivo YAML:```yaml
llm:
provider: openai
model: gpt-5.5
api_key: env.OPENAI_API_KEY
network_config: # common fields shown; see schemas.NetworkConfig for the full set
base_url: https://my-proxy.example.com/v1
default_request_timeout_in_seconds: 60
max_retries: 3
extra_headers:
x-tenant: prod
Véase docs/providers/ para la referencia de configuración de cada proveedor compatible.
Sesiones y aprobaciones
cynative abre una sesión interactiva (edición completa de línea e historial con las teclas de flecha); cynative "tarea" ejecuta la tarea y luego permanece interactivo; -p / --print ejecuta una única tarea de forma no interactiva y sale - para scripts y tuberías (p. ej. cat main.tf | cynative -p "revisa este Terraform en busca de configuraciones incorrectas"). El código de salida transmite el veredicto para scripts: 0 cuando se generó un informe, 2 cuando la ejecución terminó sin una respuesta (el aviso indica el motivo - presupuesto de iteraciones o tokens, una respuesta del modelo vacía o filtrada), 130 en interrupción, 143 en SIGTERM, y 1 para cualquier otro fallo.
Cynative llama a tu stack usando las credenciales que ya están en tu shell - no mantiene un almacén de credenciales separado. Proporciona siempre la credencial de solo lectura con mínimos privilegios necesaria.
Aprobaciones: cada llamada a una herramienta espera una sola pulsación de tecla: y la ejecuta una vez, a autoriza todas las llamadas posteriores a esa herramienta para la sesión (los scripts aún se imprimen antes de ejecutarse), cualquier otra tecla la deniega. Sin terminal de control, usa --auto-approve.
Detención a mitad de tarea: mientras una tarea se está ejecutando, pulsa Esc o Ctrl-C una vez para detenerla de forma controlada (el agente termina cualquier llamada ya en curso, luego se detiene e imprime ⏸ Detenido). Cuando el agente encuentra errores o rechazos repetidos de herramientas, se detiene automáticamente, resume en qué está bloqueado y pide la información que falta.
Completado de Bash: Consulta cynative completion <shell> --help para las notas completas de instalación de cada shell.
Cynative imprime un pie de página operativo breve (tiempos, uso de tokens) en stderr - redirigir stdout (cynative -p "..." > out.txt) mantiene la respuesta capturada limpia. --version imprime la versión, el commit, la fecha de compilación, la versión de Go y la plataforma.
cynative doctor valida la configuración y la disponibilidad de los conectores sin iniciar una sesión de investigación. Pasa --live-llm para también sondear el modelo configurado con un viaje de ida y vuelta sin herramientas.
Controles de recursos y costes para ejecuciones desatendidas
Controles de recursos y costes: para ejecuciones desatendidas, programadas o de horizonte largo - integradas en cron, CI o cualquier disparador - acota el trabajo explícitamente. Los controles clave (claves de configuración / variables de entorno):
| Clave de configuración / variable de entorno | Predeterminado | Efecto |
|---|---|---|
max_total_tokensCYNATIVE_MAX_TOTAL_TOKENS | 0 (sin límite) | Tope de tokens por sesión, compartido entre el bucle principal, los subagentes de tareas, el verificador siempre activo y los seguimientos interactivos. |
max_iterationsCYNATIVE_MAX_ITERATIONS | 32 | Máximo de iteraciones de llamadas a herramientas del bucle principal por turno. |
max_subagent_iterationsCYNATIVE_MAX_SUBAGENT_ITERATIONS | 10 | Máximo de iteraciones dentro de un subagente de tareas. |
max_consecutive_failuresCYNATIVE_MAX_CONSECUTIVE_FAILURES | 5 | Llamadas a herramientas consecutivas sin progreso antes de detenerse y resumir (0 lo desactiva). |
sandbox_max_concurrencyCYNATIVE_SANDBOX_MAX_CONCURRENCY | 16 | Máximo de llamadas a herramientas concurrentes dentro del sandbox. |
La verificación de hallazgos (herramienta verify_findings) realiza llamadas adicionales al modelo - presupuesta para ellas en cualquier ejecución que produzca hallazgos.
Conectores
Además de las credenciales en tu shell, Cynative impone solo lectura en tres capas:
- Red - cada host de solicitud está fijado a su servicio y región mapeados y la IP resuelta se verifica antes de conectar - tu agente puede alcanzar tu infraestructura y nada más.
- Puerta de acciones - cada operación se resuelve a sus acciones IAM requeridas,
derivadas de las definiciones de API de los propios proveedores, y luego se autoriza mediante una
política de solo lectura antes de adjuntar cualquier credencial:
SecurityAudit(AWS),roles/viewer(GCP),Reader(Azure). La cobertura sigue las APIs de la nube a medida que crecen, y la puerta falla de forma segura ante cualquier cosa que clasifique como escritura. Para Kubernetes, la política es el propio rol RBACviewen vivo del clúster, obtenido en tiempo de ejecución y aplicado por solicitud. GitHub y GitLab son de solo lectura por defecto; un ajusteconnectors.{github,gitlab}.permissionspuede permitir escritura en categorías específicas donde un flujo de trabajo lo necesite, aplicado por solicitud antes de adjuntar el token. Incluso en modo de solo lectura, los endpoints de escaneo de secretos de GitHub permanecen bloqueados y la API GraphQL de GitLab está denegada. - Credencial (AWS) - para identidades de roles asumidos, las credenciales se re-emiten
mediante STS
AssumeRole, limitadas a una política gestionada (SecurityAuditpor defecto), de modo que AWS IAM también aplica el límite. Las identidades de usuario IAM y raíz se ejecutan con sus credenciales base, controladas por la puerta de acciones anterior.
Cynative se conecta a AWS, GCP, Azure, EKS/GKE/AKS, Kubernetes autogestionado, GitHub y GitLab. Consulta docs/connectors/README.md para el descubrimiento de credenciales, el endurecimiento, las limitaciones y los ejemplos específicos de cada conector.
Ejecución de código y orquestación de herramientas
Para trabajo masivo - "revisa cada bucket S3 público", "lista los clústeres EKS en cada
región" - Cynative puede escribir y ejecutar JavaScript en un sandbox en lugar de emitir
una llamada a herramienta a la vez. Las herramientas del agente (p. ej. http_request) se exponen como
funciones JavaScript async, de modo que itera, filtra y encadena llamadas en
código - y ejecuta llamadas independientes de forma concurrente con el ayudante integrado
mapConcurrent(items, fn, limit) (o await Promise.all([...]) para
conjuntos fijos pequeños).
Solo lo que el script registra con console.log regresa al modelo, manteniendo la investigación
rápida y eficiente en tokens.```js
// Discover regions, then list EKS clusters in every region concurrently,
// following pagination - only the summary returns to the model.
const r = await http_request({
method: "GET",
url: "https://ec2.us-east-1.amazonaws.com/?Action=DescribeRegions&Version=2016-11-15",
auth_provider: "aws", aws_auth: { service: "ec2", region: "us-east-1" },
});
const regions = [...r.body.matchAll(/([^<]+)</regionName>/g)].map((m) => m[1]);
const all = await mapConcurrent(regions, async (region) => {
const clusters = [];
let token = null;
do {
const url = https://eks.${region}.amazonaws.com/clusters +
(token ? ?nextToken=${encodeURIComponent(token)} : "");
const resp = await http_request({
method: "GET", url,
auth_provider: "aws", aws_auth: { service: "eks", region },
});
const body = JSON.parse(resp.body);
clusters.push(...body.clusters);
token = body.nextToken;
} while (token);
return { region, clusters };
});
console.log(JSON.stringify(all.filter((x) => x.clusters.length > 0), null, 2));
- **Async y concurrente**: las funciones de las herramientas devuelven Promesas - usa `await` con ellas, distribúyelas
sobre muchos recursos con `mapConcurrent(items, fn, limit)` (acotado,
preservando el orden), o usa `await Promise.all([...])` para conjuntos fijos pequeños.
- **Respuestas estructuradas**: `http_request` se resuelve a `{ status, statusText,
headers, body }`; `body` es la cadena cruda - `JSON.parse(resp.body)` para APIs
JSON o léela directamente para XML.
- **Aislado**: un script solo puede llamar a las herramientas que Cynative expone - no tiene
acceso de red ni al host por sí mismo.
- **Ves el script completo**: cada llamada a `code_execution` se muestra completa para
aprobación antes de ejecutarse (omítelo con `--auto-approve`; transmite cada llamada interna
con `-v`).
- **Con estado dentro de una sesión**: los valores guardados en `globalThis` persisten entre
llamadas durante una sesión interactiva, siempre que la llamada se ejecute hasta completarse
(una que agote el tiempo o quede suspendida los restablece); los `let`/`const`/`var`/`function`
de nivel superior están limitados a una sola llamada.
- **Acotado**: los scripts se ejecutan bajo un tiempo límite (120s por defecto) y un tamaño de
salida máximo.
## Registro de auditoría
Cada llamada a una herramienta se registra en un registro de auditoría JSONL persistente (`~/.cynative/audit.log`, activado por defecto). El registro es de cierre ante fallos: si una llamada no puede registrarse, la ejecución se aborta. Cada entrada de una ejecución de agente también registra el nombre del agente, la fuente y el resumen del archivo, de modo que un hallazgo pueda rastrearse hasta el prompt exacto que lo produjo.
Los resultados de las herramientas se redactan antes de escribirse, pero los argumentos del prompt de aprobación se almacenan textualmente: el registro puede contener valores sensibles. Solo puede leerlo el usuario que ejecutó Cynative. La rotación y retención son configurables.
Configúralo bajo `audit:` en `~/.cynative/config.yaml`, o mediante variables de entorno:
| Clave | Env | Predeterminado |
|---|---|---|
| `audit.enabled` | `CYNATIVE_AUDIT_ENABLED` | `true` |
| `audit.path` | `CYNATIVE_AUDIT_PATH` | `~/.cynative/audit.log` |
| `audit.max_size_mb` | `CYNATIVE_AUDIT_MAX_SIZE_MB` | `100` |
| `audit.retention_days` | `CYNATIVE_AUDIT_RETENTION_DAYS` | `30` |
| `audit.compress` | `CYNATIVE_AUDIT_COMPRESS` | `false` |
## Preguntas y comentarios
[Discussions](https://github.com/cynative/cynative/discussions) es el mejor lugar para compartir tus comentarios: a qué lo apuntaste, qué devolvió y qué falta. Las estrellas ayudan a que la gente encuentre el proyecto.
## Contribuciones
Las contribuciones son bienvenidas: nuevos agentes, conectores, conjuntos de datos de evaluación y
mejoras en general. Consulta [CONTRIBUTING.md](https://github.com/cynative/cynative/blob/main/CONTRIBUTING.md) para la configuración de
desarrollo, la compuerta `make check` y las convenciones de PR, y [SECURITY.md](https://github.com/cynative/cynative/blob/main/SECURITY.md)
para reportar vulnerabilidades.
## Licencia
Licencia Apache-2.0. Consulta [LICENSE](https://github.com/cynative/cynative/blob/main/LICENSE) para el texto completo.